以异步方式发送电子邮件的简单方法

时间:2014-02-13 19:38:57

标签: django python-multithreading django-commands

我正在运行django应用程序,当某些事件发生时,我想将电子邮件发送给收件人列表。

我知道使用Celery是一个明智的选择,但我想知道是否还有另一个最简单的方法,无需安装代理服务器,主管来处理在后台运行的守护程序进程。 ..

我想找到一种更简单的方法,并在需要时将其改为芹菜。我不负责生产服务器,我知道运行它的人会遇到很大的麻烦,所有的配置都能正常运行。我正在考虑触发一个django命令,该命令使用多处理库或类似的东西打开几个进程。

2 个答案:

答案 0 :(得分:0)

这通常是队列的一个很好的用例。如果您不想在本地运行队列服务器(如Celery),则可以选择几个选项。

  1. 有许多SaaS队列服务,例如Amazon SQS(以及任何其他数量)可以挂钩到您的应用程序,而无需在您的计算机上运行其他服务。

  2. 您可以使用数据库和cron作业实现一种“穷人的队列”。在这种情况下,当您的事件发生时,您可以将一些信息插入数据库。然后,您可以通过management command启动cron作业,扫描您的“排队消息”表并定期发送电子邮件。请注意,只有当您的消息队列保持相对较小时,这才真正起作用 - 如果要发送的消息太多,您将开始考虑让多个进程发送消息,从而打开排队系统的蠕虫病毒。意思是首先解决。

答案 1 :(得分:0)

如果您不想实施芹菜(在我看来设置起来并不是非常困难),那么您最好的选择可能是使用您的数据库实现一个非常简单的队列。它可能会按照以下方式工作:

  1. 系统确定需要发送电子邮件并在数据库中创建一个状态为“已创建”或“已排队​​”的行
  2. 另一方面,会有一个定期扫描“队列”的进程。如果他们发现要发送的任何内容(在这种情况下,状态为“已创建/排队”的任何行),他们会将状态更新为“发送”。然后,该过程将继续发送电子邮件,最后将状态更新为已发送。
  3. 这将负责异步发送对象并在出现问题时跟踪所有电子邮件的状态。

    如果其他更新对您的数据库过于沉重,您可能会使用Redis后端作为您的队列。