netglue/zend-expressive-mail-template

此包已被废弃且不再维护。未建议替代包。

一个模块,它提供了使用Zend Expressive中现有的模板引擎轻松配置和发送电子邮件消息的方法。

1.0.0 2018-07-18 11:23 UTC

This package is auto-updated.

Last update: 2021-09-02 12:04:28 UTC


README

Build Status

此模块/库/ 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个事件,这些是sendMessagesendMessage.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。

关于

Netglue在英国德文郡制作基于网络的工具。我们希望这对您有所帮助,并且无论结果如何我们都非常欢迎反馈 :)