gpt4 book ai didi

smtp - 如何使用 swift_mailer 修复/避免此 smtp 错误?

转载 作者:行者123 更新时间:2023-12-01 06:36:45 25 4
gpt4 key购买 nike

抱歉,可能只是一个新手问题,但这里有,
我有一个脚本可以循环使用如下代码发送电子邮件的一堆(有时是数千个)成员:

    $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() 用于大量电子邮件。参见 this question 中的使用示例.一个应用例子:
    $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() 是 removed in 4.1.0 RC1 of SwiftMailer .据我所知,它 internally called send() in a loop ,因此您应该能够通过多次调用 send() 来获得相同的效果,但至少要重用您的邮件传输,这样您就不会每次都重新实例化它(如果适用,还可以创建消息)。

    来自 official documentation 的批量发送示例,您可以使用 send() 批量发送电子邮件
    // Create the Transport
    $transport = Swift_SmtpTransport::newInstance('localhost', 25);

    // Create the Mailer using your created Transport
    $mailer = Swift_Mailer::newInstance($transport);

    // Create a message
    $message = Swift_Message::newInstance('Wonderful Subject')
    ->setFrom(array('john@doe.com' => 'John Doe'))
    ->setBody('Here is the message itself')
    ;

    // Send the message
    $failedRecipients = array();
    $numSent = 0;
    $to = array('receiver@domain.org', 'other@domain.org' => 'A name');

    foreach ($to as $address => $name)
    {
    if (is_int($address)) {
    $message->setTo($name);
    } else {
    $message->setTo(array($address => $name));
    }

    $numSent += $mailer->send($message, $failedRecipients);
    }

    传输协议(protocol)。另一个需要注意的是 SwiftMailer 是一个包装类。它在引擎盖下实际使用的是您定义的内容。在您的情况下,您使用的是 SMTP 传输,它比邮件传输(mail() 函数)更好,但可能不是最佳传输。

    您没有说是否明确要使用它以及您拥有哪个环境,但是在 linux 环境中,您可以使用类似的东西直接调用 sendmail
    $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

    这可以提供更好的性能。 SwiftMailer usage documentation 中有更多关于不同传输的信息.

    类版。根据您的评论,您使用的是 4.0.5 版本。当前版本是 4.1.8. ,并且自从批量发送以来,有些事情已经发生了变化,所以您可能也想检查一下。

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

    关于smtp - 如何使用 swift_mailer 修复/避免此 smtp 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10950859/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com