如何使用swift\u mailer修复/避免此smtp错误?

如何使用swift\u mailer修复/避免此smtp错误?,smtp,send,swiftmailer,mailer,Smtp,Send,Swiftmailer,Mailer,抱歉,可能只是个新手问题,但接下来, 我有一个脚本,它使用如下代码在一群(有时是数千)发送电子邮件的成员之间循环: $transport = Swift_SmtpTransport::newInstance('...', 25) ->setUsername('...') ->setPassword('...'); $

抱歉,可能只是个新手问题,但接下来, 我有一个脚本,它使用如下代码在一群(有时是数千)发送电子邮件的成员之间循环:

    $transport = Swift_SmtpTransport::newInstance('...', 25)
                                ->setUsername('...')
                                ->setPassword('...');

                $mailer = Swift_Mailer::newInstance($transport);
                $mailer->send($message);
它通常运行良好,但有时我会出现以下错误: 预期响应代码为354,但收到代码为“250”,消息为“250 2.1.5…收件人正常”

我对smtp不太了解,所以我只能猜测,在发送邮件的过程开始时,预期会出现354代码,但从上次发送的电子邮件中接收到250代码-因此,由于使用速度太快,邮件程序变得过载,我想我应该等待每封电子邮件真正完成(即等待250码)然后再发送下一封邮件。我不喜欢在每封邮件之后都坚持一个sleep命令,那么有没有更好的方法来防止这个错误?或者原因是什么


谢谢

总之:

  • 要做的主要改变:重用您的邮件连接,并且更喜欢创建消息,所以它只在需要时执行,通常只执行一次
  • 检查您如何实例化SwiftMailer,并确认它是最理想的方式
  • 您的SwiftMailer类版本似乎有点旧(4.0.5),您可以查看更新的版本
  • 更详细的信息:

    重用实例化对象。您每次都在重新创建邮件传输,这会造成开销。您不应该这样做。如果支持,您可以使用batchSend()处理大量电子邮件。请参阅中的使用示例。应用示例:

    $message = Swift_Message::newInstance(...)
      ->setSubject('A subject')
      ->setFrom(array('myfrom@domain.com' => 'From Me'))
      ->setBody('Your message')
    ;
    
    while(list($targetadd, $targetname) = each($targetlist))
    {
       $message->addTo($targetadd, $targetname);
    }
    
    $message->batchSend();
    
    请注意,尽管batchSend()已被禁用。但据我所知,它已被禁用,因此您应该能够多次调用send()具有相同的效果,但至少可以重用您的邮件传输,这样您就不会每次都重新启动它(如果适用,还可以创建邮件)

    在的批发送示例中,您可以使用send()和

    传输协议。另一件需要注意的事情是SwiftMailer是一个包装类。它实际上在后台使用的是您定义的。在您的情况下,您使用的是SMTP传输,它比邮件传输(Mail()函数)更好,但可能不是最理想的

    您并没有明确说明您是否想要使用它以及您拥有的环境,但在linux环境中,您可以使用以下命令直接调用sendmail

    $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');
    
    这可以提供更好的性能。中有更多关于不同传输的信息

    类版本。根据您的评论,您使用的是4.0.5版本。当前版本为,自批发送以来,有些内容已更改,因此您可能也要检查一下


    编辑:更新了有关batchSend()、当前版本和手动链接的信息。

    我偶尔添加了$mailer->disconnect()-sleep-reconnect,但这会引发错误:PHP致命错误:调用未定义的方法Swift\u mailer::disconnect(),我猜disconnect()这不是swift mailer 4.0.5中api的一部分。还有其他方法吗?谢谢你的回复,我使用smtp,因为这是我们其他脚本使用它的标准方式,而且似乎是swift mailer文档推荐的。我只是偶尔重新创建transport和mailer对象,只是开始尝试解决这个问题,但我知道它看起来像e我在我的代码片段中每次都这样做。所以我的代码基本上是你建议的,除了我每次都会重新创建大部分邮件,因为收件人不同。我会考虑升级到最新版本,但我需要让系统管理员这样做。好吧,你至少可以尝试看看使用不同的传输是否会有所不同-这将有助于缩小问题的范围。我还在错误发生时重新创建transport和mailer对象,并运行睡眠(30)在每次出错后调用,让smtp服务器有时间赶上。到目前为止,这似乎工作得足够好。当我有机会再次返回此问题时,将尝试不同的传输方法。谢谢eis。
    $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');