从Zend Framework应用程序向数百个收件人发送电子邮件的最佳方法是什么?

2022-08-31 00:07:35

我正在尝试为我的应用程序实现邮件列表系统。我目前正在使用我的传输工具,遍历我的订阅者列表,并为每个订阅者发送一个新的。但是,我注意到脚本完成所需的时间长度随着订阅者数量的增加而增加。Zend_Mail_Transport_Smtp('localhost')Zend_Mail

我相信必须有一种更专业的方法来做到这一点,包括电子邮件的排队。我想理想的方法是让用户填写表单,单击“发送”,然后立即收到回复,说正在发送电子邮件,而不是等待数百封电子邮件完成发送。

我知道不做任何排序邮件排队。任何有经验的人,都可以给我一个概述如何做到这一点吗?我对cron/crontab/cronjobs一无所知,所以如果它涉及到这一点,请解释这个过程。Zend_Mail


答案 1

为了使用PHP可靠地发送大量电子邮件,您必须使用排队机制。正如其他人所建议的那样,使用队列的过程如下所示:

  • 循环访问您的用户组,为每个用户创建一封电子邮件,并可能自定义内容
  • 将每个邮件对象传递到队列,这将延迟电子邮件的发送,直到以后
  • 在某种 cron 脚本中,一次发送几百个队列的内容。请注意: 您需要通过查看日志来调整要发送的电子邮件数量,以查找实际发送过程中返回的错误。如果您尝试发送太多,我注意到它达到了邮件传输将不再接受连接的地步(我正在使用qmail)

您可以使用一些库来执行此操作,PEAR邮件队列(带有Mail_Mime)和SwiftMailer都允许您创建和排队电子邮件。到目前为止,Zend Mail仅提供电子邮件的创建,而不是排队(稍后会详细介绍)。

我主要有PEAR邮件队列的经验,有一些陷阱。如果您尝试对大量电子邮件进行排队(例如,循环超过20,000个用户并尝试在合理的时间内将他们放入队列),则使用Mail Mime的可引用可打印编码实现非常慢。您可以通过切换到 base64 编码来加快速度。

对于Zend Mail,您可以编写一个Zend Mail传输对象,将Zend Mail对象放入PEAR邮件队列中。我做到了这一点,取得了一些成功,但需要一些努力才能把它做好。为此,请扩展Zend Mail Transport Abstract,实现_sendMail方法(这是将Zend Mail对象放入Mail Queue中的位置),并将传输对象的实例传递给Zend Mail对象的send()方法或Zend Mail::setDefaultTransport()。

最重要的是,有很多方法可以做到这一点,但这需要代表你进行一些研究和学习。然而,这是一个非常可以解决的问题。


答案 2

注意:当我第一次阅读您的问题时,我以为它一次说了数十万封电子邮件。当我仔细检查时,我注意到它实际上说了数百到数千。我现在懒得改变我的帖子,所以这里有一些警告:根据我的经验,你可能可以在没有商业工具的情况下运行良好到大约40K。在大约10K时,您将需要遵循“最小”列表,以防止在开始达到更大的列表大小时出现重大痛苦。不过,我建议立即实现它。

我之前说过,发送电子邮件有两个方面:

  1. 技术方面 - 基本上所有RFC都围绕着smtp协议,电子邮件格式,DNS记录等。这有点复杂,但可以解决。
  2. 神奇的一面 - 电子邮件传递管理是巫毒教。你会感到沮丧,事情会无缘无故地破裂,你会考虑离开另一份不涉及电子邮件的工作。

我建议不要编写自己的批量发件人。我相信PHP可以做得很好,但你应该把时间花在其他地方。我过去使用过并推荐的两个产品是Strongmail和PowerMTA。请注意 - 它们的价格很高,但我几乎可以保证,从长远来看,您将花费更多资金来构建自己的解决方案。

在 PHP 中编写自己的一个领域是节流/tar 点蚀。邮件服务器将在您发送几条消息后开始增加睡眠(30)以减慢您的速度并阻止您发送垃圾邮件。

通常,这些商业批量发件人运行 SMTP 协议进行排队。您将继续使用Zend_Mail,但要对其进行硬编码以连接到服务器。它会以尽可能快的速度对邮件进行排队,然后使用它自己的引擎将邮件发送到目的地。

在100K列表中,您将不得不采用电子邮件最佳实践。您至少需要:

  • SPF Records,也可能是DKIM
  • 多个 IP 用于对流量进行分段 - 具有 3 个 IP,一个用于您信任的质量地址,一个用于中等风险 IP 地址,一个用于高风险 IP 地址。此设计有助于将邮件发送给最佳客户的风险降至最低。
  • 用于发送 IP 地址的正确反向 DNS
  • 使用来自AOL,hotmail,Yahoo和其他人的反馈循环来处理垃圾邮件投诉
  • 取消订阅和退回邮件管理 -- 确保修剪这些地址
  • 具有打开/点击跟踪也很重要 - 如果您是A列表中的客户没有打开您的电子邮件,则需要将其降级为B列表等。这很重要,因为ISP会将不活跃的帐户变成蜜罐。Hotmail因此而闻名。

最后,如果您真的认真对待发送电子邮件,则需要其他一些工具,例如返回路径。


推荐