用 PHP 发送最少 1000 封或更多电子邮件的最正确方法是什么?任何可靠的电子邮件排队技术能够处理这个问题?
7 回答
您可以将您的电子邮件插入到 Mail Queue 数据库表中,并让一个单独的进程检查队列并一次批量发送一定数量。
有一个经过测试的解决方案:PEAR Mail_Queue
对我来说很好。
正如 mercutio 建议的那样,我会为每封等待发送的电子邮件在邮件队列表中插入一条新记录,然后使用单独的进程(如 CRON)定期检查表中是否有任何排队的项目。
如果有任何电子邮件排队(并且电子邮件不是为每个收件人定制的)我会按域对电子邮件进行分组并将块一起发送以减少必须发送的电子邮件总数,即如果您有 1000 封电子邮件排队和 250对于 gmail 帐户,我会在 25 个 10 块中发送 250 个(记住密件抄送收件人以避免他们看到对方)。
要实际发送邮件,我会通过 php 的 mail() 函数使用PEAR 邮件
发送电子邮件后,从队列中删除记录或更改状态标志以显示它已发送并循环 - 我还将添加一个计数器来跟踪未能发送的电子邮件,并在 x 次尝试失败后将其删除
为了克服超时问题,我会(视情况而定) - 将 set_time_limit() 设置为 x 秒并跟踪脚本执行时间(在 (x-1) 秒后终止脚本) - 从命令调用脚本避免超时的行 - 设置脚本在一次执行中可以发送的电子邮件数量限制
当然,数据库表可能是一个想法。但是发送 1000 封带有 2mb 附件的电子邮件呢?你也必须考虑到这一点。我自己也遇到了问题,最终我求助于将电子邮件写入数据库,将文件写入文件系统。然后我使用的电子邮件脚本读取数据库记录,并尝试获取要发送的附件。
你确定你需要自己做这个邮件排队吗?
只需将所有邮件发送到本地机器的邮件传输代理(sendmail...),然后让它负责排队和发送。毕竟,这就是设计的目的。
换句话说:别担心!
我创建了 Emailqueue,它是一个服务器,允许您将电子邮件添加到队列中,这样您的应用程序就可以减轻邮寄的压力,还提供有用的附加选项,例如对将来发送的电子邮件进行编程的能力,或者设置每个电子邮件的发送优先级。我认为这很可能是您正在寻找的。
电子邮件队列可在此处获得:https ://github.com/tin-cat/emailqueue
还有一个 Docker 版本可以让你在几分钟内设置一个工作的 Emailqueue 服务器,这里:https ://github.com/tin-cat/emailqueue-docker
我通常依靠黑客。我有一个电子邮件地址的数据库列表,然后使用一个元重定向到自我,并增加“偏移”参数,该参数指定我在数据库中的哪一行。服务器重定向会导致问题,因为浏览器假定所花费的时间表示无限循环。