我设置了 Django Mailer 并将两个命令添加到 crontab:
* * * * * root python /srv/www/cpm/manage.py send_mail >> /srv/www/cpm/cron_mail.log
0,20,40 * * * * root python /srv/www/cpm//manage.py retry_deferred >> /srv/www/cpm/cron_mail_deferred.log
CPM
是保存我的 Django 项目的目录。
重启后,cron
我启动了 Django 项目,点击一个链接,将大约 600 封电子邮件放入 Django Mailer 队列。该cron
命令选取了排队的消息并开始发送电子邮件。
目前,每封电子邮件都是发给我的,用于测试目的。正如预期的那样,电子邮件开始大量涌入。
但是,大约 30 封电子邮件之后,我想停止发送电子邮件,因为我想做一些更改,然后重新开始该过程(我现在正在测试该应用程序)。我进入MySQL
并删除了表中的所有记录django_mailer_queuedmessages
,以为这样可以停止任何进一步的电子邮件。
电子邮件不断涌来。
然后我删除了表中的所有记录django_mailer_messages
,希望那将停止发送电子邮件。
电子邮件不断涌来!
然后,我删除了每个以 开头的表中的所有记录django_mailer...
,并注释掉了其中crontab
的行django-mailer
(上面两行),然后重新启动cron
。
电子邮件仍在发送中!!
什么鬼!?它们怎么还在发送?有趣的是,每封电子邮件都显示它是在我点击时发送的Send All Emails
(大约一个小时前),而不是它们到达我的收件箱时发送的。所以,我真的不知道发生了什么,也不知道如何阻止这种电子邮件的猛烈攻击!
你看,刚刚收到另一封电子邮件...
编辑1
我通过 Google Apps Business 电子邮件帐户发送所有电子邮件。我只是以标准方式在我的 Python 代码中连接到 Gmail...
编辑2
它终于停止了……我最终kill
向启动命令的两个进程发送了一个信号cron
。我能想到的唯一事情是 django_mailer 将所有电子邮件存储在内存中并从那里发送。我原以为 django-mailer 会从队列(它自己的queue
模型)中挑选一封电子邮件,发送它,然后获取下一条消息。事实似乎并非如此,因为我可以删除整个队列,但消息仍在发送。显然,它们存在于存储在 MySQL 数据库中的队列以外的其他地方。
有点令人困惑...
答案1
三步解决方案:
从 crontab 中删除条目
我不知道它是否仍每 60 秒发送一封电子邮件,但请删除或注释掉这些行,以确保不会注入新邮件。转储您的邮件队列
…以适合您的 MTA 软件的任何方式(由于您没有指定您的 MTA,因此我无法更具体)。这应该可以清除所有等待发送的邮件(您可能有大量积压)手动测试和观察系统的行为 这将让您确定发生了什么,以及如何防止它将来再次发生。
答案2
确保“django”本身没有发送邮件消息。取消设置您的 ADMIN 指令。
旧设置.py
ADMINS = (('Bugs Bunny', '[email protected]'),)
MANAGERS = ADMINS
新的设置.py
ADMINS = ()
MANAGERS = ADMINS
这将防止 django 本身在配置错误时发送电子邮件,并且DEBUG = False