【发布时间】:2010-11-27 16:47:51
【问题描述】:
根据documentation,如果DEBUG 设置为False 并且在ADMINS 设置下提供了某些内容,那么只要代码引发500 状态代码,Django 就会发送一封电子邮件。我正确填写了电子邮件设置(因为我可以很好地使用 send_mail),但每当我故意输入错误代码时,我都会得到我的 500.html 模板,但不会发送错误电子邮件。什么可能导致 Django 不这样做?
【问题讨论】:
根据documentation,如果DEBUG 设置为False 并且在ADMINS 设置下提供了某些内容,那么只要代码引发500 状态代码,Django 就会发送一封电子邮件。我正确填写了电子邮件设置(因为我可以很好地使用 send_mail),但每当我故意输入错误代码时,我都会得到我的 500.html 模板,但不会发送错误电子邮件。什么可能导致 Django 不这样做?
【问题讨论】:
在我的情况下,原因是缺少SERVER_EMAIL 设置。
SERVER_EMAIL 的默认值为 root@localhost。但是许多电子邮件服务器包括
我的电子邮件提供商不接受来自此类可疑地址的电子邮件。他们默默地丢弃电子邮件。
将发件人电子邮件地址更改为django@my-domain.com 解决了问题。在settings.py:
SERVER_EMAIL = 'django@my-domain.com'
【讨论】:
sender non-delivery notification 的条目,则表明这可能是问题的另一个提示。
另一种可能的错误是您的 ADMINS 设置有问题。以下设置将导致向管理员发送邮件失败:
ADMINS = (
('your name', 'me@mydomain.com')
)
这有什么问题?那么ADMINS需要是元组的元组,所以上面需要格式化为
ADMINS = (
('your name', 'me@mydomain.com'),
)
注意结尾的逗号。如果没有失败的逗号,电子邮件上的“收件人”地址将被错误地格式化(然后可能会被您的 SMTP 服务器静默丢弃)。
【讨论】:
我也有同样的情况。我创建了一个新项目和应用程序并且它工作正常,所以我知道这是我的代码。我将它追踪到 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 一起使用并通过电子邮件发送给管理员。
此外,LOGGING 配置默认与DEFAULT_LOGGING 合并,因此查看the source code of django.utils.log.DEFAULT_LOGGING 以了解其他可能对您的特定情况产生影响的情况很有用。
【讨论】:
disable_existing_loggers': False 会保持现有的日志记录不变,但事实并非如此。这解决了它。
'propagate': False
确保您的 EMAIL_HOST 和 EMAIL_PORT 在 settings.py 中正确设置(这些是指您的 SMTP 服务器)。可能假设您在 localhost 上运行了一个 SMTP 服务器。
要在本地进行测试,请运行 Python 的内置测试 SMTP 服务器:
python -m smtpd -n -c DebuggingServer localhost:1025
然后在你的 settings.py 中设置这些值
EMAIL_HOST='localhost'
EMAIL_PORT=1025
触发 500 错误,您应该会看到电子邮件出现在 python smtpd 终端窗口中。
【讨论】:
我的网络托管服务提供商 - Webfaction - 只允许从管理员面板中明确创建的电子邮件发送电子邮件。创建一个解决了这个问题。
【讨论】:
这里值得注意的另一件事是,如果来自视图的响应没有状态代码 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,您实际上可以通过该地址收到电子邮件。
【讨论】:
如果出于某种原因,您将 DEBUG_PROPAGATE_EXCEPTIONS 设置为 True(默认为 False),则无法通过电子邮件发送给管理员。
【讨论】:
从 Django 1.11 升级到 Django 2.1 后也遇到了同样的问题。显然settings.py 中的ADMINS 部分发生了变化。它现在需要一个元组列表,而不是旧的元组。这对我来说是固定的。
##### old #####
ADMINS = (
("Your Name", "your_email@company.com")
)
##### new #####
ADMINS = [
("Your Name", "your_email@company.com")
]
回复:https://docs.djangoproject.com/en/2.1/ref/settings/#admins
【讨论】:
确保你有 DEBUG = False
【讨论】:
这个问题让我非常恼火,以至于我发了一篇帖子。我在这里提供了我为解决这个问题所采取的步骤(长话短说):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'errors_file': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': 'logs/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['errors_file'],
'level': 'ERROR',
'propagate': True,
},
},
}
在我的情况下,导航到测试页面并没有在我的项目根目录的日志目录下的 debug.log 文件中生成输出。这表明记录器未能达到错误“级别”。
【讨论】:
SERVER_EMAIL 为我解决了这个问题,但官方文档中没有提到...
虽然已经有一段时间了,但这是我的回应,以便其他人将来可以受益。
在我的例子中,当发生错误时,阻止电子邮件发送到管理员列表的原因是应用程序特定的设置。我使用的是 django-piston,它提供了设置属性 PISTON_EMAIL_ERRORS 和 PISTON_DISPLAY_ERRORS。相应地设置这些,使应用程序服务器能够在活塞崩溃时通过邮件通知我。
【讨论】:
...然后是 facepalm 错误,当您在开发中使用它来防止电子邮件发送时,然后不小心将设置复制到生产中:
# Print emails to console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
(当然,在使用 wsgi 服务器时,您不会看到它们被打印到控制台)。从生产中删除设置为我解决了这个问题。
【讨论】:
还有一件可能出错的事情(我将把它添加到列表中,对于那些尽管上面给出了所有很好的答案但最终还是出现在这里的人):
我们的 django 设置使用 SendGrid 作为 smtp 主机,并在 django 设置中定义了一个管理员电子邮件地址。这在一段时间内运行良好,但在某些时候,邮件停止到达。
事实证明,由于某种未知原因,该邮件地址最终出现在 SendGrid 的“退回”列表中,导致发送到该地址的电子邮件在此之后永远被默默地丢弃。从该列表中删除地址并将其列入白名单,解决了该问题。
【讨论】:
如果您正在使用或想要使用 SendGrid,请在生产环境中使用以下设置。
安装包
pip install sendgrid-django
在 settings.py(production) 中添加这些设置
DEBUG = False
EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"
SENDGRID_API_KEY = "That you generate in sendgrid account"
ADMINS = (
("Your Name", "your_email@company.com")
)
【讨论】:
虽然可能不太理想,但我发现使用 Gmail 作为 SMTP 主机可以正常工作。 nathanostgard.com 有一个有用的指南。
如果您需要额外的眼睛来检查拼写错误,请随时发布您的相关 settings.py 部分(包括 EMAIL_*、SERVER_EMAIL、ADMINS(只需取出您的真实电子邮件)、MANAGERS 和 DEBUG)!
【讨论】:
无论如何,我遇到了这个问题,但这些建议都没有对我有用。事实证明,我的问题是SERVER_EMAIL 被设置为服务器(Webfaction)无法识别的地址。如果此站点托管在 Webfaction 上(就像我的其他站点一样),这不会有问题,但由于这是在不同的服务器上,Webfaction 服务器不仅检查电子邮件的身份验证正在发送,还有From: 值。
【讨论】:
就我而言,它是mail_admins 中的include_html。
当我将include_html 设置为True 时,电子邮件服务器拒绝发送我的电子邮件,因为它认为我的电子邮件是垃圾邮件。
当我将include_html 设置为False 时,一切正常。
【讨论】:
以下信息在https://docs.djangoproject.com/en/2.1/howto/error-reporting/#email-reports中给出
EMAIL_HOST = "email host"
EMAIL_HOST_USER = "Email username"
EMAIL_HOST_PASSWORD = "Email Password"
DEBUG = False
ADMINS = (
("Your Name", "your_email@company.com")
)
为了发送电子邮件,Django 需要一些设置告诉它如何 连接到您的邮件服务器。至少,你需要 指定 EMAIL_HOST 和可能的 EMAIL_HOST_USER 和 EMAIL_HOST_PASSWORD,但可能还需要其他设置 取决于您的邮件服务器的配置。咨询 Django 有关电子邮件相关设置的完整列表的设置文档。
【讨论】: