我试图在Zend framework 2应用程序中发送带有模板的电子邮件。 这是我班级中的代码,名为" EmailService ..."。
$view = new PhpRenderer();
$resolver = new TemplateMapResolver();
$resolver->setMap(array(
'mailTemplate' => __DIR__ . '/../../../mail/' . $template['name'] . '.phtml'
));
$view->setResolver($resolver);
$viewModel = new ViewModel();
$viewModel->setTemplate('mailTemplate')
->setVariables(
(!empty($template['variables']) && is_array($template['variables'])) ? $template['variables'] : array()
);
$this->_message->addFrom($this->_emailConfig['sender']['address'], $this->_emailConfig['sender']['name'])
->addTo($user['email'], $user['login'])
->setSubject($subject)
->setBody($view->render($viewModel))
->setEncoding('UTF-8');
一切正常但是在这个模板文件中我必须创建一个动作的链接(我已经为此指定了路线)。但这是一个问题。当我试图使用
时<?php echo $this->url('auth') ; ?>
我得到了#34;没有提供RouteStackInterface实例&#34;错误。
如果我使用:
<?php echo $this->serverUrl(true); ?>
一切正常......有任何线索吗?
答案 0 :(得分:1)
您不需要创建PhpRenderer
的新实例;你可以重用已经创建的那个。
$renderer = $this->serviceManager->get('viewrenderer');
$variables = is_array($template['variables']) ? $template['variables'] : array();
$viewModel = new ViewModel($variables);
$viewModel->setTemplate('mailTemplate');
$html = $renderer->render($viewModel);
为了遵循良好的DI练习,请将PhpRenderer
注入电子邮件服务的__construct
(而不是服务管理器)。
此外,模板路径可以添加到普通module.config.php
return array(
'view_manager' => array(
'template_map' => array(
'mailTemplate' => __DIR__ . '/../view/foo/bar.phtml',
),
),
);
答案 1 :(得分:0)
发送HTML邮件时,有很多模块可以让事情变得简单。您可以搜索here。
我个人最喜欢的是MtMail。您可以轻松使用模板和布局。您可以轻松设置默认标题(From,Reply-To等)。您可以使用此Template Manager功能以面向对象的方式更好地组织电子邮件模板。
$mailService = $this->getServiceLocator()->get('MtMail\Service\Mail');
$headers = array(
'to' => 'johndoe@domain.com',
'from' => 'contact@mywebsite.com',
);
$variables = array(
'userName' => 'John Doe',
);
$message = $mailService->compose($headers, 'application/mail/welcome.phtml', $variables);
$mailService->send($message);