Шаблон за изпращане на имейл на 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
Имате ли идея какво може да е? Свързано ли е с Mime? - 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