繁体   English   中英

Silex SwiftMailer在执行时不进行SMTP连接

[英]Silex SwiftMailer Not Making SMTP Connection Upon Execution

我正在制作一个使用SwiftMail扩展程序发送的控制台应用程序。 由于我们的策略,我有两个虚拟机,一个用作SMTP中继,另一个用作应用服务器。 通过telnet手动发送邮件到继电器工作正常。 使用SwiftMail时,它已经坏了。

返回标头,并且$failure变量中没有为send()返回任何条目

getHeaders()->toString()响应

Message-ID: <1351104631.508838778dc03@swift.generated>
Date: Wed, 24 Oct 2012 14:50:31 -0400
Subject: [YourSite] Feedback
From: noreply@localhost.com
To: sixeightzero@localhost.com
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

如果我回显send() ,我得到1

boot.php

$app->register(new Silex\Provider\SwiftmailerServiceProvider(), array(
    'swiftmailer.options' => array(
        'host' => 'ip.host.relay',
        'port' => 25,
        'encryption' => null,
        'auth_mode' => null
    ),
));

app.php

 $message = \Swift_Message::newInstance( )
        ->setSubject('[YourSite] Feedback')
        ->setFrom(array('noreply@localhost.com'))
        ->setTo(array('sixeightzero@localhost.com'))
        ->setBody("Message!");


    $app['mailer']->send($message, $failures);

当我在应用服务器上运行TCP转储并运行脚本时,没有建立任何SMTP连接,并且没有抛出任何错误。

有没有遇到过这个? 由于我们的应用程序要求,我不想使用sendmail或邮件,而是使用SMTP。

这是因为SwiftmailerServiceProvider默认使用Swift_MemorySpool ,只刷新kernel.terminate上的kernel.terminate 让我退后一步,解释一下这一部分。

  • SwiftmailerServiceProvider负责注册Swiftmailer服务和默认配置。 默认情况下,transport( swiftmailer.spooltransport )是Swift_SpoolTransportswiftmailer.spoolSwift_MemorySpool

  • Swiftmailer支持不同的邮件发送方式。 这些被称为运输。 假脱机传输充当队列。 您可以将此队列存储在文件或内存中。 假脱机传输有一个flushQueue方法,允许将排队的邮件刷新到真正的传输,这应该传递它们。

  • Silex使用的Symfony2 HttpKernel在每个请求的生命周期中发出许多事件。 它发出的最后一个是kernel.terminate事件。 在发送HTTP响应主体后触发此事件。 这允许您在渲染页面后执行繁重的任务,以便它不再显示为加载到用户。

  • SwiftmailerServiceProvider订阅了kernel.terminate事件,以便在呈现页面后刷新内存假脱机。 它将它刷新到swiftmailer.transport服务,这是一个Swift_Transport_EsmtpTransport ,通过SMTP进行实际发送。

那么让我们来解决实际问题吧。 您处于CLI上下文中,因此不会触发这些HttpKernel事件。 并且由于未触发kernel.terminate事件,因此不会刷新您的假脱机。 因此,您的电子邮件不会被发送。

有两个很好的解决方案:

  • A)手动冲洗阀芯。 只需执行提供程序在其侦听器中执行的操作。 在CLI命令的末尾添加:

     if ($app['mailer.initialized']) { $app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']); } 
  • B)重新配置mailer服务以直接使用ESMTP传输而无需通过线轴:

     $app['mailer'] = $app->share(function ($app) { return new \\Swift_Mailer($app['swiftmailer.transport']); }); 

两种解决方案都应该做到。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM