【问题标题】:Django Logging Emails not Arriving while other Emails doDjango 记录电子邮件没有到达,而其他电子邮件有
【发布时间】:2021-10-30 22:13:33
【问题描述】:

我目前正在使用此配置来接收来自我的开发和生产服务器的日志记录电子邮件。

ADMINS = [('Test1', 'somename@example.com'), ('Test2', 'someothername@example.com')]
SERVER_EMAIL = "correctsender@example.com"
LOGGING = {
    'version': 1,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
    }
}

然后使用以下 SMTP 配置发送电子邮件。

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'correctsender@example.com'
EMAIL_HOST_PASSWORD = 'thepassword' # normally loaded from environment
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'correctsender@example.com'

我在 Gmail 中启用了“不太安全的应用程序”。

几天来,我们怀疑错误日志记录已损坏。今天我们确认通过 AdminEmailHandler 发送的邮件没有到达,而所有其他通过普通邮件管道发送的邮件(无论是来自 celery 工人还是直接来自服务器)。

与其他后端的测试表明邮件是由 django 发送的。使用 smtplib 进行的快速测试表明登录没有被阻止。为什么某些邮件会被 Gmail 接受,而其他只是内容不同的邮件却不接受?

另外,Google 中是否有保存被拒绝电子邮件的地方(Google Workspace 只有一个初步报告,没有显示任何内容)?

【问题讨论】:

  • 你能确认他们正在被发送吗?
  • 邮件肯定被发送,因为更改后端或使用 django shell 使用相同的后端发送不同的邮件都成功。绝对是 google 拒绝 django 错误报告,因为它是恶意的。

标签: django gmail


【解决方案1】:

好的,我使用django-gmailapi-backend“解决了”(阅读下文推荐)这个问题。这个包可以通过以下方式安装

  1. 点安装包
  2. 在 console.cloud.google.com 中设置一个新项目
  3. 为您的项目启用 gmail api
  4. 创建 OAuth 2.0 凭据
    • 选择“桌面客户端”
  5. 将客户端 ID 和密码复制到您的命令行中
gmail_oauth2 --generate_oauth2_token \
  --client_id="<client_id>" \
  --client_secret="<client_secret>" \
  --scope="https://www.googleapis.com/auth/gmail.send"
  1. 打开程序给你的链接
  2. 授权使用您的帐户的请求
  3. 将确认信息复制到命令行
  4. 检索您的刷新令牌并按照上述存储库的自述文件中所述进行设置。
  5. 您现在已经设置了一个更安全的应用程序来用作您的邮件发送方法。

这只是解决了无法接收崩溃报告的问题的一半。他们仍然不会到达,因为谷歌邮箱认为他们是恶意的。但是,现在,至少邮件“无法投递”的答案将到达发件人收件箱,使您能够阅读被认为是恶意的邮件。解决方法,是的,但这是我能做的最好的。

【讨论】:

  • 顺便说一句,我不会接受这个答案,因为它在技术上不是解决方案,而是一种解决方法。如果有人找到解决方案,请随时添加新答案。
【解决方案2】:
'loggers': {
        'django.request': { **change here to django.db.backend**
            'handlers': ['mail_admins'], c**hange here to console**
            'level': 'ERROR',
            'propagate': False,
        },
    }

您的记录器可能看起来像这样,这应该可以解决您的需要

    LOGGING = {
        "version": 1,
        "disable_existing_loggers": True,
        "formatters": {
            "verbose": {
                "format": "%(levelname)s %(asctime)s %(module)s "
                "%(process)d %(thread)d %(message)s"
            }
        },
        "handlers": {
            "console": {
                "level": "DEBUG",
                "class": "logging.StreamHandler",
                "formatter": "verbose",
            }
        },
        "root": {"level": "INFO", "handlers": ["console"]},
        "loggers": {
            "django.db.backends": {
                "level": "ERROR",
                "handlers": ["console"],
                "propagate": False,
            },
            'django.request': { 
                'handlers': ['console'], 
                'level': 'ERROR',
                'propagate': False,
            },
            # Errors logged by the SDK itself if only you wish to monitor with sentry
            "sentry_sdk": {"level": "ERROR", "handlers": ["console"], "propagate": False},
            "django.security.DisallowedHost": {
                "level": "ERROR",
                "handlers": ["console"],
                "propagate": False,
            },
        },
    }

这样每个日志条目都会通过控制台处理程序。我希望它有效

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
  • 恐怕这并不能解决无法发送MAIL报告的问题
【解决方案3】:

对我有用的是通过为电子邮件帐户生成secret key 密钥并在 EMAIL_HOST_PASSWORD 中使用它来使用 2 因素身份验证

【讨论】:

  • 我假设您的意思是应用程序密码?我现在已经配置了它,它仍然无法正常工作。与激活不太安全的应用程序相同的静默失败。
猜你喜欢
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2013-07-09
  • 2022-08-14
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多