如何定义额外的邮件服务以使用Spool并在Symfony2中发送即时邮件

7
在我的Symfony2网络应用程序中,我需要发送两种类型的电子邮件:即时和批量。即时邮件应立即发送,而批量邮件应使用邮件队列进行发送。由于Symfony2中Swiftmailer的默认配置只有一个邮件服务,因此无法实现这一点。
在 Stack Overflow 上已经有类似的问题(如何将电子邮件存储到任务中并在其他控制器中即时发送普通邮件?),但是没有得到解决。但是根据这个 GitHub 线程(https://github.com/symfony/SwiftmailerBundle/issues/6),可以创建一个完全不同于默认值的第二个邮件发送服务。其中一位用户 (stof) 建议按照 SwiftmailerBundle 找到的配置(https://github.com/symfony/SwiftmailerBundle/blob/master/Resources/config/swiftmailer.xml)来创建这个新服务,但我不知道如何操作。请问有人知道如何创建额外的邮件发送服务,并将其配置为暂存,同时保留默认的邮件发送服务以发送普通(即时)电子邮件吗?
1个回答

12

我在这里找到了解决方案

这是我的实现方式:

首先,我将默认邮件服务配置为作为 spool 工作以发送批量电子邮件。

(config.yml)

swiftmailer:
    transport: %mailer_transport%
    encryption: %mailer_encryption%
    auth_mode: %mailer_auth_mode%
    host: %mailer_host%
    username: %mailer_user%
    password: %mailer_password%
    spool:
        type: file
        path: "%kernel.root_dir%/spool"

然后,在我的一个捆绑包(CommonBundle)中,我注册了一个名为“instant_mailer”的新服务,它映射到Swiftmailer类。

(service.yml)

instant_mailer:
    class: %swiftmailer.class%
    arguments: ["@?swiftmailer.transport.real"]

最后,在我的控制器中,每当我想使用 spool 发送电子邮件时,我只需执行以下操作:

$mailer = $this->get('mailer');

并且要发送即时电子邮件:

$mailer = $this->get('instant_mailer');

3
好的!但是如果一个环境使用 spooling(传输队列),另一个环境不使用,你可能会遇到问题。在切换到 .real 传输之前,你可能需要检查 $this->get('mailer')->getTransport() instanceof \Swift_Transport_SpoolTransport 是否成立,因为它可能不存在! - bksunday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接