如何有效地实施新闻通讯系统以防止重复的电子邮件?

时间:2015-08-31 21:55:37

标签: php mysql email amazon-web-services amazon-ses

我们运营着一个拥有约500,000名活跃客户的电子商务网站。我们通过外部邮件服务(https://www.campaignmonitor.com/)定期发送新闻通讯,但随着公司的发展和我们获得更多客户,我们的新闻通讯费用会增加。 我最近遇到了Amazon SES,这对我们来说非常合适,因为它们很便宜,而且由于我们已经将AWS用于我们的服务器,因此它使事情更容易维护。我知道有更便宜的替代品,但我更愿意坚持亚马逊SES。

我们假设我在我的系统中创建了一个时事通讯,向每个今天过生日的人发送电子邮件。恰好有400,000人今天过生日,所以发送了400,000封电子邮件。 第二天,剩下的10万人生日以及昨天已经收到生日电子邮件的10万人,但他们的出生日期改为现在,因为他们在注册时输入错误。该系统现在可以发送200,000封电子邮件,但应该知道只发送100,000封电子邮件,因为100,000封邮件已经收到了这段时间(365天)的电子邮件。

我遇到的问题是数据库和脚本的效率。

第一天,我将40万人的电子邮件地址存储在一个名为" sent"的表中。 在第二天,我检索要发送到的所有电子邮件地址的列表。然后我有以下选择:

  • 查询"已发送"表200,000次查看要发送到哪个电子邮件地址 - 极其低效,加上运行站点本身的服务器上的不必要负载。
  • 检索整个"已发送的"表,存储到一个数组并相应地过滤 - 快速(只需1个DB查询),但需要大量的RAM。这是我目前的工作方式,但显然我收到了PHP内存耗尽的错误,因此它不再可行,特别是随着网站的增长。
  • 按字母顺序对200,000个电子邮件地址进行排序,并查询"已发送的"批量表,例如所有A电子邮件地址,所有B电子邮件地址等。 - 快速并且应该使用较少的RAM,具体取决于批处理条件,但如果所有200,000个电子邮件地址都以字母S开头怎么办?
  • 别的什么?!

我意识到这些是非常极端的例子,这些例子在真实环境中永远不会发生,但我更愿意(现在)正确地实现这一点,而不必在将来再次重新审视它。

如果Amazon SES内置了此功能,我很想知道我在哪里可以找到它!我已经搜索了他们的文档,但我无法看到它。

有没有人在此领域有任何经验,或有任何建议?我试图想出一个好的解决方案几天来一直绞尽脑汁,但我无法想出任何东西。

HELP! :)

编辑:我正在使用MySQL。我已经研究过No-SQL,但感觉不是必要的。

编辑:生日礼物只是简报的一个例子。它应该是一个完全通用的系统,它不依赖于数据包含的任何预定义概念。

编辑:服务器已经实现了良好的电子邮件实践,例如SPF,DKIM等。

编辑:我决定重构一些东西并创建我自己的文件和/或基于内存的索引器,它在一定程度上解决了这个问题。案件已经关闭,至少目前是这样。

1 个答案:

答案 0 :(得分:2)

您可以编写自己的系统或利用现有工具。在谷歌Sendy https://sendy.co/是第一个结果为'php mysql SES时事通讯'根据您发送的标签,它似乎在你的小巷里。有1000多个其他基于PHP / Mysql的新闻通讯程序可能适合您。那个看起来很整洁。

关注服务器负载。我会把一个"小" AWS中的实例,仅用于您的电子邮件系统。这样您就不必担心长时间运行的流程或超时会导致生产网站出现问题。 200,000或500,000条记录真的不是那么多。我打赌你花更多的时间等待Amazon SES做出回应而不是实际等待查询返回或解析。