在 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中,模块名称可以与类名相同吗?

如何在 composer 上使用 Zend Framework 2 的开发分支?

Zend Framework 2和PHP 7

如何在Zend Framework 2中访问路由,发布,获取等参数