根据documentation,如果DEBUG
设置为False
并且在ADMINS
设置下提供了某些内容,那么每当代码提高500时,Django都会发送电子邮件状态代码。我已经正确填写了电子邮件设置(因为我可以使用send_mail)但每当我故意提出错误代码时,我都会获得500.html模板,但不会发送错误电子邮件。什么可能导致Django不这样做?
答案 0 :(得分:93)
就我而言,原因是缺少SERVER_EMAIL设置。
SERVER_EMAIL
的默认值为root@localhost
。但许多电子邮件服务器包括
我的电子邮件提供商不接受来自此类可疑地址的电子邮件。他们默默地放下电子邮件。
将发件人电子邮件地址更改为django@my-domain.com
解决了问题。在settings.py
:
SERVER_EMAIL = 'django@my-domain.com'
答案 1 :(得分:37)
错误的另一种可能性是您的ADMINS设置出现问题。以下设置将导致向管理员发送邮件安静地失败:
ADMINS = (
('your name', 'me@mydomain.com')
)
这有什么问题? ADMINS需要是一个元组元组,所以上面需要格式化为
ADMINS = (
('your name', 'me@mydomain.com'),
)
注意尾随的逗号。如果没有失败的逗号,电子邮件中的“收件人”地址将被错误地格式化(然后可能被SMTP服务器静默丢弃)。
答案 2 :(得分:34)
我有同样的情况。我创建了一个新的项目和应用程序,它工作,所以我知道这是我的代码。我将它跟踪到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。
此外,默认情况下,LOGGING
配置会与DEFAULT_LOGGING
合并,因此请查看the source code of django.utils.log.DEFAULT_LOGGING
以了解其他可能对您的特定情况有何影响。< / p>
答案 3 :(得分:16)
确保您在settings.py中设置了您的EMAIL_HOST和EMAIL_PORT(这些是指您的SMTP服务器)。可能假设您在localhost上运行了SMTP服务器。
要在本地测试,请运行Python的内置测试SMTP服务器:
python -m smtpd -n -c DebuggingServer localhost:1025
然后在settings.py中设置这些值
EMAIL_HOST='localhost'
EMAIL_PORT=1025
触发500错误,您应该会看到电子邮件出现在python smtpd终端窗口中。
答案 4 :(得分:6)
我的网络托管服务提供商 - Webfaction - 仅允许通过管理员面板中明确创建的电子邮件发送电子邮件。创建一个修复了问题。
答案 5 :(得分:3)
另一件值得注意的事情是,如果来自视图的响应没有状态代码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
答案 6 :(得分:2)
试试这个
# ./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,您实际上可以通过以下方式收到电子邮件。
答案 7 :(得分:2)
很抱歉,如果它太天真,但在我的情况下,电子邮件已发送,但直接进入SPAM文件夹。在尝试更复杂的事情之前,请先检查您的垃圾邮件文件夹。
答案 8 :(得分:2)
确保你有DEBUG = False
答案 9 :(得分:1)
如果出于某种原因,您将DEBUG_PROPAGATE_EXCEPTIONS设置为True(默认情况下为False),则发送给admin的电子邮件将无效。
答案 10 :(得分:1)
虽然已经有一段时间了,但这是我的回答,以便其他人可以在将来受益。
在我的情况下,当发生错误时阻止电子邮件发送到ADMINS列表的是特定于应用程序的设置。我使用的是django-piston,它提供了设置属性PISTON_EMAIL_ERRORS和PISTON_DISPLAY_ERRORS。相应地设置这些,使应用程序服务器能够在活塞崩溃时通过邮件通知我。
答案 11 :(得分:1)
...然后是facepalm错误,当您在开发中使用它来阻止电子邮件外出时,然后意外地将设置复制到生产中:
# Print emails to console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
(当然,在使用wsgi服务器时,您看不到它们被打印到控制台)。从生产中删除设置为我修复了这个。
答案 12 :(得分:1)
还有一件事可能会出错(我会把它添加到列表中,对于那些尽管上面有很好答案但最终会在这里结束的人):
我们的django设置使用SendGrid作为smtp主机,并在django设置中定义了一个管理员电子邮件地址。这种方法运行良好一段时间,但在某些时候,邮件停止了。
事实证明,由于某些未知原因,邮件地址最终出现在SendGrid'Bounced'列表中,导致该地址的电子邮件永远无声地丢失。从该列表中删除地址并将其列入白名单,修复了该问题。
答案 13 :(得分:1)
如果您正在使用或想使用SendGrid,请在生产环境中使用以下设置。
安装软件包
pip install sendgrid-django
将这些设置添加到settings.py(生产)
DEBUG = False
EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"
SENDGRID_API_KEY = "That you generate in sendgrid account"
ADMINS = (
("Your Name", "your_email@company.com")
)
答案 14 :(得分:1)
从Django 1.11升级到Django 2.1后,也遇到了同样的问题。显然ADMINS
中的settings.py
部分有所更改。现在需要一个元组列表,而不是旧的元组列表。这对我来说是固定的。
##### 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
答案 15 :(得分:0)
我有这个问题的价值,这些建议都没有对我有用。事实证明,我的问题是SERVER_EMAIL
被设置为服务器(Webfaction)无法识别的地址。如果此站点是 on Webfaction(就像我的其他站点一样),这不会有问题,但由于这是在不同的服务器上,因此Webfaction服务器不仅检查电子邮件的身份验证正在发送,但也有From:
值。
答案 16 :(得分:0)
虽然可能不太理想,但我发现使用Gmail作为SMTP主机工作得很好。 nathanostgard.com有一个有用的指南。
如果您想要额外的一组眼睛来检查拼写错误,请随意发布您的相关settings.py部分(包括EMAIL_ *,SERVER_EMAIL,ADMINS(只需取出您的真实电子邮件),经理和调查)
答案 17 :(得分:0)
就我而言,它是include_html
中的mail_admins
。
当我将include_html
设置为True
时,电子邮件服务器拒绝发送我的电子邮件,因为它认为我的电子邮件是垃圾邮件。
当我将include_html
设置为False
时,一切正常。
答案 18 :(得分:0)
以下信息在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 设置文档以获取与电子邮件相关的设置的完整列表。
答案 19 :(得分:0)
这个问题使我很恼火,以至于无法发帖。我在这里提供解决此问题的步骤(简而言之):
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,
},
},
}
就我而言,导航到测试页面并没有在项目根目录的logs目录下的debug.log文件中生成输出。这表明记录器无法达到错误“级别”。