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

2022-06-25 00:00:00 email smtp php zend-framework mailing-list

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

我相信肯定有更专业的方法来做这件事,包括电子邮件的排队。我认为最理想的方法是让用户填写表格,点击发送,然后立即得到回复,告知电子邮件正在发送中,而不是等待数百封电子邮件发送完毕。

我知道Zend_Mail不执行任何分类邮件排队。有经验的人能给我介绍一下如何做到这一点吗?我对cron/crontabb/cronjob一无所知,所以如果涉及到这一点,请解释一下流程。


解决方案

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

  • 遍历您的用户集合,为每个用户创建一封电子邮件,并可能自定义内容
  • 将每个邮件对象传递到队列,队列会将电子邮件的发送延迟到以后
  • 在某种cron脚本中,一次发送几百个队列内容。注意:您需要通过查看从实际发送过程返回的错误日志来调整要发送的电子邮件数量。如果您尝试发送太多邮件,我注意到邮件传输将不再接受连接(我正在使用qmail)
有几个库可以用来实现这一点,PEAR Mail Queue(使用Mail_Mime)和SwiftMailer都允许您创建电子邮件并将其排队。到目前为止,Zend Mail只提供创建电子邮件,而不是排队(稍后将详细介绍)。

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

对于Zend Mail,您可以编写一个Zend Mail Transport对象,将Zend Mail对象放入PEAR Mail队列。我在这方面取得了一些成功,但需要一点努力才能把它做好。为此,扩展Zend Mail Transport Abstract,实现_Sendmail方法(您将在其中将Zend Mail对象放入Mail队列),并将Transport对象的实例传递给Zend Mail对象的Send()方法或通过Zend Mail::setDefaultTransport()。

底线是,有很多方法可以做到这一点,但这需要您自己进行一些研究和学习。然而,这是一个非常可以解决的问题。

相关文章