我正在制作一个使用SwiftMail扩展名发送的控制台应用程序。根据我们的政策,我有两个虚拟机,一个虚拟机充当SMTP中继,另一个虚拟机作为应用程序服务器。通过telnet手动将邮件发送到中继可以正常工作。使用SwiftMail时,它已损坏。

返回 header ,并且$failuresend()变量中没有返回任何条目
getHeaders()->toString()的响应

Message-ID: <[email protected]>
Date: Wed, 24 Oct 2012 14:50:31 -0400
Subject: [YourSite] Feedback
From: [email protected]
To: [email protected]
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('[email protected]'))
        ->setTo(array('[email protected]'))
        ->setBody("Message!");


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

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

有人遇到过吗?由于我们的应用程序要求,我不想使用sendmail或mail,但是要使用SMTP。

最佳答案

这是因为SwiftmailerServiceProvider默认情况下使用Swift_MemorySpool,并且仅刷新kernel.terminate。让我后退一步,并解释其中的每个部分。

  • SwiftmailerServiceProvider负责注册Swiftmailer服务和默认配置。默认情况下,传输方式(swiftmailer.spooltransport)是Swift_SpoolTransport,而swiftmailer.spoolSwift_MemorySpool
  • Swiftmailer支持不同的邮件发送方式。这些称为传输。假脱机传输充当队列。您可以将此队列存储在文件或内存中。假脱机传输具有flushQueue方法,该方法允许将排队的邮件刷新到真实的传输中,然后由实际的传输。
  • Silex使用的Symfony2 HttpKernel在每个请求的生命周期内都会发出许多事件。它发出的最后一个是kernel.terminate事件。发送HTTP响应主体后触发此事件。这使您可以在呈现页面后执行繁重的任务,以使它不再显示为加载到用户中。
  • SwiftmailerServiceProvider订阅kernel.terminate事件,以便在呈现页面后刷新内存假脱机。它将其刷新到swiftmailer.transport服务,该服务是通过SMTP实际发送的Swift_Transport_EsmtpTransport

  • 因此,让我们解决实际问题。您处于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']);
    });
    

  • 两种解决方案都可以。祝你好运!

    关于php - Silex SwiftMailer在执行时未建立SMTP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13055907/

    10-10 15:22