gpt4 book ai didi

php - 在 ZF2 中发送带有附件的电子邮件

转载 作者:可可西里 更新时间:2023-11-01 12:49:09 25 4
gpt4 key购买 nike

如何在 zf2 中发送带有 text/plain、text/html 和附件的电子邮件?我使用此代码通过 smtp 发送电子邮件:

$files = $this->params()->fromFiles();
$smtp = new \Zend\Mail\Transport\Smtp();
$smtp->setAutoDisconnect(true);
$optn = new \Zend\Mail\Transport\SmtpOptions(array(
'host' => 'mail.myserver.com',
'connection_class' => 'login',
'connection_config' => array(
'username' => 'user@myserver.com',
'password' => 'mypassword',
),
));
$smtp->setOptions($optn);


$htmlPart = new \Zend\Mime\Part('<p>some html</p>');
$htmlPart->type = Mime::TYPE_HTML;

$textPart = new \Zend\Mime\Part('some text');
$textPart->type = Mime::TYPE_TEXT;

$i=0;
$attaches = array();
foreach($files as $file){
if ($file['error'])
continue;
$attaches[$i] = new \Zend\Mime\Part(file_get_contents($file['tmp_name']));
$attaches[$i]->type = $file['type'].'; name="'.$file['name'].'"';
$attaches[$i]->encoding = 'base64';
$attaches[$i]->disposition = 'attachment';
$attaches[$i]->filename = $file['name'];
$i++;
}

$parts = array();
if (count($attaches)>0) {
$parts = array_merge(array($textPart,$htmlPart),$attaches);
$type = Mime::MULTIPART_MIXED;
}
else{
$parts = array($textPart, $htmlPart);
$type = Mime::MULTIPART_ALTERNATIVE ;
}
$body = new \Zend\Mime\Message();
$body->setParts($parts);

$message = new \Zend\Mail\Message();
$message->setFrom('user@myserver.com');
$message->addTo('receiver@myserver.com');
$message->setSubject('subject');
$message->setEncoding("UTF-8");
$message->setBody($body);
$message->getHeaders()->get('content-type')->setType($type);

$smtp->send($message);

如果我附加文件,它会发送文件和内容,但它会在接收者收件箱中同时显示纯文本和 html 文本:

<p>some html</p>
some text

当我不附加任何文件时,它会单独显示 html 文本:

some html

有什么帮助吗?

最佳答案

目前在 ZF2 (2.2) 中没有简单的方法将多部分/替代正文(对于不能/不想使用 html 的客户端的 html 和文本替代)与附件组合。如果您将“multipart/alternative”内容类型 header 添加到整个邮件,在某些电子邮件客户端中将不会显示附件(链接)。

解决方案是将消息一分为二,正文(文本和 html)和附件:

http://jw-dev.blogspot.com.es/2013/01/zf2-zend-mail-multipartalternative-and.html

一个例子:

        $content  = new MimeMessage();
$htmlPart = new MimePart("<html><body><p>Sorry,</p><p>I'm going to be late today!</p></body></html>");
$htmlPart->type = 'text/html';
$textPart = new MimePart("Sorry, I'm going to be late today!");
$textPart->type = 'text/plain';
$content->setParts(array($textPart, $htmlPart));

$contentPart = new MimePart($content->generateMessage());
$contentPart->type = 'multipart/alternative;' . PHP_EOL . ' boundary="' . $content->getMime()->boundary() . '"';

$attachment = new MimePart(fopen('/path/to/test.pdf', 'r'));
$attachment->type = 'application/pdf';
$attachment->encoding = Mime::ENCODING_BASE64;
$attachment->disposition = Mime::DISPOSITION_ATTACHMENT;

$body = new MimeMessage();
$body->setParts(array($contentPart, $attachment));

$message = new Message();
$message->setEncoding('utf-8')
->addTo('mywife@home.com')
->addFrom('myself@office.com')
->setSubject('will be late')
->setBody($body);

$transport = new SmtpTransport();
$options = new SmtpOptions($transportConfig),
));

$transport->setOptions($options);
$transport->send($message);

对于以上内容,您需要以下 use 语句:

use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
use Zend\Mime\Mime;
use Zend\Mime\Part as MimePart;
use Zend\Mime\Message as MimeMessage;

ZF1 在 Zend_Mail_Transport_Abstract 中有一个 _buildBody() 方法,它会自动执行此操作。

关于php - 在 ZF2 中发送带有附件的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17066078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com