如何每周发送100,000封电子邮件?

在PHP中,如何每周向100,000个用户发送电子邮件? 这包括使用以下提供者的邮件给订阅者:

  • AOL
  • G-邮件
  • Hotmail的
  • 雅虎

所有的电子邮件实际上都是可以交付的,这一点很重要。 显然,只是传统邮件只会造成问题。

有一个PHP库,使这更简单?

简短的回答:虽然技术上可以每周发送10万封电子邮件,但最简单,最简单和最便宜的解决scheme就是将其外包给专业化的公司之一(我曾经说过“最便宜”:没有限制在尝试DIY时,可以沉入这个时间的开发时间(以及金钱)的数量)。

长的回答:如果你决定自己确实想要做这个事情,那就为一个受到伤害的世界做好准备(毕竟,这是我们正在谈论的电子邮件/电子失败)。 你需要:

  • 电子邮件内容, 而不是垃圾邮件(否则你会在每一步都遇到额外的主要障碍,甚至是法律上的影响)
  • 此外,你的内容应该很容易区分垃圾邮件 – 在某些情况下可能有点难(我听说某个制药公司不得不放弃电子邮件,因为他们的品牌在垃圾邮件中很常见)
  • 一个你自己的可configuration的SMTP服务器,当你将10万封电子邮件转发到你的服务器时,你的ISP的上游服务器是不够的,你将使ISP非常不高兴,我们使用了两个专用的邮箱)
  • 一些邮件封装(如PhpMailer,如果PHP是您select的毒药;使用PHP的mail()本身是非常可怕的)
  • 你自己的发送函数在一个循环中运行,创build邮件并把它们传递给包装器(注意,如果你的应用程序有内存泄漏,你可能会遇到PHP的内存限制;你可能需要定期回收发送过程,甚至更好,将“创build电子邮件”和“发送电子邮件”分开)

