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


71

根据文档,如果DEBUG设置为,False并且在设置下提供了某些内容ADMINS,则只要代码引发500状态代码,Django就会发送一封电子邮件。我已经正确填写了电子邮件设置(可以很好地使用send_mail),但是每当有意输入错误代码时,我都会得到500.html模板,但不会发送错误电子邮件。是什么导致Django无法做到这一点?

Answers:


104

就我而言,原因是缺少SERVER_EMAIL设置。

的默认SERVER_EMAIL值为root@localhost。但是,包括我的电子邮件提供商在内的许多电子邮件服务器都不接受来自此类可疑地址的电子邮件。他们默默地删除了电子邮件。

更改发件人电子邮件地址即可django@my-domain.com解决问题。在settings.py

SERVER_EMAIL = 'django@my-domain.com'

2
这可能是问题的另一个提示是,如果您检查邮件日志并看到包含的条目sender non-delivery notification
贾森主义

38

错误的另一种可能性是您的ADMINS设置有问题。以下设置将导致向管理员发送邮件悄无声息地失败:

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

怎么了 那么ADMINS必须是一个元组的元组,因此以上代码需要格式化为

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

请注意尾随逗号。如果没有失败的逗号,则电子邮件上的“收件人”地址将被错误地设置格式(然后可能被SMTP服务器静默丢弃)。


1
(这要归功于@cathal的回答,它在本地运行调试的SMTP服务器,使我能够将其定位为我的问题)。
wxgeorge

36

我有同样的情况。我创建了一个新项目和应用程序,并且可以正常工作,所以我知道这是我的代码。我在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 2015年

1
添加日志记录设置会杀死我的管理员电子邮件,该日志在使用默认日志记录之前可以正常工作。我以为disable_existing_loggers': False可以保留现有的日志记录,但事实并非如此。这样就解决了。
吉多斯

谢谢!我的问题在哪里'propagate': False
Manel Clos

17

确保在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
我看到了该消息,但是如果将其设置回我的电子邮件设置,它将无法正常工作

还添加了此功能,效果很好,但恢复为正常设置后仍然没有任何变化
哈利

7

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


1
我使用webfaction并从googlemail发送电子邮件,所以我认为这不是真正的问题。
多米尼克·罗杰

1
如果您使用的是Google的smtp服务器,它显然允许您发送电子邮件,但是如果您使用smtp.webfaction.com作为主机,那么除非该电子邮件存在,否则它不会允许您发送电子邮件。我没有进行任何其他更改,并且已对其进行了修复,因此我可以肯定的是。

这也为我解决了问题。我正在使用telus smpt服务器,只是将其切换到已认证(而不是未认证)。它在更改之前有效,现在要使其正常工作,我必须使用要发送的电子邮件地址。
jenniwren'5

6

另一点需要注意的是,handler500如果视图的响应中没有状态码500 handler500,则设置可能会绕过在500上发送错误的机制。

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

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,您实际上会收到电子邮件。


3

很抱歉,如果它太幼稚,但是在我的情况下,电子邮件已发送但直接进入了SPAM文件夹。在尝试更复杂的事情之前,请先检查您的SPAM文件夹。


其实..是的。搜寻器尝试在没有表单数据的情况下提出AJAX请求时遇到错误。我高估了垃圾邮件过滤器的智能,最终导致Django发送的所有电子邮件都被垃圾邮件过滤器捕获。
Mike S



2

从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


2

这个问题使我很烦恼,以至于无法激励他。我在这里提供解决这个问题的步骤(简而言之):

  1. 设置测试页失败(通过重命名test_template.html)
  2. 使用send_mail('Hello','hello,world','info@xyz.com',[('Name','name.name@xyz.com'),],通过视图检查电子邮件验证以查看生产中的测试页fail_silently = False),其中Django设置中的SERVER_EMAIL ='info@xyz.com'和ADMINS = [('Name','name.name@xyz.com'),]]。就我而言,我收到了“ hello world”电子邮件,但没有收到Django管理员电子邮件(这很痛苦)。
  3. 设置一个简单的自定义记录器,以报告服务器上的文件:
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文件中生成输出。这表明记录器无法达到错误“级别”。

  1. 将自定义记录器的报告阈值从ERROR降为DEBUG。现在,导航到测试页面应该提供一些细节。在我的情况下,检查此详细信息后发现,默认的500页被(重定向)重定向到了另一个名为500.html的模板文件。该模板文件使用了变量进行缓存,并且由于没有通过使变量在上下文中可用的视图来调用模板,因此缓存调用失败,缺少键引用。重新命名500.html解决了我的问题。

缺少SERVER_EMAIL为我解决的问题,但在官方文档中未提及……
Filip

1

尽管已经有一段时间了,但这是我的回应,以便将来其他人可以从中受益。

就我而言,发生错误时阻止电子邮件发送到ADMINS列表的是应用程序特定的设置。我使用的是django-piston,它提供设置属性PISTON_EMAIL_ERRORS和PISTON_DISPLAY_ERRORS。相应地进行设置,使应用程序服务器可以在活塞崩溃时通过邮件通知我。


1

...然后出现了facepalm错误,当您在开发中使用它来阻止电子邮件发送出去,然后不小心将设置复制到生产环境中时:

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

(当然,在使用wsgi服务器时,您不会看到它们被打印到控制台上)。从生产环境中删除设置对我来说已经解决了。


1

还有可能出错的另一件事(我将其添加到列表中,对于那些尽管上面给出了所有很棒的答案但最终还是在这里的人):

我们的django设置使用SendGrid作为smtp主机,并在django设置中定义了一个管理员电子邮件地址。在一段时间内,此方法运行良好,但在某些时候,邮件停止到达。

事实证明,由于某种未知原因,该邮件地址最终出现在SendGrid的“退回”列表中,从而导致到该地址的电子邮件永远被静默丢弃。从该列表中删除地址并将其列入白名单,解决了该问题。


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")
)

0

虽然可能不太理想,但我发现将Gmail用作SMTP主机也可以。nathanostgard.com上有有用的指南

如果您想要额外的眼睛来检查拼写错误,请随时发布相关的settings.py部分(包括EMAIL _ *,SERVER_EMAIL,ADMINS(只需取出您的真实电子邮件),MANAGERS和DEBUG)!


0

对于这个问题,我有一个问题,而这些建议对我都不起作用。事实证明,我的问题是该SERVER_EMAIL地址设置为服务器(Webfaction)无法识别的地址。如果此站点托管Webfaction上(就像我的其他站点一样),这不会有问题,但是由于这是在其他服务器上,因此Webfaction服务器不仅检查发送的电子邮件的身份验证,还检查From:值也一样


0

就我而言,这是include_htmlin mail_admins

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

一切正常,当我设置就好了include_htmlFalse


0

以下信息在https://docs.djangoproject.com/zh-CN/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设置文档。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.