我正在尝试使用内存假脱机的自定义命令发送电子邮件。根据 这里的文件:
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”返回的传输是空传输。
答案 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();
使用休息和卷曲不是应该如何做到的,但至少它是有效的。