【问题标题】:Creating HTML E-mails in Zend Framework 2 with Zend_Mail + Zend_Mime在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件
【发布时间】: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>

【问题讨论】:

    标签: php zend-framework2 html-email zend-mail


    【解决方案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://stackoverflow.com/a/34267509/5448467

      WasabiMail 是一个邮件模块,能够以方便的方式处理 html-email 模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多