Zend Framework 2 发送电子邮件模板

Posted

技术标签:

【中文标题】Zend Framework 2 发送电子邮件模板【英文标题】:Zend Framework 2 send email template 【发布时间】:2014-03-03 20:44:07 【问题描述】:

我正在尝试发送电子邮件模板以在注册时进行电子邮件确认。邮件已发送,我可以收到,但我可以在电子邮件中看到 html 代码,而不是按钮和其他元素... 我的Mailer class is shown in jsfiddle,我不知道如何以不同的方式发布它。

我发送电子邮件的功能如下:

public function sendConfirmationMail($user) 

    $urlPlugin = $this->getServiceLocator()->get('url_plugin');
    $mailer = $this->getServiceLocator()->get('mailer');
    $mailer->getMessage()
           ->addTo($user->getContactEmail())
           ->setSubject($this->getServiceLocator()->get('translator')->translate('Confirmation'));
    $mailer->sendMessage('user/user/mail/confirm', 
        array(
            'user' => $user->getName(),
            'confirm_url' => \App\Application::getBaseUrl() . $urlPlugin->fromRoute('user_confirm_rs', array()) . '?code=' . md5($user->getId() . '@' . $user->getConfirmcode()),
            'valid_until' => $user->getConfirmationValidUntil()
        ));

【问题讨论】:

您是否为电子邮件设置了 MIME 类型? 看看这篇好文章:zjhzxhz.com/2014/10/… 【参考方案1】:

ZF2 也是如此。 一切都在文档中:http://framework.zend.com/manual/2.2/en/modules/zend.mail.message.html

有时您可能想要提供 HTML 内容或多部分内容。 为此,您将首先创建一个 MIME 消息对象,然后设置它 作为邮件消息对象的正文。当你这样做时,消息 类将自动设置一个“MIME-Version”标头,以及一个 适当的“Content-Type”标头。

use Zend\Mail\Message;
use Zend\Mime\Message as MimeMessage;
use Zend\Mime\Part as MimePart;

$text = new MimePart($textContent);
$text->type = "text/plain";

$html = new MimePart($htmlMarkup);
$html->type = "text/html";

$image = new MimePart(fopen($pathToImage, 'r'));
$image->type = "image/jpeg";

$body = new MimeMessage();
$body->setParts(array($text, $html, $image));

$message = new Message();
$message->setBody($body);

【讨论】:

感谢您的回答。我怎样才能把它放在我的邮件类中? @user2406735 就像在这里完成的一样。你的邮件类中确实有一个Message 对象,你需要做的就是现在在MimePartMimeMessage 的东西中工作;)【参考方案2】:

未测试,但类似这样:

public function sendMessage($messageTemplate, $data = array()) 
        $messageView = new ViewModel($data);
        $messageView->setTemplate($messageTemplate);
        $messageView->setTerminal(true);
        $config = \App\Application::getInstance()->getConfig();
        $html = $this->getMessageBodyRenderer()
           ->setResolver(new \Zend\View\Resolver\TemplatePathStack(array(
                'script_paths' => $config['view_manager']['template_path_stack']
           ));
        $htmlPart = new MimePart($html);
        $htmlPart->type = "text/html";
        $body = new MimeMessage();
        $body->setParts(array($html));
        $this->message->setBody($body);
        if ($this->message instanceof Message) 
            $this->getTransportEngine()->send($this->message);
         else 
            throw new \Exception("Invalid message object. First create new message then send.");
        

【讨论】:

谢谢,但这显示了一个错误“没有活动的交易。”。我用的是学说,会不会和它有关? 毫无疑问。 Zend\Mail 与事务无关。 ;) 你知道它是什么吗?和 Mime 有关系吗? 可能是在未启动事务的情况下提交或回滚。 您谈到了注册,因此您尝试将用户存储在数据库中。这应该发生在这里。【参考方案3】:

您需要正确设置标题。我不确定 Zend Framework,从未使用过它,但这里有一个使用 php mail() function 的示例:

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

前两个标题将电子邮件设置为 html,而不是文本

【讨论】:

以上是关于Zend Framework 2 发送电子邮件模板的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework:存储电子邮件模板的位置

使用 Zend Framework 和 PHP 发送电子邮件

从 Zend Framework 应用程序向数百个收件人发送电子邮件的最佳方法是啥?

如何创建队列系统以在zend框架2.2中发送电子邮件。

在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件

Magento使用带有附件的Zendu邮件轻松发送电子邮件