netglue / zend-expressive-mail-template
一个模块,它提供了使用Zend Expressive中现有的模板引擎轻松配置和发送电子邮件消息的方法。
Requires
- php: >=7.1
- psr/container: ^1.0
- zendframework/zend-eventmanager: ^2.6.2 || ^3.0
- zendframework/zend-expressive-template: ^1 || ^2
- zendframework/zend-mail: ^2.7
Requires (Dev)
This package is auto-updated.
Last update: 2021-09-02 12:04:28 UTC
README
此模块/库/ whatever 可能有点天真,实际上是对一个较旧的 ZF2 模块的快速重构,该模块执行相同的功能,但更具体地与 Zend\View
结合使用 - 你可以在这里找到它: netglue/ZF2-Mail-Template-Module…
此库的主要用例是您将构建电子邮件消息布局和模板,并将它们存储在您的应用程序/网站的本地文件系统中。然后,这些模板将使用您已经在您的 Zend Expressive 应用程序中设置的任何模板引擎进行渲染。
每种类型的消息都将有一个名称和相关默认值/配置,以便在您的代码中,发送操作将只是一个 $dispatcher->send(string 'myMessage', array $emailOptions, array $viewVariables);
的问题。
此库是匆匆拼凑起来的,为了解决一个简单的需求,应该被视为一个工作进程。欢迎贡献 :)
安装
$ composer require netglue/zend-expressive-mail-template
配置
邮件传输
配置应放在 netglue_mail
键下。首先要做的是确保您已设置了一个工厂,用于返回一个 Zend\Mail
可以使用的邮件传输。所以,假设您已经在 DI 容器中设置了一个名为 Zend\Mail\Transport\TransportInterface
的传输设置,您需要在配置中提供此名称,如下所示
// …
'netglue_mail' => [
'transport' => Zend\Mail\Transport\TransportInterface::class,
],
// …
如果没有提供传输,库将自动构建一个 InMemory
传输,并且所有邮件都将发送到那里,这可能是您不希望看到的……
模板渲染
接下来,您需要为要发送的每种类型的消息设置配置。至少,您需要提供“消息类型”的模板。这应该是一个基于 HTML 的模板,键为 template
,或纯文本模板,键为 textTemplate
,或两者都是多部分消息。显然,您还需要设置模板解析器,以便知道在哪里找到这些模板名称
'netglue_mail' => [
// …
'messages' => [
'myMessage' => [
'template' => 'email::some-html',
'textTemplate' => 'email::some-text',
],
],
// …
],
// Your template path config might look like:
'templates' => [
'map' => [
'email::some-html' => __DIR__ . '/tmpl/mail/some-file.html',
'email::some-text' => __DIR__ . '/tmpl/mail/some-text.txt',
],
],
组合模板渲染 '服务' 的工厂将在 DI 容器中查找一个键为 NetglueMail\MailTemplateRendererInterface::class
的渲染引擎 - 此服务名称被别名到 Zend\Expressive\Template\TemplateRendererInterface::class
,因此,从理论上讲,只要您从 ConfigProvider
中获取依赖配置,模板渲染器就会默认工作,如果您想为邮件提供一个与您的应用程序使用的不同的渲染器,您只需在依赖配置中用类似以下内容覆盖此别名即可
'dependencies' => [
'aliases' => [
NetglueMail\MailTemplateRendererInterface::class => Some\Other\Renderer::class,
],
'factories' => [
Some\Other\Renderer::class => Some\Other\RendererFactory::class,
],
],
您可以为每个单独的消息配置大量其他内容,以及全局默认值。
默认发送者
设置所有消息的默认发送者,使其从一致的地址/名称发送
'netglue_mail' => [
'defaultSender' => 'me@example.com',
'defaultSenderName' => 'Some Dude',
],
默认消息头
将默认头应用于所有外发邮件
'netglue_mail' => [
'defaultHeaders' => [
'X-Mailer' => 'Granny',
'X-Foo' => 'Bar',
'X-Blah' => 'Bing',
],
],
单个消息的各种默认设置
设置收件人、发件人、头信息、主题等…
'netglue_mail' => [
// …
'messages' => [
'myMessage' => [
'template' => 'email::some-html',
'to' => ['some@guy.com' => 'Some Guy', 'Someone Else' => 'other@elsewhere.com'],
'subject' => 'Re: Nappies',
'headers' => [
'X-Foo' => 'Baz',
],
],
],
// …
],
用法
一旦一切配置如你所愿,你仍然可以覆盖Zend\Mail的设置,并在发送类似内容时提供视图变量
$dispatcher = $container->get(\NetglueMail\Dispatcher::class);
$options = [
'to' => 'me@nowhere.com',
'subject' => 'Scones',
'headers' => [
'X-Foo' => 'Bing Bong',
],
];
$view = [
'var1' => 'Foo',
'var2' => 'Foo',
];
$mailMessage = $dispatcher->send('myMessage', $options, $view);
你还可以首先从默认设置和运行时选项构建消息,然后分两步发送
$mailMessage = $disptacher->createMessage('myMessage', $options, $view);
// Do stuff to $mailMessage
// or add additional values to be sent with triggered events in $eventParams
$dispatcher->sendMessage($mailMessage, $eventParams);
事件
使用Zend\EventManager
在发送时触发2个事件,这些是sendMessage
和sendMessage.post
,因此你可能希望将其放置在某个位置
$dispatcher->getEventManager()->attach('sendMessage', function($e) {
$message = $e->getParams()['message'];
$dispatcher = $e->getTarget();
// .. Do stuff before $message is passed to the transport
});
测试
使用Zend\View作为模板引擎时,测试覆盖率相当好,但我还没有时间用Twig或Plates等进行测试。YMMV。