Django没有向管理员发送电子邮件

时间:2009-09-12 02:57:59

标签: python django

根据documentation,如果DEBUG设置为False并且在ADMINS设置下提供了某些内容,那么每当代码提高500时,Django都会发送电子邮件状态代码。我已经正确填写了电子邮件设置(因为我可以使用send_mail)但每当我故意提出错误代码时,我都会获得500.html模板,但不会发送错误电子邮件。什么可能导致Django不这样做?

20 个答案:

答案 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)

这个问题使我很恼火,以至于无法发帖。我在这里提供解决此问题的步骤(简而言之):

  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解决了我的问题。