使用SwiftMailer的Throttle Plugin会导致服务器断开连接

时间:2012-09-21 18:12:30

标签: php apache email swiftmailer

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

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

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

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

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

我已经读过限制插件使用PHP的本机函数sleep(),它应该在这样的情况下正常工作。

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

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

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

任何建议或建议都将受到高度赞赏。

编辑:我也读过这个:SwiftMailer Batch email times 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:我现在被迫更改脚本的行为,以便根据每分钟电子邮件的用户输入计算服务器的限制,以及活动订阅者的总数是否与将要发送的电子邮件的数量相等或相等发送出去,它发送它们没有油门插件。

最温暖的问候, George Girtsou

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

将代码放在try {} catch {}中以获得良好的错误处理也很好。

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