PHPMailer中的持久SMTP连接

15

如何在 PHPMailer 中启用持久的 SMTP 连接?

我将发送很多邮件,使用持久连接可能会提高性能。

4个回答

23

我们并不关心你的服务器是否被列入黑名单,对吧?要达到你想要的效果,只需将SMTPKeepAlive属性设置为true,然后在批量发送完成后隐式调用SmtpClose()方法即可。

$phpMailer = New PHPMailer();
$phpMailer->isSMTP();
$phpMailer->SMTPKeepAlive = true;

for ( ... ) {
    // Send your emails right away
    [ ... ]
}

$phpMailer->SmtpClose();

非常感谢你,Mauro!这就是我一直在寻找的答案。 - Paulo Coghi
1
嗨Mauro,我使用了相同的代码$phpMailer->SMTPKeepAlive = true。但是并没有增加电子邮件发送速度。在我的情况下,这行代码并不会改变性能。如果您有其他建议,请告诉我。 - mahesh kajale
4
$phpMailer->SMTPKeepAlive = true 的作用是避免在下一封邮件发送前关闭连接,但服务器可能仍会关闭连接,这是无法改变的。如果您需要更快地发送电子邮件,建议您使用基于API的电子邮件平台,如Mandrill或Mailgun,在单个请求中可以发送数百封电子邮件。但如果您想发送垃圾邮件,请忘记我曾经帮助过您,回到您的房间反思自己的行为。 - Mauro
3
当使用脚本发送多封电子邮件时,这可能对使用Gmail的smtp-relay服务器(用于企业/教育帐户)很有帮助。根据Google文档:“Google Apps SMTP中继服务器已经采取了保护措施来防范拒绝服务(DoS)攻击。为避免与这些保护措施冲突,通过smtp-relay.google.com发送大量邮件的SMTP代理应重用连接,每个连接发送多个消息。这也被称为连接缓存。” - Tim Dearborn
6
在调用AddAddress()之前,在循环内务必调用ClearAddresses()。请参见:https://dev59.com/w3XYa4cB1Zd3GeqP-Mho#18285896。 - degenerate
许多人使用PHPMailer通过事务性服务(如Postmark、Mailgun、SendGrid、SES等)发送电子邮件,因此垃圾邮件不是问题。这些服务允许您以任何速度发送邮件,因此最小化SMTP连接时间是理想的。 - degenerate

2
通过优化邮件发送,您可能会被识别为垃圾邮件发送者,导致网络服务器阻止您的IP地址。您发送了多少封电子邮件?实际上,限制发送邮件可能比加快速度更好。

目前我正在发送2500封电子邮件。 - Paulo Coghi
是的,我同意关于限流的做法。每小时限制在500-1000次应该可以避免被视为垃圾邮件。 - cEz

1

什么是持久的SMTP连接?

首先,如果您发送电子邮件,则在完成作业之前与服务器保持连接。 其次,如果您想要发送多封电子邮件(可能会将您的服务器列入黑名单), 您可以在PHP代码中编写一个循环,获取所有电子邮件地址并将它们传递给phpmailer,最终发送它们。 这就是我发送大量邮件的方式。


但是我需要在PHPMailer的某个地方启用它,因为它可以在每封电子邮件发送时连接和断开连接。 - Paulo Coghi
我的服务器被识别并且有(几乎)必要的东西,以免被列入黑名单。我们定期发送电子邮件,并拥有庞大的客户群,这种规律性也使我们在接收服务器中排名靠前。 - Paulo Coghi
你可能应该设置一个队列,并使用循环每次处理一批邮件,以便您可以控制电子邮件的数量。 - cEz

0

当您发送大量邮件并希望更快地发送时,持久的SMTP连接是合适的选择。保持SMTP连接活动状态以发送特定数量的电子邮件是一个好主意,可以加快发送速度。在IP预热会话期间,经常在循环中交替使用SMTP连接可以实现更可控的发送方式。

https://www.mumara.com/persistent-smtp-connection-and-non-persistent-loop/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接