繁体   English   中英

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

[英]Django not sending emails to admins

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

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

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

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

SERVER_EMAIL = 'django@my-domain.example'

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

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

那有什么问题? 那么ADMINS需要是元组的元组,所以上面需要格式化为

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

注意结尾的逗号。 如果没有失败的逗号,电子邮件上的“收件人”地址将被错误地格式化(然后可能会被您的 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合并,因此查看django.utils.log.DEFAULT_LOGGING的源代码以了解其他可能对您的特定情况产生影响的内容很有用。

确保您的 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.example")
)

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

回复: https ://docs.djangoproject.com/en/2.1/ref/settings/#admins

确保你有 DEBUG = False

这个问题让我很恼火,足以激发一个帖子。 我在这里提供了我为解决这个问题而采取的步骤(长话短说):

  1. 设置测试页面失败(通过重新命名test_template.html
  2. 使用 send_mail('Hello', 'hello, world', info@xyz.example , [('Name', 'name.name@xyz.example'),], fail_silently= 在生产中通过视图检查电子邮件验证False) 其中 SERVER_EMAIL = info@xyz.example和 ADMINS = [('Name', 'name.name@xyz.example'),] 在 Django 设置中。 就我而言,我收到了“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,
    },
  },
}

在我的情况下,导航到测试页面并没有在我的项目根目录的日志目录下的debug.log文件中生成输出。 这表明记录器未能达到错误“级别”。

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

...然后是 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.example")
)

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

就我而言,当发生错误时,阻止将电子邮件发送到管理员列表的原因是应用程序特定的设置。 我使用的是 django-piston,它提供了设置属性 PISTON_EMAIL_ERRORS 和 PISTON_DISPLAY_ERRORS。 相应地设置这些,使应用程序服务器能够在活塞崩溃时通过邮件通知我。

虽然可能并不理想,但我发现使用 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.example")
)

为了发送电子邮件,Django 需要一些设置来告诉它如何连接到您的邮件服务器。 至少,您需要指定 EMAIL_HOST,可能还需要指定 EMAIL_HOST_USER 和 EMAIL_HOST_PASSWORD,但根据您的邮件服务器的配置,可能还需要其他设置。 有关电子邮件相关设置的完整列表,请参阅 Django 设置文档。

我遇到了同样的问题,结果邮件服务器没有电子邮件地址的域名。 我试图从一个注册的网站发送(这是一个新网站,用于业务的不同部分)。 我使用的电子邮件地址在 SERVER_EMAIL 中的旧域下已经有效。 这解决了我的问题。

server_email 的设置默认为 root@localhost,但许多 email 运营商不接受来自此类 email_servers 的 email,这就是管理员电子邮件没有收到电子邮件的原因。 这个趋势的第一个答案帮助我从 DebuggingServer localhost:1025 发送 email 不起作用或者你将 DEFAULT_FROM_EMAIL 更改为其他内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM