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

2024-01-20

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

  • AOL
  • G-Mail
  • Hotmail
  • Yahoo

重要的是,所有电子邮件都应尽可能实际交付。显然,仅仅按照惯例发送邮件只会产生问题。

有没有 PHP 库可以让这件事变得更简单?


简短回答:虽然从技术上讲,您自己每周发送 10 万封电子邮件是可行的,但最简单、最容易且最便宜的解决方案是外包这个到一家专门从事该领域的公司(我did说“最便宜”:在尝试 DIY 时,您可以投入的开发时间(以及金钱)是没有限制的。

长答案:如果你决定你绝对想要要自己做到这一点,请为一个受伤的世界做好准备(毕竟,这是我们谈论的电子邮件/电子邮件失败)。你需要:

  • 电子邮件内容is not垃圾邮件(否则您在每一步都会遇到额外的主要障碍,甚至法律后果)
  • 此外,您的内容应该易于理解区分来自垃圾邮件 - 在某些情况下这可能有点困难(我听说某制药公司不得不放弃电子邮件,因为他们的品牌名称在垃圾邮件中很常见)
  • 一台您自己的可配置 SMTP 服务器,当您向其转储 100k 电子邮件时,该服务器不会崩溃(您的 ISP 的上游服务器在这里不够用,您会让 ISP 非常不高兴;我们使用了两个专用的盒子)
  • 一些邮件包装器(例如 PhpMailer,如果 PHP 是您选择的毒药;使用 PHPmail()本身就够可怕的了)
  • 您自己的发件人函数循环运行,创建邮件并将它们传递给包装器(请注意,如果您的应用程序存在内存泄漏,您可能会遇到 PHP 的内存限制;您可能需要定期回收发送进程,甚至更好,将“创建电子邮件”和“发送电子邮件”完全解耦)

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

  • 当您发送太多靠近在一起的邮件时,某些服务器会禁止您,因此您需要洗牌并观察您的队列(例如,将一封邮件发送到[电子邮件受保护] /cdn-cgi/l/email-protection,然后三个到其他域,然后再另一个到[电子邮件受保护] /cdn-cgi/l/email-protection)
  • 你需要有正确的PTR、SPF、DKIM 记录 http://www.codinghorror.com/blog/2010/04/so-youd-like-to-send-some-email-through-code.html
  • 处理远程服务器超时、错误配置的 DNS 记录和其他网络问题
  • 处理无效的电子邮件(并且不,正则表达式是错误的工具 https://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378)
  • 处理取消订阅(许多合法的新闻通讯已被重新归类为垃圾邮件,因为许多沮丧的用户无法一步取消订阅,而是选择“标记为垃圾邮件”——垃圾邮件过滤器确实会学习,尤其是大型电子邮件提供商)
  • 处理退回邮件和拒绝邮件(“没有这样的邮箱[电子邮件受保护] /cdn-cgi/l/email-protection“,“邮箱[电子邮件受保护] /cdn-cgi/l/email-protection full")
  • 处理黑名单和从黑名单中删除(当然,您不是在发送垃圾邮件。有些收件人不会那么确定 - 对于如此大的列表,它will无论您采取什么预防措施,有时都会发生这种情况。有些人(例如您不那么谨慎的竞争对手)甚至可能会错误地将您的邮件报告为垃圾邮件 - 这种情况确实发生了。在average,需要几周时间才能将自己从黑名单中删除。)

最重要的是,你必须管理它的法律部分(各种联邦、州和地方法律;甚至一旦你发送到美国境外,你就无法找到不同的法律混乱(注意:你无法找到是否[电子邮件受保护] /cdn-cgi/l/email-protection住在埃尔波尼亚西南部,该国拥有世界上最严厉的反垃圾邮件法))。

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

  • 远程 SMTP 服务器不想与您的 SMTP 服务器通信
  • 您的邮件被标记为垃圾邮件(<blink>不是你的朋友,也不是<font color=...>)
  • 您的邮件会晚几天甚至几周送达(与流行观点相反,SMTP 的设计目的是尽最大努力在未来某个时间送达邮件,而不是现在送达)
  • 您的邮件根本没有送达(已从跃点 #4 上的电子邮件服务器发送,尚未从跃点 #5 上的服务器发送,当前保存邮件的服务器崩溃,数据丢失)
  • 你的邮件在途中被一些脑残服务器破坏了(这个问题可以通过base64编码来解决,但随后大小会增加并且电子邮件looks更加可疑)
  • 您的邮件已送达,但收件人似乎不想要它们(“我确信我没有注册此邮件,我清楚地记得我一年前做了什么”(当然,您这样做了,先生))
  • 使用不同版本的 Microsoft Outlook 及其应用程序的用户special处理互联网邮件
  • 向导的学徒模式(自我强化的积极反馈循环 - 换句话说,自动电子邮件作为对自动电子邮件的回复作为对...的回复;您really不想成为引发这一事件的人,因为你会激怒半个互联网的人)

它将是your解决这个问题的工作(提示:大多数情况下你不能)。经营合法群发邮件业务的人知道,最终你无法解决它,他们也无法解决它 - 并且他们对原因进行了充分研究、记录和概述(甚至可能作为 Powerpoint 演示文稿) - 配有声音和酷炫的过渡 - 您的老板可以理解),因为他们之前已经解释过这一点一百万次了。另外,对于真正可以解决的问题,他们非常清楚如何解决。

如果在经历了这一切之后,您并不灰心并且仍然想这样做,那就继续吧:您甚至可能会找到更好的方法来做到这一点。要知道,前面的路并不容易——发送电子邮件是微不足道的,而送达它却很难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何每周发送 100,000 封电子邮件? [关闭] 的相关文章

随机推荐

  • 目前 WPF 最好的空闲时间选择器是什么?

    我正在寻找一个简单的时间选择器WPF 的控件 我找到了这个 http marlongrech wordpress com 2007 11 18 time picker http marlongrech wordpress com 2007
  • Laravel 社交名流的名字和姓氏

    我正在使用 Laravel 的 Socialite 将社交身份验证添加到应用程序中 我可以检索全名 但不能分别检索名字和姓氏 回调发生且社交名流处理后 用户已成功检索 如果我要转储我从中恢复的用户 user this gt social g
  • 为arm64构建OpenSSL FIPS

    我找到了为arm64构建非FIPS openssl的参考 但我需要构建FIPS版本 项目如https github com GotoHack iOS openSSL FIPS https github com GotoHack iOS op
  • 运算符不存在:json = json

    当我尝试从表中选择一些记录时 SELECT FROM movie test WHERE tags dramatic women political json sql代码抛出错误 LINE 1 SELECT FROM movie test W
  • 通过注释抑制 IntelliJ IDEA 中的重复警告

    从版本 15 开始 IntelliJ 警告我有关代码重复的问题 https www jetbrains com help idea 2016 1 analyzing duplicates html origin old help 在某些情况
  • 如何在android中点击按钮打开下面的自定义布局对话框?

    我想在点击按钮下方创建下拉自定义对话框 单击计数器按钮 布局将显示在按钮下方 我看到了很多链接 但他们只打开列表 操作栏下拉打开和关闭项目样式 https stackoverflow com questions 15824793 actio
  • 如何在 Python 中创建通用接口?

    我想在 Python 中创建与此等效的内容 static class Event static class MyEvent extends Event interface Filter
  • React / Redux:mapStateToProps 实际上并未将状态映射到 props

    我在一个项目中使用 React 和 Redux 但在实现启用 禁用按钮的功能时遇到问题 我已经能够 触发一个方法 让该方法触发动作创建者 调度一个动作 在减速器中捕获该操作并创建一个新的更新状态 在 Redux DevTools 中查看更新
  • 在 for 循环中引用/取消引用向量元素

    在下面的代码中 我想保留number list 迭代之后 因为 into iter that for默认使用会消耗 因此 我假设n i32我可以获得的值n通过解除引用 fn main let number list vec 24 34 10
  • 如何在JTable中添加JCheckBox?

    首先 我为我的英语疏忽表示歉意 我将解释我所有的问题 首先我想在我拥有的 JTable 中使用 JCheckBox 我正在从数据库的列索引 0 和 1 中检索学生 ID 和学生姓名 我希望第三列应该是缺席 在场 最初将通过 JCheckbo
  • TinyMCE - 附加到通过 AJAX 调用加载的 div

    我知道以前有人问过这个问题 但我正在尝试通过 jQuery AJAX 加载一些附加到 tinymce 实例的 div 在AJAX加载的页面中 有几个tinymce div 它们是由PHP循环创建的 div p Some text p div
  • 无法在 C# 中使用 Sendkeys 发送下划线?

    我很无聊 所以我尝试编写一个程序 在按 ctrl shift L 时写出不赞成的笑脸 脸 现在一切正常 除了笑脸中的下划线 它根本不会被写出来 这是我首先使用的 SendKeys Send 我尝试过各种方法 比如在下划线周围添加 括号 当然
  • R/Igraph 在边列表中显示边权重?

    当将图形对象作为边列表查看时 有什么方法可以显示边权重吗 我想本着以下精神做一些事情 get edgelist graph attr weight 以便查看与节点旁边列出的权重的边缘配对 但这似乎是不允许的 我知道如何查看权重的唯一方法是将
  • iPhone:当其他视图存在ViewController时如何防止关闭键盘

    我的 iPhone 应用程序出现问题 有一个 2UIViewController First UIViewController with UITextField和键盘向上 一旦我将打开其他UIViewController有了presentV
  • 为什么我需要在 swift 中使用下划线?

    Here https www weheartswift com tuples enums 它说 注意 意思是 我不关心那个值 但是来自 JavaScript 我不明白这意味着什么 我可以打印这些函数的唯一方法是在参数之前使用下划线 func
  • Rx.Net - 处理 Observable.Create() 期间创建的资源

    我正在尝试将 Rx net 用于项目 但我遇到了如何正确处置在Observable Create 并发出OnNext 我的设置如下所示 希望仅缩短到相关位 var obs Observable Create
  • 设置gunicorn与systemd一起运行

    正在尝试设置gunicorn与一起运行systemd 控制文件是 etc systemd system gunicorn service测试的输出是 root samuel pc systemctl start gunicorn Faile
  • git Notes 是将类别样式信息添加到提交的预期方法吗?

    答案是我可以将元数据添加到 git 提交吗 或者我可以在 gitk 中隐藏一些标签吗 https stackoverflow com questions 2683248 can i add metadata to git commits o
  • 这段代码定义明确吗?

    这段代码取自正在进行的讨论here https stackoverflow com questions 4638364 undefined behavior and sequence points reloaded 4638718 4638
  • 如何每周发送 100,000 封电子邮件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi