Django不发送电子邮件给pipe理员

根据文档 ,如果DEBUG设置为False并且在ADMINS设置下提供了一些东西,Django将在代码产生500个状态代码时发送一封电子邮件。 我有正确填写电子邮件设置(因为我可以使用send_mail罚款),但每当我故意提出错误的代码,我得到我的500.html模板,但没有错误的电子邮件发送。 什么可能导致Django不这样做?

在我的情况下,原因是缺lessSERVER_EMAIL设置。

SERVER_EMAIL的默认值是root@localhost 。 但是包括我的电子邮件提供商在内的许多电子邮件服务器都不接受来自这些可疑地址的电子邮件 他们悄然放弃了电子邮件。

将发件人电子邮件地址更改为django@my-domain.com解决了这个问题。 在settings.py

 SERVER_EMAIL = 'django@my-domain.com' 

另一种错误的可能性是ADMINS设置的问题。 以下设置将导致邮件发送给pipe理员悄然失败:

 ADMINS = ( ('your name', 'me@mydomain.com') ) 

那有什么问题? 那么ADMINS需要是元组的元组,所以上面需要格式化为

 ADMINS = ( ('your name', 'me@mydomain.com'), ) 

注意尾部的逗号。 如果没有失败的逗号,电子邮件地址将被错误地格式化(然后可能被您的SMTP服务器静默地丢弃)。

我也有同样的情况。 我创build了一个新的项目和应用程序,它的工作,所以我知道这是我的代码。 我跟踪到了settings.py中的LOGGING字典。 几星期前我用Sentry做了一些改动,但由于某些原因,错误刚刚开始。 我改回原来的工作:

 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler' } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, } } 

然后,我慢慢地做了一些改变,并与Sentry合作,并通过电子邮件发送ADMINS。

此外, LOGGINGconfiguration默认与DEFAULT_LOGGING合并,因此,查看django.utils.log.DEFAULT_LOGGING的源代码以了解其他可能会对您的特定情况产生的影响是有用的。

确保你的EMAIL_HOST和EMAIL_PORT在settings.py中正确设置(这些参考你的SMTP服务器)。 这可能是假设你有一个在本地主机上运行的SMTP服务器。

要在本地进行testing,请运行Python的内置testingSMTP服务器:

 python -m smtpd -n -c DebuggingServer localhost:1025 

然后在settings.py中设置这些值

 EMAIL_HOST='localhost' EMAIL_PORT=1025 

触发500错误,你应该看到电子邮件出现在Python的smtpdterminal窗口。

我的虚拟主机提供商 – Webfaction – 只允许通过pipe理员面板中明确创build的电子邮件发送电子邮件。 创build一个固定的问题。

确保你有DEBUG = False

对不起,如果太天真了,但在我的情况下,电子邮件已发送,但直接进入垃圾邮件文件夹。 在尝试更复杂的事情之前先检查你的SPAM文件夹。

另一件值得注意的事情是,如果来自视图的响应没有状态码500,设置handler500可能绕过在500上发送错误的机制。如果你有一个handler500设置,那么在该视图中响应类似这个。

 t = loader.get_template('500.html') response = HttpResponseServerError( t.render(RequestContext(request, {'custom_context_var': 'IT BROKE OMG FIRE EVERYONE'}))) response.status_code = 500 return response 

尝试这个

 # ./manage shell >>> from django.core.mail import send_mail >>> send_mail('Subject here', 'Here is the message.', 'from@example.com',['to@example.com'], fail_silently=False) 

使用to@example.com,您实际上可以收到电子邮件。

虽然已经有一段时间了,但这是我的回应,以便其他人在未来可以受益。

在我的情况下,什么是阻止电子邮件发送到ADMINS列表,当发生错误,是一个应用程序特定的设置。 我使用的是Django-piston,它提供了设置属性PISTON_EMAIL_ERRORS和PISTON_DISPLAY_ERRORS。 相应地设置这些,使得应用程序服务器能够在活塞崩溃时通过邮件通知我。

如果出于某种原因,您将DEBUG_PROPAGATE_EXCEPTIONS设置为True(默认情况下为False),则发送给pipe理员的电子邮件将不起作用。

…然后出现facepalm错误,在开发过程中使用这个错误来阻止电子邮件外出,然后不小心将设置复制到生产中:

 # Print emails to console EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 

(当然,在使用wsgi服务器时你看不到它们被打印到控制台)。 从生产中删除设置固定这个给我。

尽pipe可能并不理想,但我发现使用Gmail作为SMTP主机工作得很好。 在nathanostgard.com有一个有用的指南。

如果你想额外的眼睛检查错别字,请随意张贴您的相关settings.py部分(包括EMAIL_ *,SERVER_EMAIL,ADMINS(只是拿出真正的电子邮件),MANAGERS和DEBUG)。

对于这个问题我有什么值得的,这些build议都不适合我。 事实certificate,我的问题是SERVER_EMAIL被设置为服务器(Webfaction)无法识别的地址。 如果这个网站是 Webfaction上(就像我的其他网站一样),这不会是一个问题,但是因为这是在一个不同的服务器上,所以Webfaction服务器不仅检查正在发送的电子邮件的身份validation, From:价值也是如此。

就我而言,这是mail_adminsinclude_html

当我将include_html设置为True ,电子邮件服务器拒绝发送我的电子邮件,因为它认为我的电子邮件是垃圾邮件。

当我将include_html设置为False时,一切正常。

还有一件事情可能会出错(我只是把它加到列表中,对于那些最终在这里尽pipe所有上面的重要答案的人):

我们的Django设置使用SendGrid作为smtp主机,并在django设置中定义了一个pipe理员电子邮件地址。 这工作一段时间很好,但在某个时候,邮件停止到达。

事实certificate,邮件地址最终在SendGrid“Bounced”列表中,原因不明,导致发往该地址的电子邮件被永远抛弃。 从列表中删除地址,并将其列入白名单,解决了问题。