Symfony 2.7.3和Swiftmailer 5.4.1没有在命令中工作:为什么他们使用NullTransport

时间:2015-12-29 17:59:49

标签: swiftmailer symfony-2.7

我正在尝试使用内存假脱机的自定义命令发送电子邮件。根据 这里的文件:

http://symfony.com/doc/2.7/cookbook/console/sending_emails.html

这是自Symfony 2.3 / swiftmailer 2.3.5以来自动处理的,但它无效。

我尝试过标准方法

$email = \Swift_Message::newInstance()
    ->setSubject('New Email')
    ->setFrom('noreply@mydomain.com')
    ->setTo($recipients)
    ->setBody($message);
$container = $this->getContainer();
$container->get('mailer')->send($email);

什么都没发送。

我还尝试手动刷新假脱机,这是旧版本的解决方法,在命令末尾添加了

$spool = $container->get('mailer')->getTransport()->getSpool();
$transport = $container->get('swiftmailer.transport.real');
$spool->flushQueue($transport);

那也没有做任何事。

我的控制器发送了电子邮件,因此我知道swiftmailer配置正确。

我不想切换到文件假脱机,但似乎这是目前唯一的选择。

编辑: 使用内存假脱机时,从vendor / swiftmailer / swiftmailer / lib / classes / Swift / MemorySpool.php调用flushQueue

我将该函数编辑为var_dump它正在使用的$ transport变量,并决定使用null传输 Swift_Transport_NullTransport只应在配置上设置disable_delivery时使用(或者如果配置中的传输设置为null)

我认为这是电子邮件失败的原因,所以我的新问题是,为什么命令使用NullTransport?

编辑2: 问题似乎来自这一行

$spool->flushQueue($this->container->get(sprintf('swiftmailer.mailer.%s.transport.real', $name)));

在swiftmailer-bundle / EventListener / EmailSenderListener.php

我的配置中只有一个邮件程序设置

swiftmailer:
    transport:      %mailer_transport%
    host:           %mailer_host%
    username:       %mailer_user%
    password:       %mailer_password%
    spool:          { type: memory }
    port:           %mailer_port%
    encryption:     %mailer_encryption%
    sender_address: %mailer_sender_address%

从paramters.yml

中提取值
mailer_transport: sendmail
mailer_host: smtp.sendgrid.net
mailer_user: [USERNAME]
mailer_password: [PASSWORD]
mailer_port: 465
mailer_encryption: ssl
mailer_sender_address: noreply@mydomain.com

但由于某种原因,为“swiftmailer.mailer.default.transport.real”返回的传输是空传输。

1 个答案:

答案 0 :(得分:0)

我根本无法解决这个问题。 Symfony / Swift只会在命令中使用NullTransport,控制台会为我提供默认传输

$ php app/console debug:container
...
swiftmailer.mailer.default.transport.real        Swift_Transport_NullTransport 
...

所以我放弃了,转而采用不同的方法。

我正在使用FOS restbundle,所以我将我尝试构建的电子邮件命令移动到了一个休息控制器。然后我从命令行用curl调用它们

$ curl --request POST http://api.mydomain.com/api/emails/foo/bar.json

这允许我自动调用使用crontab发送电子邮件。

我不得不稍微更改代码,像这样的基本更改

// Command
$container = $this->getContainer();
$entityManager = $container->get('doctrine')->getManager();
// Controller
$entityManager = $this->getDoctrine()->getManager();

使用休息和卷曲不是应该如何做到的,但至少它是有效的。