0

假设我们有一个包含通讯订阅者的 2000 个电子邮件列表,我们需要向他们群发电子邮件。服务器在发送电子邮件以防止垃圾邮件时确实有每小时限制。

有些人每小时有 300 甚至 500 封电子邮件,这很公平。

例如,使用 swiftmailer 节流插件每分钟发送 8 封电子邮件(8 * 60 分钟 = 480 总邮件,低于 500 限制)服务器关闭连接并以“404 - 未找到页面”响应。

奇怪的是,它在脚本执行期间发送了 100 封或更少的电子邮件,但服务器仍将程序视为陷入无限循环并终止脚本执行。

如果我尝试在没有油门插件的情况下一次发送 500 封电子邮件,它就像一个魅力。但是,如果我需要发送更多的电子邮件,例如 1500 或 2000,该怎么办?

我已经阅读了油门插件使用 PHP 的本机函数sleep(),它应该在这种情况下正常工作。

我被告知,如果该过程是通过 Cron Job 而不是通过 HTTP 协议执行的,它可以工作。我尝试过使用 wget 和 curl 来设置 cron 作业,但仍然没有运气。

我从我进行的研究中了解到,当使用带有 Swiftmailer 的 SMTP 服务器时,3 秒的过程需要 28 秒(比它应该的要长得多)。所有查询都经过优化,所有数据都正确放置在内存中,而不会使服务器过载。

之后,我决定不使用 SMTP 试一试,但 Throttler 插件(再次)无法正常工作。

任何建议或建议将不胜感激。

编辑:我也读过这个:SwiftMailer Batch email time my Server out

当然我用这个:

ignore_user_abort(true);
set_time_limit(0);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '256M');
ini_set('mysql.connect_timeout', 500);
ini_set('default_socket_timeout', 500);

PS:我现在被迫更改脚本的行为,以便它根据用户每分钟输入的电子邮件计算服务器的限制,如果活跃订阅者的总数小于或等于将要发送的电子邮件,它在没有油门插件的情况下发送它们。

最热烈的问候,乔治·吉尔索

4

1 回答 1

3

我认为这与您的 SMTP 连接超时有关。

当您在循环中处理电子邮件并与 Throttle 插件结合使用时,Swiftmailer 没有机会关闭与 SMTP 服务器的连接,并且可能会限制单个连接中发送的电子邮件数量.

这就是为什么建议将AntiFlood插件也加入组合中的原因,它会在发送 x 封邮件后关闭 SMTP 连接并等待 y 秒直到重新连接。

$transport->start()并且$transport->stop()是与插件正在使用的 SMTP 服务器连接和断开连接的手动方法。

对于 SMTP 传输,还有一个超时参数,您可能会感兴趣。

将您的代码放在 try{} catch{} 中也可以很好地处理错误。

希望这会有所帮助,即使对你来说有点晚了!

于 2013-09-13T18:00:21.840 回答