-3

我的一个 PHP/MySQL 站点是一个社交网络,我需要发送许多不同的电子邮件,包括:

1)基于事件:当用户帐户上发生特定操作时发送的电子邮件以通知他们(他们在网站上收到新消息,有人加了他们朋友,有人在他们的墙上发帖等)。

2)定期:定期发送的电子邮件(例如,他们可能认识的人每周六发送的每周列表、讨论网站新功能的每月通讯、他们所在地区的新用户每两周列表等) .

拥有数十万用户,您究竟如何管理向这么多用户发送这么多电子邮件?您如何确保电子邮件不会被 ISP 阻止?您如何处理具有如此多不同电子邮件类别的退订?您如何为每个用户个性化电子邮件?您如何确保用户不会在 1 天、7 天和 30 天的时间内收到太多电子邮件的轰炸?如何将其集成到我现有的站点中?

我有一个每天 100,000 次/每秒 28 次发送限制的 Amazon SES 账户。

我如何使用 Amazon SES 来处理上述所有问题?这听起来令人难以置信的压倒性!

编辑:

由于有些人将我的问题解释为要求 SO 为我设计一个电子邮件管理系统并因此否决了这个问题,让我更清楚一点: 是否有现有的 PHP/MySQL 脚本可以满足我的上述需求并与亚马逊集成SES 和现有网站? 或者我需要从头开始设计这样一个电子邮件管理系统吗?

4

1 回答 1

2

我的实现是给每个用户一个 UserID #(如果你还没有的话),然后我会有 2 个表(嗯,2 个主用户表)。第一个是 users_main 之类的东西,您可以在其中存储他们的基本信息、UID、姓名、电子邮件等,等等,我会将其中一个字段设为“通知”,这将是一个简单的布尔值 True False,True 表示他们这样做想要接收基于事件的通知,而 false 表示它们不接收。将其包含在主数据库中的原因是,如果他们确实想收到电子邮件,您将需要他们的信息,因此您已经缓存了他们的信息。

第二个表将是 users_periodic 或类似的。这实际上只是想要获取时事通讯的 UID 列表,以及您需要发送它的任何信息(例如,列可能是 UID、电子邮件、姓名)。然后,当您进行查询时,只需从该表中选择所有行。使您的数据库查找更容易一些。

理想情况下,我相信你会运行两个独立的服务器/数据库,因为当它运行时,它会吸收你的整个 I/O 直到它完成,如果服务器所做的几乎所有事情都是拉起用户统计数据,那就没问题了,并且只需制作一个 API 或程序,在用户注册时事通讯时将其发送到电子邮件信息服务器。

您也可以对此进行速率限制,它可能会变得更复杂一些,但我对此的基本实现是进行全面的 SQL 查询,从而为该程序分配 X MB 的 RAM,并且该程序只是循环并用它填满它的 RAM SQL 结果(这意味着它需要一种粗略的方法来估计查询将占用的 RAM 量,以及一种知道它获得多少行或下一个 UID 或其他东西的方法)。这里的问题是您不能一次只抓取所有这些值并从查询中检索一个值,因为这会阻塞数据库。你必须全部拿走,或者拿走你想要的并关闭查询。

就确保他们不会收到太多电子邮件而言,每天相对容易,只需创建一个今天发送的电子邮件列,让脚本在向他们发送电子邮件之前检查数字,然后让您的 fetch 将该值增加1 我们走了。然后只需制作另一个脚本,在午夜将这些值重置为 0。对于每周和每月,我不会打扰,无论如何这些都会受到每日费率的限制,并且您将不得不跟踪单个消息日期以确保您不会超过,这只是不值得.

至于阻止你的人,你或多或少无法控制它。您不应该被 SES 帐户阻止,除非您发送的垃圾邮件太多。如果你确实被屏蔽了,你真的无能为力,你已经把它列入了他们的禁止名单,你或多或少只需要处理它。你可以给他们寄好信,但我认为他们不会太在意,他们或多或少会做他们想做的事。

编辑:作为对您的编辑的回应,如果您确实拥有数十万用户,那么您不会想要使用预制的东西。如果您真的在谈论发送这么多电子邮件(对于这么多用户,您每天将发送至少十万封电子邮件),您将需要定制一些对您的设置和设置有效的东西相应地提高你的 SQL。我不知道有什么系统可以为您做到这一点,但是在一些更简单的脚本语言中进行基本设置不会太糟糕,尽管显然像 C 那样编译的东西会在您的系统上运行得更轻松。

于 2013-05-08T16:33:00.930 回答