首页 文章

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

提问于
浏览
2

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

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

    我根本无法工作 . Symfony / Swift只会在命令中使用NullTransport,控制台会为默认传输提供此功能

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

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

    我正在使用FOS restbundle,所以我将我试图 Build 的电子邮件命令移到了一个休息控制器上 . 然后我从命令行用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();
    

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

相关问题