问题描述
|
我开始管理一个拥有超过50,000个注册会员的会员列表的网站。
我有这个问题:
每次我尝试发送电子邮件时,该页面都会运行几分钟(超过20分钟),最终以\“内部服务器错误\”结束。
现在,我不知道发送了多少邮件,或者根本不发送任何邮件。
我如何发送电子邮件:
我从数据库中选择所有电子邮件,运行一个循环,一个接一个地发送。我选择此选项是因为:
我不想在“收件人”字段中添加几封电子邮件,因此将维护人们的隐私。
在密件抄送中添加电子邮件将使其显示为垃圾邮件。
请我如何处理。
谢谢
解决方法
您需要做的就是将工作分解为可管理的部分,而不是阅读所有50,000封电子邮件并尝试全部发送。
一次只读取来自数据库的X封电子邮件。
分别发送该批X封电子邮件(如果
X = 10
,您将发送10封单独的电子邮件)。
发送每封电子邮件后,将每封电子邮件标记为“已发送”,否则,如果出现错误,您可能希望增加该特定电子邮件的“发送尝试次数”。
发送(或尝试)X封电子邮件后,更新您的统计信息以指示已发送X封电子邮件。
回到1。
我建议从ѭ1开始
, 为此,我编写了一个脚本,该脚本使用上次处理的用户ID进行调用。
例如。 sendmail.php然后将调用sendmail.php?id = 1,然后它将调用sendmail.php?id = 2,依此类推。
这样可以解决您的超时问题。
在脚本内,您可以回显出mail命令的结果。如果它为假,则可以回显错误。
我还在用户表中添加了一个字段,用于发送邮件的日期和时间,因此我可以确认脚本在哪里以防浏览器死亡。
您的使下一个用户向其发送电子邮件的sql类似于
Select useremail from users where sendmaildatetime is not null limit 1
假设sendmaildatetime列的默认值为null。
对不起,如果即时通讯不够详细,即时通讯是从我的iPhone及其PITA编写的:)
, @ hamlin11的响应是正确的,如果您想管理发送给您的电子邮件如此之大,则必须将其分成小块并作为异步任务来管理。
要管理异步任务,您将有很多方法,一个子进程检查所有您正在等待某些异步作业的请求,一个单独的cron作业,从crontab调用cron.php脚本,甚至是psynnott答案,外部脚本最后重新启动。
但是,如果您对网站下的系统有一定的控制权,那么您也可以使用正确的工具完成正确的任务。向邮件列表管理器发送一封简单的电子邮件,它将为您完成这项工作。这仅意味着您在邮件列表管理器中创建了正确的用户列表。外部邮件列表管理器例如是mailman或sympa。这些工具包含您可以与之对话的机器人,用于为邮件列表收件人提供信息。@ psynnott答案可以看作是执行非常简单的邮件列表管理器任务的外部PHP脚本。如果您想根据某些用户参数来更改电子邮件的内容,则肯定必须编写自己的单独流程来管理任务。
但是您也可以搜索为您处理此工作的Web服务。垃圾邮件管理是一项艰巨的工作,管理一个官方的大邮件发送员也是一项艰巨的任务,但这当然不是免费的。