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


AOL
G-Mail
Hotmail
Yahoo

重要的是,在可能的范围内,实际发送所有电子邮件。显然,仅按常规方式发送邮件只会产生问题。

是否有一个PHP库可以简化此过程?

#1 楼

简短的答案:虽然从技术上来说,您每周可以自己发送10万封电子邮件,但最简单,最简单,最便宜的解决方案是将其外包给专门从事此工作的公司之一(我确实说过“最便宜”:尝试自己动手时可以花上的开发时间(以及金钱)。

长答案:如果您确定自己绝对想自己做,那么为遭受伤害的世界做准备(毕竟,这是我们正在谈论的电子邮件/电子失败)。您需要:


不是垃圾邮件的电子邮件内容(否则,您将在每个步骤上遇到其他主要障碍,甚至是法律后果)
,您的内容应该很容易与垃圾邮件区分开-在某些情况下可能很难做到这一点(我听说某家制药公司几乎不得不放弃电子邮件,因为它们的商标在垃圾邮件中非常普遍)
您自己的一台可配置SMTP服务器,当您将10万封电子邮件转储到该服务器时,它不会弯曲(您的ISP的上游服务器在这里不够用,您会使ISP感到非常不满;我们使用了两台专用框)
一些邮件包装器(例如PhpMailer,如果PHP是您的选择毒药;使用PHP的mail()本身就够恐怖了)
您自己的发件人功能可以循环运行,创建邮件并将它们传递给包装器(请注意,如果您的应用有内存泄漏,则可能会遇到PHP的内存限制;您可能需要定期回收发送过程,甚至更好,完全取消“创建电子邮件”和“发送电子邮件”的耦合)

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


当您发送过多的邮件并排在一起时,某些服务器将禁止您,因此您需要改组并监视队列(例如,向joe发送一封邮件) @ example.com,然后是三个到其他域,然后是另一个到otheraddress@example.com)
您需要具有正确的PTR,SPF,DKIM记录

处理远程服务器超时,配置错误的DNS记录和其他网络问题
处理无效的电子邮件(不,正则表达式是错误的工具)
处理取消订阅(由于以下原因,许多合法新闻通讯已被重新分类为垃圾邮件):许多沮丧的用户无法一步一步退订,而是选择“标记为垃圾邮件”-垃圾邮件过滤器确实可以学习,尤其是对于大型电子邮件提供商而言)
处理反弹和拒绝(“没有这样的邮箱ojhn @ example.com”,“邮箱john@example.com已满”)
处理黑名单和将其从黑名单中删除(当然,您不是在发送垃圾邮件。某些收件人并不确定-如此大的列表,无论您采取何种预防措施,有时都会发生这种情况,有些人(例如,您并不那么谨慎的竞争对手)甚至可能会误报您的邮件为垃圾邮件-确实会发生,平均来说,这需要花费数周的时间从黑名单中删除。)

最重要的是,您必须管理它(各种联邦,州和地方法律;甚至在您将邮件发送到美国以外后,法律的纠缠程度也有所不同(请注意:您无法找到joe@hotmail.com是否居住在西南埃尔博尼亚西南部,该国是世界上最严厉的反垃圾邮件法律)。

我敢肯定,我错过了一些这类的九头蛇-您还确定要自己做吗?如果是这样,将会掀起另一波浪,这次只是发送电子邮件中固有的烦人问题。 (您会看到,SMTP是一种存储转发协议,这意味着您的电子邮件将在Internet上的许多SMTP服务器之间进行混洗,以期下一封电子邮件与最终收件人更接近。)电子邮件被发送到SMTP服务器,然后将其放入转发队列;时间到了,它将进一步转发到另一台SMTP服务器,直到到达给定域的SMTP服务器为止。 ,或者几分钟,几小时或几天,甚至永远不会。)因此,您将看到以下问题-大多数问题可能会在途中和目的地发生:


