如何将不同的 SwiftMailer 邮件程序注入 Symfony 中的不同服务?

How do I inject different SwiftMailer mailers into different services in Symfony?

我有一个 Symfony 2.8 项目需要使用两个单独的邮件服务(例如 Google SMTP 和 Yahoo SMTP)。我已经根据文档配置了它们:

swiftmailer:
    default_mailer: mailer_google
    mailers:
        mailer_google:
            transport: smtp
            host: %mailer_google_host%
            port: %mailer_google_port%
            encryption: tls
            username: %mailer_google_username%
            password: %mailer_google_password%
        mailer_yahoo:
            transport: smtp
            host: %mailer_yahoo_host%
            port: %mailer_yahoo_port%
            encryption: tls
            username: %mailer_yahoo_username%
            password: %mailer_yahoo_password%

%variables%的值都是在parameters.yml中定义的,这里不相关。

我正在尝试使用自定义 Mailer class,它用于定义两种不同的服务,如下所示:

aalaap.services.mailer_google:
    class: Aalaap\AppBundle\Services\Mail\Mailer
    arguments:
      - @mailer
      - '%mailer_google_sender%'

aalaap.services.mailer_yahoo:
    class: Aalaap\AppBundle\Services\Mail\Mailer
    arguments:
      - @mailer_yahoo
      - '%mailer_yahoo_sender%'

现在,因为默认邮件程序设置为 mailer_google,在第一个服务定义中,仅指定 @mailer 即可。但是,第二个服务找不到@mailer_yahoo.

ServiceNotFoundException in CheckExceptionOnInvalidReferenceBehaviorPass.php line 58: The service "aalaap.services.mailer_yahoo" has a dependency on a non-existent service "mailer_yahoo".

我已经用 @mailer.mailer_yahoo 试过了,但这也不起作用。如果我将第一个服务定义更改为使用特定的 @mailer_google 而不是仅使用默认的 @mailer,那也不起作用。 @swiftmailer.mailers.mailer_yahoo.

不走运

如何将第二个(或非默认)邮件程序注入服务?

所以,这就是如何设置多个邮件帐户并使用 Symfony 处理注入:

设置 swiftmailer 配置:

swiftmailer:
    default_mailer: mailer_google
    mailers:
        mailer_google:
            transport: smtp
            host: %mailer_google_host%
            port: %mailer_google_port%
            encryption: tls
            username: %mailer_google_username%
            password: %mailer_google_password%
        mailer_yahoo:
            transport: smtp
            host: %mailer_yahoo_host%
            port: %mailer_yahoo_port%
            encryption: tls
            username: %mailer_yahoo_username%
            password: %mailer_yahoo_password%

然后以这种方式在服务中注入想要的邮件程序(例如,google 邮件程序):

aalaap.services.mailer_google:
    class: Aalaap\AppBundle\Services\Mail\Mailer
    arguments:
      - @swiftmailer.mailer.mailer_google
      - '%mailer_google_sender%'

或者(因为在那种情况下 google 邮件程序是默认邮件程序):

aalaap.services.mailer_google:
    class: Aalaap\AppBundle\Services\Mail\Mailer
    arguments:
      - @swiftmailer.mailer.default_mailer
      - '%mailer_google_sender%'