Zend Framework 2 отправить шаблон электронной почты

Я пытаюсь отправить шаблон электронной почты для подтверждения электронной почты при регистрации. Почта отправлена, и я могу ее получить, но я вижу html-код в письме вместо кнопки и других элементов... Мой Класс Mailer показан в 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()
        ));
}

person user2406735    schedule 06.02.2014    source источник
comment
Вы устанавливаете MIME-тип для электронной почты?   -  person Sam    schedule 06.02.2014
comment
Прочтите эту замечательную статью: zjhzxhz .com/2014/10/   -  person Maksim Luzik    schedule 08.12.2015


Ответы (3)


Не проверял, но примерно так:

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.");
        }
}
person jmleroux    schedule 06.02.2014
comment
Спасибо, но это показывает мне ошибку. Нет активной транзакции. Я использую доктрину, может ли это быть связано с ней? - person user2406735; 06.02.2014
comment
Без сомнения. Zend\Mail не имеет ничего общего с транзакциями. ;) - person jmleroux; 06.02.2014
comment
У вас есть идея, что это может быть? Это связано с Мимом? - person user2406735; 07.02.2014
comment
Вероятно, фиксация или откат без запуска транзакции. - person jmleroux; 07.02.2014
comment
Вы говорили о регистрации, поэтому пытаетесь сохранить пользователя в базе данных. Это должно произойти здесь. - person jmleroux; 07.02.2014

То же самое и с ZF2. Все в документе: http://framework.zend.com/manual/2.2/en/modules/zend.mail.message.html

Иногда вы можете захотеть предоставить HTML-контент или контент, состоящий из нескольких частей. Для этого вы сначала создадите объект сообщения MIME, а затем установите его в качестве тела вашего объекта почтового сообщения. Когда вы это сделаете, класс Message автоматически установит заголовок «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);
person jmleroux    schedule 06.02.2014
comment
Спасибо за Ваш ответ. Как я могу поместить это в свой класс почтовой программы? - person user2406735; 06.02.2014
comment
@ user2406735 точно так же, как здесь. У вас есть объект Message в вашем классе почтовой программы, все, что вам нужно сделать, это теперь работать с MimePart и MimeMessage ;) - person Sam; 07.02.2014

Вам нужно правильно настроить заголовки. Я не уверен в Zend Framework, никогда его не использовал, но вот пример использования функция PHP mail():

// 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 <[email protected]>, Kelly <[email protected]>' . "\r\n";
$headers .= 'From: Birthday Reminder <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

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

Два верхних заголовка — это то, что устанавливает электронную почту как html, а не как текст.

person John    schedule 06.02.2014