代码之家  ›  专栏  ›  技术社区  ›  xRobot

如何每周发送100000封电子邮件?[关闭]

  •  -146
  • xRobot  · 技术社区  · 14 年前

    如何在PHP中每周向100000个用户发送电子邮件?这包括使用以下提供程序向订阅服务器发送邮件:

    • 美国在线
    • G邮件
    • 热门邮件
    • 雅虎

    在可能的范围内,所有电子邮件都必须实际发送,这一点很重要。显然,按惯例发送邮件只会造成问题。

    有没有一个PHP库可以简化这个过程?

    3 回复  |  直到 11 年前
        1
  •  681
  •   Community CDub    8 年前

    简短回答: 虽然从技术上讲,每周可以自己发送10万封电子邮件,但最简单、最简单、最便宜的解决方案是 外包这个 专门从事IT的公司之一(i 说“最便宜”:当你尝试做DIY的时候,开发时间(以及金钱)的数量是没有限制的。

    长回答: 如果你决定 绝对想要 要自己做这件事,就要准备好面对一个充满伤害的世界(毕竟,这是我们所说的电子邮件/电子邮件故障)。你需要:

    • 电子邮件内容 不是 垃圾邮件(否则你会在每一步遇到额外的主要障碍,甚至法律影响)
    • 另外,你的内容应该很容易 区分 垃圾邮件——在某些情况下这可能有点困难(我听说某个制药公司不得不全部放弃电子邮件,因为他们的品牌在垃圾邮件中很常见)
    • 一个可配置的你自己的SMTP服务器,当你把10万封电子邮件放到它上面的时候,它不会弯曲(你的ISP的上游服务器在这里不够,你会让ISP非常不高兴;我们使用了两个专用的盒子)
    • 一些邮件包装(例如,如果php是你的毒害选择,phpmailer;使用php mail() 本身就够可怕的了)
    • 您自己的sender函数运行在一个循环中,创建邮件并将其传递给包装器(注意,如果您的应用程序内存泄漏,您可能会遇到PHP内存限制;您可能需要定期回收发送过程,甚至更好地,将“创建电子邮件”和“发送电子邮件”完全分离)

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

    • 有些服务器会在您发送太多邮件时禁止您同时发送,因此您需要洗牌并观察队列(例如,将一封邮件发送到joe@example.com,然后将三封邮件发送到其他域,然后将另一封邮件发送到otheraddress@example.com)。
    • 你需要有正确的 PTR, SPF, DKIM records
    • 处理远程服务器超时、错误配置的DNS记录和其他网络请求
    • 处理无效的电子邮件(不, regex is the wrong tool for that )
    • 处理取消订阅(许多合法的新闻稿已被重新分类为垃圾邮件,因为许多沮丧的用户不能一步取消订阅,而是选择“标记为垃圾邮件”-垃圾邮件过滤器确实了解,特别是对于大型电子邮件提供商)
    • 处理反弹和拒绝(“no such mailbox ojhn@example.com”,“mailbox john@example.com full”)。
    • 处理黑名单并从黑名单中删除(当然,您不会发送垃圾邮件)。有些收信人不会那么确定——有了这么大的名单, 有时会发生,不管你采取什么预防措施。有些人(例如你不那么谨慎的竞争对手)甚至可能会错误地将你的邮件报告为垃圾邮件——这确实发生了。论 平均的 ,你需要数周时间才能从黑名单中除名。)

    除此之外,您还必须管理法律部分(各种联邦、州和地方法律;甚至在美国境外发送不同的法律纠纷(注意:如果joe@hotmail.com居住在世界上最严苛的反垃圾邮件法律所在国的西南埃尔博尼亚,您将无法找到答案)。

    我很确定我错过了这头九头蛇的一些头颅-你仍然确定你想自己做这个吗?如果是这样的话,将会有另一个浪潮,这次只是发送电子邮件时固有的恼人问题。(你看,smtp是一种存储转发协议,这意味着你的电子邮件将在互联网上的许多smtp服务器上被洗牌,希望下一个服务器更接近最终的收件人。基本上,电子邮件被发送到一个SMTP服务器,该服务器将其放入转发队列;当时间到来时,它将进一步转发到另一个SMTP服务器,直到到达给定域的SMTP服务器。这种转发可能会立即发生,或者几分钟、几小时、几天、甚至永远不会发生。)因此,您将看到以下问题-其中大部分问题可能发生在途中以及目的地:

    • 远程SMTP服务器不想与您的SMTP服务器对话
    • 你的邮件被标记为垃圾邮件( <blink> 你的朋友不在这里,也不在 <font color=...> )
    • 您的邮件将在几天甚至几周后送达(与流行观点相反,SMTP旨在尽最大努力在将来某个时间传递邮件,而不是现在传递邮件)。
    • 您的邮件根本未送达(已从hop 4上的电子邮件服务器发送,尚未从hop 5上的服务器发送,当前保存邮件的服务器崩溃,数据丢失)
    • 你的邮件在途中被一些死气沉沉的服务器损坏了(这个服务器用base64编码是可以解决的,但是大小会变大,电子邮件 更可疑)
    • 您的邮件已送达,收件人似乎不想要这些邮件(“我确信我没有报名参加,我完全记得一年前我做了什么”(当然,先生)
    • 具有各种版本的Microsoft Outlook及其 特殊的 处理互联网邮件
    • 巫师学徒模式(自我强化的积极反馈循环-换句话说,自动电子邮件作为对自动电子邮件的回复,作为对……的回复;您 真的? 不想成为挑起这一切的人,因为你会对自己的一半网络感到愤怒)

    它将会是 你的 要排除故障并解决此问题的作业(提示:大多数情况下,您不能)。那些经营合法的群发邮件业务的人知道,最终你无法解决问题,他们也无法解决问题——他们有充分研究、记录和概述的理由(甚至可能是一个PowerPoint演示文稿——包括声音和酷的过渡——你的老板可以理解),因为他们必须解释这一点。一百万次以前。另外,对于实际可以解决的问题,他们非常清楚如何解决。

    如果在这一切之后,你不气馁,仍然想这样做,那就直走吧:甚至有可能你会找到一个更好的方法来这样做。只需知道前方的道路并不容易——发送电子邮件是琐碎的,要让它交付是困难的。

        2
  •  46
  •   sohtimsso1970    14 年前

    人们已经推荐了mailchimp,它是一个很好的批量电子邮件供应商。如果你正在寻找一个好的供应商,为交易电子邮件,我可能能够帮助。

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

    以下是我们发现的情况的摘要…

    AuthSMTP

    • 周围最便宜
    • 无分析/报告
    • 未跟踪打开/单击
    • 有点犹豫,有人发了信

    Postmark

    • 非常便宜,但不如AuthSMTP便宜
    • 漂亮的CPanel,但不跟踪打开/点击
    • 发送级别的活动跟踪,这样您就可以打开一封已发送的电子邮件,查看它的外观和交付数据。
    • 必须使用API。通过SMTP发送最近被引入,但它有问题。例如,我们注意到主题行中的引号(“)被删除。
    • 无法发送所需的任何附件。必须在批准的文件类型列表中,并在一定大小下。(我想是10 MB)
    • 需要从名称/地址设置的列表。

    JangoSMTP

    • 在某些情况下,与其他人相比贵10倍以上。
    • 不好看的CPanel,但对打开/点击的邮件级别的详细信息进行了出色的跟踪
    • 有时在发送时会犹豫。两次发送需要一个小时
    • 需要从名称/地址设置的列表。

    SendGrid

    • 虽然不如AuthSMTP便宜,但还是很便宜。许多客户每天可以免费发送200封邮件。
    • 不错的CPanel,但没有关于打开/点击跟踪的深入细节
    • 很多API选项。选项(打开/单击跟踪等)可以通过电子邮件自定义。入站(回复)电子邮件可以发送到我们的HTTP端点。
    • 绝对零犹豫发送。每一封发送的邮件都会立即进入收件箱。
    • 可以从任何发件人姓名/地址发送。

    结论

    在邮戳排在第二位的情况下,senggrid是最好的。在发送时间上,我们从来没有看到他们中的任何一个有任何犹豫-在某些情况下,我们一次发送几百封电子邮件-而且他们都有最好的投资回报率,因为有一个坚实的特点。

        3
  •  4
  •   ethanpil    13 年前

    下面是我最近在一个更大的系统上用PHP所做的:

    1. 用户输入新闻稿文本并选择收件人(这将生成一个查询,以便以后检索电子邮件地址)。

    2. 将新闻稿文本和收件人查询添加到mysql表中名为*email_queue的行中*

      • (表email_queue有“to”“subject”“body”“priority”列)
    3. 我创建了另一个脚本,它作为cron作业每分钟运行一次。它使用 SwiftMailer 班级。这个脚本很简单:

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

      • 几个小时后,按优先级发送其他电子邮件

    根据主机设置,我现在可以使用标准的Swiftmailers插件(如AntifFlood和Throttle)对其进行节流…

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

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

    等等。

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

    $message->setReturnPath
    

    我现在用它来追踪反弹…

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

    推荐文章