【问题标题】:Django not sending emails to adminsDjango不向管理员发送电子邮件
【发布时间】:2010-11-27 16:47:51
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

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

    SERVER_EMAIL = 'django@my-domain.com'
    

    【讨论】:

    • 如果您检查邮件日志并看到包含sender non-delivery notification 的条目,则表明这可能是问题的另一个提示。
    • 在我的情况下,SERVER_EMAIL 位于正确的域中,但在电子邮件服务器上不存在。将其更改为现有电子邮件即可解决问题。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • (感谢@cathal 上面在本地运行调试 SMTP 服务器的回答,这让我可以将其定位为我的问题)。
    【解决方案3】:

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

    【讨论】:

    • 在 Django 1.4 下为我们解决了这个问题。
    • 这为我修复了它(Django 1.7)。谢谢
    • 添加日志记录设置会杀死我的管理员电子邮件,这在使用默认日志记录之前运行良好。我假设disable_existing_loggers': False 会保持现有的日志记录不变,但事实并非如此。这解决了它。
    • 谢谢!我的问题出在'propagate': False
    【解决方案4】:

    确保您的 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 终端窗口中。

    【讨论】:

    • 我看到了这条消息,但是如果我把它设置回我的电子邮件设置它就不起作用
    • 也添加了这个,效果很好,但恢复正常设置后仍然没有任何变化
    【解决方案5】:

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

    【讨论】:

    • 我使用网络派系并从 googlemail 发送电子邮件,所以我认为这不是真正的问题。
    • 如果您使用 google 的 smtp 服务器,它显然允许您发送电子邮件,但如果您使用 smtp.webfaction.com 作为主机,那么除非电子邮件存在,否则它不会让您发送电子邮件。我没有改变任何其他东西,它修复了它,所以我很确定就是这样。
    • 这也解决了我的问题。我正在使用 telus smpt 服务器,只是将其切换为经过身份验证而不是不经过身份验证。它在更改之前有效,现在要使其有效,我必须使用现有的电子邮件地址来发送。
    【解决方案6】:

    这里值得注意的另一件事是,如果来自视图的响应没有状态代码 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
    

    【讨论】:

    • 我添加了一个自定义的 500 错误页面,这解决了我的问题。谢谢。
    【解决方案7】:

    对不起,如果它太天真,但在我的情况下,电子邮件已发送但直接进入垃圾邮件文件夹。在尝试更复杂的事情之前,请先检查您的垃圾邮件文件夹。

    【讨论】:

    • 其实.. 是的。爬虫试图在没有表单数据的情况下发出 AJAX 请求时出现错误。我高估了垃圾邮件过滤器的智能,结果 Django 发送的所有电子邮件都被垃圾邮件过滤器捕获了。
    【解决方案8】:

    试试这个

    # ./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,您实际上可以通过该地址收到电子邮件。

    【讨论】:

      【解决方案9】:

      如果出于某种原因,您将 DEBUG_PROPAGATE_EXCEPTIONS 设置为 True(默认为 False),则无法通过电子邮件发送给管理员。

      【讨论】:

        【解决方案10】:

        从 Django 1.11 升级到 Django 2.1 后也遇到了同样的问题。显然settings.py 中的ADMINS 部分发生了变化。它现在需要一个元组列表,而不是旧的元组。这对我来说是固定的。

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

        【讨论】:

          【解决方案11】:

          确保你有 DEBUG = False

          【讨论】:

            【解决方案12】:

            这个问题让我非常恼火,以至于我发了一篇帖子。我在这里提供了我为解决这个问题所采取的步骤(长话短说):

            1. 设置测试页面失败(通过重命名 test_template.html)
            2. 使用 send_mail('Hello', 'hello, world', 'info@xyz.com', [('Name', 'name.name@xyz.com') ,], fail_silently=False) 其中 SERVER_EMAIL = 'info@xyz.com' 和 ADMINS = [('Name', 'name.name@xyz.com'),] 在 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 解决了我的问题。

            【讨论】:

            • Missing SERVER_EMAIL 为我解决了这个问题,但官方文档中没有提到...
            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

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

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

              (当然,在使用 wsgi 服务器时,您不会看到它们被打印到控制台)。从生产中删除设置为我解决了这个问题。

              【讨论】:

                【解决方案15】:

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

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

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

                【讨论】:

                  【解决方案16】:

                  如果您正在使用或想要使用 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.com")
                  )
                  

                  【讨论】:

                    【解决方案17】:

                    虽然可能不太理想,但我发现使用 Gmail 作为 SMTP 主机可以正常工作。 nathanostgard.com 有一个有用的指南。

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

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

                        就我而言,它是mail_admins 中的include_html

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

                        当我将include_html 设置为False 时,一切正常。

                        【讨论】:

                          【解决方案20】:

                          以下信息在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 有关电子邮件相关设置的完整列表的设置文档。

                          【讨论】:

                            猜你喜欢
                            • 2012-11-08
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多