远程SMTP服务器不想与您的SMTP服务器进行通信
您的邮件被标记为垃圾邮件(<blink>不是您的朋友,也不是<font color=...>
您的邮件已交付几天,甚至延迟了数周(与流行观点相反,SMTP旨在尽最大努力在将来的某个时候传递消息-而不是现在传递)
我们的邮件根本没有送达(已从第4跳上的电子邮件服务器发送,尚未从第5跳上的服务器发送,当前保存该消息的服务器崩溃了,数据丢失了)
您的邮件是在途中受到一些死灵服务器的干扰(该服务器在某种程度上可以使用base64编码来解决,但是大小增加了,电子邮件看上去也更加可疑)
您的邮件已经送达,收件人似乎不想要它们(“我敢肯定我没有注册,我记得我一年前所做的事情”(先生,你当然会这样做)。
使用各种版本的Microsoft Outlook及其对Internet邮件的特殊处理的用户
向导的学徒模式(自我强化的积极反馈循环-换句话说,自动电子邮件作为对自动电子邮件的答复...;您确实不希望成为取消此请求的人,因为您可能会激怒自己一半的互联网)

,排查并解决这个问题将是您的工作(提示:您基本上不能这样做)。经营合法群发邮件业务的人都知道,最终您无法解决它,他们也无法解决-他们有充分研究,记录和概述的原因(甚至可以作为Powerpoint演示文稿进行) -包括声音和很酷的过渡效果-您的老板可以理解),因为他们必须在一百万次之前对此进行解释。另外,对于实际上可以解决的问题,他们非常了解如何解决。

如果毕竟,您不灰心并且仍然想要这样做,那就继续吧:甚至您可能会找到更好的方法来做到这一点。只是知道前进的道路并不容易-发送电子邮件是微不足道的,很难发送。

评论


@难以捉摸几乎没有浪费,这就是反转徽章的全部意义!

–杰夫·阿特伍德
2010-10-13 5:01

@Piskvor:如果您适当地安排邮件时间,则可以发送任意数量的邮件。当您发送太多邮件太快时,就会发生麻烦。我通过ASP.Net缓存回调以每分钟20封邮件的周期向订户发送了约30,000封时事通讯。它已经工作了两年多了,从未被阻止。

– sajidnizami
2010-10-13 5:11



@Syed Sajid Nizami:我确实在第二个列表中提到了这一点。请注意,节流并不是一个万事俱备的解决方案,因为您的新闻通讯大约需要1500分钟(30000/20 = 1500,比一天的时间更长)发送出去。对于一封10万封电子邮件,这需要超过三天的时间;对于大批量的电子邮件,当您要发送另一封时事通讯时,您将无法完成。

– Piskvor离开了建筑物
10-10-13在6:57

当邮件被阻止时,服务器将被列入黑名单,而我的网络管理员已为此设置了一个通知,我们提交请求以将服务器从黑名单中删除。

– sajidnizami
2010-10-17 12:44

@Bulwersator:取决于您看的地方-参见“滤泡”。从这里观察时仍然是第三击。

– Piskvor离开了建筑物
2012年4月30日在8:48



#2 楼

人们推荐MailChimp,这是批量电子邮件的良好供应商。如果您正在寻找交易电子邮件的优秀供应商,我可能会为您提供帮助。

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

这里是我们发现的内容的摘要...



最便宜的
没有分析/报告
没有跟踪打开/点击情况
在某些发送上略有犹豫

邮戳



很便宜,但不如AuthSMTP
漂亮的cpanel,但对打开/点击没有跟踪
发送级活动跟踪,因此您可以打开一封已发送的电子邮件,并查看其外观和传递数据。
必须使用API​​。最近引入了通过SMTP发送,但存在问题。例如,我们注意到主题行中的引号(“)被删除。
无法发送您想要的任何附件。必须在已批准的文件类型列表中,并且必须在一定大小以下。(我认为10 MB)
需要一组姓名/地址列表。

JangoSMTP


与其他项相比价格昂贵-在某些情况下超过10倍
cpanel不好,但在打开/单击时具有很好的电子邮件级别详细信息
在发送时有时会有些犹豫。两次,发送要花一个小时才能发送
,需要从姓名起的一组清单/ addresses。

SendGrid


不如AuthSMTP便宜,但仍然很便宜,许多客户每天可以免费发送200条邮件。
面板不错,但没有关于打开/单击跟踪的深入详细信息
很多API选项。选项(打开/单击跟踪等)可以根据逐个电子邮件进行自定义。入站(回复)电子邮件可以被发布到我们的HTTP端点。
sen的绝对零犹豫ds。发送的每封电子邮件几乎都立即进入收件箱。
可以从任何名称/地址发送邮件。

结论

SendGrid是最好的,其中Postmark位居第二。在这两种情况下,我们从未在发送时间上有任何犹豫-在某些情况下,我们一次发送了数百封电子邮件-而且由于功能强大,它们都具有最佳的投资回报率。

#3 楼

这是我最近在一个较大的系统上使用PHP所做的事情:


用户输入新闻稿文本并选择收件人(这将生成查询以检索电子邮件地址以供以后使用)。 br />
将通讯文本和收件人查询添加到mysql表中名为* email_queue *


的行中(表email_queue的列为“至”到“主题” body“” priority“)



我创建了另一个脚本,该脚本作为cron作业每分钟运行一次。它使用SwiftMailer类。该脚本很简单:


在工作时间内,优先发送所有电子邮件== 0
,下班后发送其他电子邮件,



现在,根据主机设置,我可以使用标准的swiftmailers插件(例如防洪和节流)对其进行节流...

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




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


等等,等等。

我已经扩展了此伪代码,包括附件和许多其他可配置设置,但它工作得很好只要您的服务器设置正确即可发送电子邮件。 (可能无法在共享主机上工作,但从理论上讲应该如此...)Swiftmailer甚至有一个设置

$message->setReturnPath


我现在用来跟踪跳动...

快乐足迹! (祝您电子邮件愉快?)