Django未向管理员发送电子邮件

80
根据文档,如果将DEBUG设置为False并在ADMINS选项下提供任何内容,则每当代码引发500状态代码时,Django都会发送电子邮件。我的电子邮件设置填写正确(因为我可以正常使用send_mail),但每当我故意放置错误的代码时,我会得到我的500.html模板,但没有发送错误电子邮件。什么原因会导致Django不执行此操作?
22个回答

118

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

SERVER_EMAIL的默认值为root@localhost。但是,包括我的电子邮件提供商在内的许多电子邮件服务器不接受来自这样可疑地址的邮件。它们会悄悄地删除这些邮件。

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

SERVER_EMAIL = 'django@my-domain.example'

2
另一个提示表明这可能是问题,如果您检查邮件日志并看到包含“发件人非交付通知”的条目。 - jathanism
在我的情况下,SERVER_EMAIL位于正确的域中,但在电子邮件服务器上不存在。将其更改为现有的电子邮件地址解决了问题。 - Sergey Orshanskiy

45

另一个可能导致错误的原因是您的ADMINS设置出了问题。以下设置会导致邮件发送给管理员失败但不会有任何提示:

另一种错误的可能性是您的ADMINS设置出现问题。以下设置会导致向管理员发送邮件时静默失败:

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

那有什么问题吗?ADMINS需要是一个元组的元组,因此上面的内容需要格式化为:

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

注意末尾的逗号。如果没有这个逗号,电子邮件的“to”地址将被格式错误(然后可能会被您的SMTP服务器静默丢弃)。


1
这是多亏了@cathal在上面提供的答案,运行本地调试SMTP服务器,才让我找到了这个问题所在。 - wxgeorge

37

我也遇到了同样的情况。我创建了一个新的项目和应用程序,它可以正常工作,所以我知道这是我的代码问题。我追踪到了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合并,因此有必要查看源代码django.utils.log.DEFAULT_LOGGING,以了解其他可能对你特定情况产生影响的内容。


3
在 Django 1.4 版本下,这个修复方法对我们有效。 - boatcoder
这对我有帮助(Django 1.7)。谢谢。 - Paco
1
添加日志记录设置导致我的管理员电子邮件停止工作,这在默认日志记录下之前正常工作。我假设 disable_existing_loggers': False 可以保留现有的日志记录,但实际上并没有。这修复了它。 - guidos
谢谢!我的问题在于'propagate': False - Manel Clos

18

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

为了在本地测试,运行Python内置的测试SMTP服务器:

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

然后在您的settings.py文件中设置这些值。

EMAIL_HOST='localhost'
EMAIL_PORT=1025

触发500错误,你应该能在Python smtpd终端窗口中看到电子邮件出现。


2
我看到了这条消息,但如果我将它设置回我的电子邮件设置,它就无法工作。 - JoseVega
也添加了这个,运行良好,但当设置回正常设置时仍然没有任何变化。 - Harry

8

我的网络托管提供商Webfaction只允许从在管理员面板中明确创建的电子邮件发送电子邮件。 创建一个电子邮件解决了问题。


1
我使用Webfaction并从Googlemail发送电子邮件,因此我不认为那是真正的问题。 - Dominic Rodger
1
如果您使用谷歌的SMTP服务器,则显然可以发送电子邮件,但是如果您将smtp.webfaction.com用作主机,则除非电子邮件存在,否则它不会让您发送。我没有改变任何其他内容,它就解决了问题,所以我相当确定那就是原因。 - JoseVega
这个方法对我也起作用了。我正在使用Telus SMTP服务器,刚刚将其从未经身份验证更改为经过身份验证。在更改之前它是可以工作的,但现在为了让它工作,我必须使用一个存在的电子邮件地址来发送邮件。 - jenniwren

6

另外值得注意的一点是,设置handler500可能会绕过发送500错误的机制,如果视图返回的响应没有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

我添加了一个自定义的500错误页面,这解决了我的问题。谢谢。 - alstr

4

如果我的解释过于简单,请原谅,但在我的情况下,邮件已经发送,但直接进入了垃圾邮件文件夹。在尝试更复杂的操作之前,请首先检查您的垃圾邮件文件夹。


其实没错。我曾经因爬虫试图在没有表单数据的情况下进行 AJAX 请求而遇到错误。我高估了垃圾邮件过滤器的智能,结果 Django 发送的所有电子邮件都被垃圾邮件过滤器捕捉了。 - Mike S

3

如果因某种原因您将DEBUG_PROPAGATE_EXCEPTIONS设置为True(默认为False),则发送给管理员的电子邮件将无法正常工作。


3

我刚刚升级到Django 2.1后遇到了同样的问题,这似乎是因为settings.py中的ADMINS部分发生了变化。现在它需要一个元组列表,而不是旧的元组元组。这个方法对我有用。

##### old #####
ADMINS = (
    ("Your Name", "your_email@company.example")
)

##### new #####
ADMINS = [
    ("Your Name", "your_email@company.example")
]

关于:https://docs.djangoproject.com/en/2.1/ref/settings/#admins


3

试试这个

# ./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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接