令人惊讶的是,这是很容易的部分。 困难的部分实际上是发送它:

  • 有些服务器会在您发送太多邮件时禁止您,因此您需要随机播放并观看您的队列(例如,发送一封邮件至joe@example.com,然后再发送三封邮件至其他域,然后再发送一封邮件至otheraddress@example.com )
  • 你需要有正确的PTR,SPF,DKIMlogging
  • 处理远程服务器超时,错误configuration的DNSlogging和其他networking信息
  • 处理无效的电子邮件(不, 正则expression式是错误的工具 )
  • 处理取消订阅(许多合法的时事通讯已被重新归类为垃圾邮件,因为许多受挫的用户无法一步退订,而是select“标记为垃圾邮件” – 垃圾邮件filter确实学到了,特别是大型电子邮件提供商)
  • 处理反弹和拒绝(“没有这样的邮箱ojhn@example.com”,“邮箱john@example.com全”)
  • 处理黑名单和从黑名单中删除(当然,你不是发送垃圾邮件,有些收件人不会那么肯定 – 有这么大的名单,有时发生,无论你采取什么预防措施,有些人(例如你不是这样- 严格的竞争对手)甚至可能会错误地将您的邮件报告为垃圾邮件 – 这确实发生了。 平均而言 ,将您从黑名单中删除需要花费数周时间。

而最重要的是,你必须pipe理它的法律部分(各种联邦,州和地方法律,甚至一旦你送到美国以外,甚至不同的法律缠结(注:你无法find乔@ hotmail.com住在拥有世界上最严厉的反垃圾邮件法律的西南埃尔比尼亚))。

我很确定我错过了这个九头蛇的几个头 – 你还确定你自己想要做这个吗? 如果是这样的话,会有另一波浪潮,这次只是发送电子邮件时固有的恼人的问题。 (你看,SMTP是一个存储和转发协议,这意味着你的电子邮件将在互联网上的许多SMTP服务器上进行混洗,希望下一个与最终收件人更接近一点,基本上,电子邮件被发送到一个SMTP服务器,它把它放到它的转发队列中;到时候,它会进一步转发到不同的SMTP服务器,直到它到达给定域的SMTP服务器,这个转发可能立即发生,或者几分钟,几小时,几天,或者从不)。因此,您会看到以下问题 – 其中大部分可能会在途中以及在目的地发生:

  • 远程SMTP服务器不想与您的SMTP服务器通话
  • 您的邮件被标记为垃圾邮件( <blink>不是您的朋友,也不是<font color=...>
  • 你的邮件在几天,甚至几个星期的时候就被传送了(与stream行的观点相反,SMTP旨在尽最大努力在未来某个时候传递信息,而不是现在交付)
  • 您的电子邮件根本就没有交付(已经从第4跳的电子邮件服务器发送,而不是从第5跳的服务器发送),当前持有该邮件的服务器崩溃,数据丢失)
  • 你的电子邮件在途中受到一些braindead服务器的影响(这在base64编码方面可以解决一些问题,但是尺寸会增大,电子邮件看起来更可疑)
  • 你的邮件被寄出,收件人似乎不想要他们(“我确信我没有报名,我记得我一年前做了什么”(当然你是这样做的,先生))
  • 用户使用各种版本的Microsoft Outlook和Internet邮件的特殊处理
  • 向导的学徒模式(一种自我强化的正向反馈循环 – 换句话说,自动电子邮件是对自动电子邮件的答复,作为对…的答复;你真的不想成为这样的人,你会愤怒一半的互联网在你自己)

这将是你的工作,排查和解决这个问题(提示:你不能,主要是)。 经营合法邮寄业务的人知道,最终你不能解决问题,也不能解决问题 – 他们有充分的理由进行研究,logging和概述(甚至可能是一个Powerpoint演示文稿 – 完成声音和冷静的过渡 – 你的老板可以理解),因为他们必须解释这一百万次之前。 另外,对于实际可以解决的问题,他们非常清楚如何解决这些问题。

毕竟,如果你没有气馁,仍然想要做到这一点,那就去吧:甚至有可能find一个更好的方法来做到这一点。 只要知道前面的道路并不容易 – 发送电子邮件是微不足道的,交付是很难的。

人们推荐MailChimp这是一个很好的批量电子邮件供应商。 如果你正在寻找一个好的交易电子邮件供应商,我可以帮忙。

在过去的6个月里,我们使用了四个不同的SMTP供应商,目标是找出哪一个是最好的。

这里是我们发现的一个总结…

AuthSMTP

  • 最便宜的
  • 没有分析/报告
  • 没有跟踪打开/点击
  • 有些发送稍有犹豫

邮戳

  • 非常便宜,但不像AuthSMTP便宜
  • 美丽的cPanel,但没有跟踪打开/点击
  • 发送级别活动跟踪,以便您可以打开发送的单个电子邮件,并查看它的外观和交付数据。
  • 必须使用API​​。 最近引入了通过SMTP发送,但它是越野车。 例如,我们注意到主题行中的引号(“)被删除。
  • 无法发送任何你想要的附件。 必须在批准的文件types列表中,并在一定的大小下。 (10 MB我认为)
  • 需要从名称/地址的集合列​​表。

JangoSMTP

  • 在其他方面相对昂贵 – 在某些情况下超过10倍
  • 丑陋的cPanel,但很好的跟踪打开/点击与电子邮件级别的细节
  • 有时犹豫,有时候,发送。 有两次,发送花了一个小时才能交付
  • 需要从名称/地址的集合列​​表。

SendGrid

  • 不像AuthSMTP那么便宜,但仍然非常便宜。 许多客户每天可以免费发送200次。
  • 体面的cPanel,但没有关于打开/点击跟踪的深入细节
  • 许多API选项。 选项(打开/点击跟踪等)可以通过电子邮件的方式自定义。 入站(回复)电子邮件可以发布到我们的HTTP端点。
  • 发送绝对零犹豫。 发送的每封电子邮件都几乎立即落在收件箱中。
  • 可以从任何名称/地址发送。

结论

SendGrid是Postmark排在第二位的最好的。 我们从来没有看到任何一个发送时间犹豫 – 在某些情况下,我们一次发送数百封电子邮件 – 他们都有最好的投资回报率,具有坚实的function。

这是我最近在PHP上对我的一个更大的系统做的事情:

  1. 用户input电子报文本并select收件人(生成一个查询以便稍后检索电子邮件地址)。

  2. 将通讯文本和收件人查询添加到mysql表中名为* email_queue *

    • (表email_queue的列为“to”“subject”“body”“priority”)
  3. 我创build了另一个脚本,作为cron工作每分钟运行一次。 它使用SwiftMailer类。 这个脚本只是:

    • 在工作时间,发送所有优先级== 0的电子邮件

    • 在下class后,优先发送其他电子邮件

根据主机的设置,我现在可以使用标准的swiftmailer插件(如防淹没和油门)进行节stream…

 $mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(50, 30)); 

 $mailer->registerPlugin(new Swift_Plugins_ThrottlerPlugin( 100, Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE )); 

等等。

我已经扩展了它的方式,超出了这个伪代码,附件和许多其他可configuration的设置,但只要您的服务器正确设置发送电子邮件,它就会工作得很好。 (可能不会在共享主机工作,但理论上应该…)Swiftmailer甚至有一个设置

 $message->setReturnPath 

我现在用来跟踪反弹

快乐的小道! (快乐电子邮件?)