我有一个流程,每周发送大约1500封邮件。
我打算在django
中放入crontab
命令的过程。该过程具有一个循环,在该循环中可以验证用户是否要接收电子邮件以及接收电子邮件的语言,例如:
for user in users:
# Check if user accept emails
if user['send_mail']:
# Get language to email
lang = ""
if user['lang'] == "es":
lang = "es"
elif user['lang'] == "fr":
lang = "fr"
else:
lang = "en"
email = user['email']
# Send email
send_mail()
它不多,可以发送1500封邮件,但是我想使其保持可伸缩性,因为邮件的数量取决于平台的注册用户数。
我不知道它现在是否可以扩展,还是最好使用redis queue
或celery
。
我正在使用Amazon Simple Emails Service
(SES
)。
答案 0 :(得分:1)
您有两个不同的问题要处理:
首先,虽然发送1500封电子邮件非常容易,但是对于是否可以接收这1500封邮件有复杂的现实。您的电子邮件很容易被阻止或转移到垃圾邮件文件夹。您的整个域可能会被某些邮件服务阻止。为了限制出现这些困难的可能性,您需要正确设置DKIM和SPF记录。.此外,商业邮件发件人还需要采取其他措施来保持顺畅。因此,如果您对挑战不感兴趣,那么最好使用像SES这样的专业服务。
但是可以肯定的是,即使在同一台机器上,也可以仅使用postfix或任何其他邮件中继软件在本地设置自己的邮件服务器。设置您自己的DNS记录,然后将邮件直接发送到没有SES或其他任何人要处理的..但是,您必须处理任何垃圾邮件阻止程序问题。
第二,假设您使用SES,则必须确保将所有电子邮件安全地从您自己发送到Amazon。这就是麻烦所在。您不想生成一半的电子邮件并发送它们,然后由于网络中断而遇到问题..并且无法只发送那些没有发送而没有发送的电子邮件重发所有。完美编写代码可能有些棘手。
从技术上讲,最简单的解决方案是安装将Amazon配置为其“ smarthost”的本地SMTP中继服务器(例如postfix)。将django配置为使用“ localhost”作为其SMTP服务器。
有了这个选项,当您的cron作业运行时,只需要几秒钟,因为所有电子邮件都直接进入本地驱动器上的postfix目录,并在那里排队。
然后,由于将Postfix配置为将SES的SMTP服务器作为smarthost(有时称为智能中继),因此不会直接将任何电子邮件发送给收件人,而是将所有电子邮件转发给SES,以将其发送给最终收件人。如果这样做有任何问题,则后缀(或您喜欢的任何邮件中继软件)将重试每条消息,直到一切正常。
它是为此而设计,经过尝试,测试,有效的...
这对您来说是最简单的路径。
如果您选择使用SES REST API,则代码的责任是确保每条消息仅一次且仅一次发送到Amazon。如果您循环浏览1000封电子邮件,然后出现网络故障或崩溃,并且您无法发送最后500封电子邮件,那么这将是您的代码无法从中恢复的问题,而无需再次发送前1000封电子邮件。因此,排队系统很有用。芹菜或仅RabbitMQ本身都可以工作。或者只是通过在数据库中存储需要发送哪些消息的记录来排队,然后在发送每封电子邮件时删除这些记录。
但是编写在每种情况下都能完美运行的代码可能会很棘手。有时可以重新发明轮子。有时您需要一个更好的轮子:)但是在这种情况下,我认为您最好使用SMTP中继服务器。