2014-02-06 3 views
2

Я пытаюсь отправить шаблон электронной почты для подтверждения по электронной почте при регистрации. Mail отправлен, и я могу получить его, но я могу видеть html-код в электронной почте вместо кнопки и других элементов ... My Mailer class is shown in jsfiddle, я не знал, как отправить его по-другому.Zend Framework 2 отправьте шаблон по электронной почте

Моя функция для отправки электронной почты заключается в следующем:

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() 
     )); 
} 
+1

ли параметр мим-типа для E-Mail? – Sam

+0

Ознакомьтесь с этой хорошей статьей: http://zjhzxhz.com/2014/10/zend-framework-2-send-html-mail-with-simple-template/ –

ответ

1

Не тестировался, но что-то вроде этого:

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."); 
     } 
} 
+0

Спасибо, но это покажет мне ошибку «Нет активной транзакции . ". Я использую доктрину, не может ли она быть связана с ней? – user2406735

+0

Без сомнения. Zend \ Mail не имеет ничего общего с транзакциями. ;) – jmleroux

+0

У вас есть идея, что это может быть? Это связано с Mime? – user2406735

1

Вы должны получить ваши заголовки правильно. Я не уверен, 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 <[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, а не текст

4

Это довольно то же самое с 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); 
+0

Спасибо за ваш ответ. Как я могу поместить это в свой почтовый класс? – user2406735

+0

@ user2406735 точно так же, как это делается здесь. У вас есть объект «Message» в вашем почтовом классе, все, что вам нужно сделать, это теперь работать в материалах «MimePart» и «MimeMessage»;) – Sam

Смежные вопросы