在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件
Posted
技术标签:
【中文标题】在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件【英文标题】:Creating HTML E-mails in Zend Framework 2 with Zend_Mail + Zend_Mime 【发布时间】:2012-10-07 01:56:32 【问题描述】:Zend 框架更改了 Zend_Mail 对象,因此它不再具有用于创建 html 电子邮件的 setBodyHtml() 方法。
有人知道如何使用 ZF2 Mail 组件创建 HTML 电子邮件吗?到目前为止,我已经尝试过:
$html = new \Zend\Mime\Part($htmlText);
$html->type = \Zend\Mime\Mime::TYPE_HTML;
$html->disposition = \Zend\Mime\Mime::DISPOSITION_INLINE;
$html->encoding = \Zend\Mime\Mime::ENCODING_QUOTEDPRINTABLE;
$html->charset = 'iso-8859-1';
$body = new \Zend\Mime\Message();
$body->addPart($html);
$message = new \Zend\Mail\Message();
$message->setBody($body);
$message->addTo('myemail@com.com', 'User1');
$message->addFrom('myemail@com.com', 'User2');
$message->setSubject('Test');
生成的电子邮件是:
MIME 版本:1.0
内容类型:文本/html;字符集=iso-8859-1
Content-Transfer-Encoding:quoted-printable
内容处置:内联
发件人:XYZ
上个月日志文件报告=0A=09=09=09=0A=09=
=>09=09=0A=09=09=09测试=0A =09=09=09=0A=09=09=09
l>
【问题讨论】:
【参考方案1】:我发现 \Zend\Mail\Header 组件存在问题。
我正在使用基于 linux 的机器来托管我的 php 机器,这意味着电子邮件中的每个标题行都应该只附加“\r”。对于 Windows,它是“\r\n”。
\Zend\Mail\Header 文件中的常量 EOL 设置为“\r\n”,如果从 linux 机器发送,则所有标题都会出现在电子邮件中。
这里的最佳做法是使用 PHP_EOL 常量,它会自动检测平台并使用正确的行尾代码。
解决这个问题:
您需要更新您的\Zend\Mail\Header EOL 常量以等于PHP_EOL。此外,如果使用 UTF-8,您必须确保它是在您的消息中调用的最后一件事。必须在body设置好之后再做。
我投了一张ZF2 2.0团队的票去看看
这是一个工作示例:
$html = '' //my html string here
$m = new \Zend\Mail\Message();
$m->addFrom('joe@me.com', 'Joe Schmo')
->addTo('ally@me.com', 'Ally Joe')
->setSubject('Test');
$bodyPart = new \Zend\Mime\Message();
$bodyMessage = new \Zend\Mime\Part($html);
$bodyMessage->type = 'text/html';
$bodyPart->setParts(array($bodyMessage));
$m->setBody($bodyPart);
$m->setEncoding('UTF-8');
//send your message now
【讨论】:
我找了你的票,我想是这样的:github.com/zendframework/zf2/issues/2806 如果是这样,它已被关闭为“无法修复”。 ZF 人员说这个问题是由服务器上的邮件传输功能不正常引起的,并且使用 PHP_EOL 并不能在所有情况下都解决这个问题。如果这是正确的,您确实不想尝试使用此修复程序自己修补 ZF。 这个答案是错误的!不要使用 PHP_EOL 常量! 为什么要在 ...part 命名变量中实例化 Message 类型对象,在 ...message 命名变量中实例化 Part 类型对象?它增加了混乱。【参考方案2】:use Zend\Mail;
use Zend\Mime\Message as MimeMessage;
use Zend\Mime\Part as MimePart;
$body = 'email body';
$htmlPart = new MimePart($body);
$htmlPart->type = "text/html";
$textPart = new MimePart($body);
$textPart->type = "text/plain";
$body = new MimeMessage();
$body->setParts(array($textPart, $htmlPart));
$message = new Mail\Message();
$message->setFrom($from);
$message->addTo($to);
$message->addReplyTo($reply);
if ($cc)
$message->addCc($cc);
if ($bcc)
$message->addBcc($bcc);
$message->setSender($sender);
$message->setSubject($subject);
$message->setEncoding("UTF-8");
$message->setBody($body);
$message->getHeaders()->get('content-type')->setType('multipart/alternative');
$transport = new Mail\Transport\Sendmail();
$transport->send($message);
希望对你有帮助
【讨论】:
【参考方案3】:我建议阅读this blog。
基本上你不再有setBodyHtml()
,你只有setBody()
。这是由于现代电子邮件阅读器的工作方式。每个读者都可以选择同时显示两者。现在大多数电子邮件都是以 HTML 格式发送的。但是您仍然可以将 HTML 电子邮件视为纯文本,因为 HTML 部分只是由相应的程序“翻译”。
在 ZF2 中,要支持 HTML 电子邮件和纯文本电子邮件,您只需添加两种 mime 类型。当需要纯文本时,电子邮件程序将处理此问题。至少这是我理解 ZF2 和提到的博客中的当前事物的方式。
【讨论】:
我尝试了教程部分并使用了创建 HTML 电子邮件的代码,但即使标题正确,我的 HTML 电子邮件仍显示为纯文本。想法? 自己没试过,不好意思,只是参考和解释了一下自己的理解。 sam - 请参阅下面的答案。原来 Zend_Mail 组件没有正确地为基于 Linux 的机器创建标题。 - 至少这是我在更详细地观察事物后的观察结果。【参考方案4】:查看以下帖子:https://***.com/a/34267509/5448467
WasabiMail 是一个邮件模块,能够以方便的方式处理 html-email 模板。
【讨论】:
以上是关于在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Zend Framework 2使用Rest API
如何在 Zend Framework 2 中为局部使用共享视图脚本路径?
在Zend Framework 2或3中,模块名称可以与类名相同吗?