You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产环境下Django未发送调试错误邮件问题排查

Django生产环境错误邮件无法发送排查方案

以下是针对你遇到的「常规邮件正常、错误邮件无法发送」问题的排查步骤:

  • 确认DEBUG状态:生产环境必须设置DEBUG = False,Django仅在DEBUG关闭时才会向ADMINS发送错误邮件。如果DEBUG是True,错误会直接显示在页面,不会触发邮件通知。
  • 补充加密配置:你用的是587端口,这个端口通常需要启用TLS加密,在settings.py里添加:
    EMAIL_USE_TLS = True
    
    很多邮件服务商(比如Gmail)强制要求加密,缺少这个配置会导致SMTP连接失败。
  • 验证SERVER_EMAIL有效性:SERVER_EMAIL是错误邮件的发件人地址,部分服务商要求该地址必须与EMAIL_HOST_USER一致,或已通过邮箱服务商验证。检查环境变量SERVER_EMAIL是否正确加载,可通过manage.py shell查看:
    from django.conf import settings
    print(settings.SERVER_EMAIL)
    print(settings.EMAIL_HOST_USER)
    
    若SERVER_EMAIL为空或不匹配,会导致邮件发送被拒绝。
  • 确认错误触发条件:Django仅在服务器返回500内部错误时发送邮件,4xx类客户端错误(比如404)不会触发。可以故意写一个抛出异常的视图来测试,比如:
    def test_error(request):
        raise Exception("Test 500 error for email notification")
    
    访问该视图触发500错误,看是否有邮件发出。
  • 检查日志获取异常信息:在settings.py中配置日志,捕获邮件发送时的错误细节:
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'mail_admins': {
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
            },
            'console': {
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.request': {
                'handlers': ['mail_admins', 'console'],
                'level': 'ERROR',
                'propagate': False,
            },
        },
    }
    
    查看服务器日志,若邮件发送失败,会在日志中显示具体原因(比如SMTP认证失败、发件人被拦截等)。
  • 手动测试错误邮件发送:在manage.py shell中执行以下代码,直接触发AdminEmailHandler发送邮件,验证是否能正常发送:
    from django.utils.log import AdminEmailHandler
    from django.conf import settings
    
    handler = AdminEmailHandler()
    # 替换成你的管理员邮箱
    handler.send_mail('测试错误邮件', '这是一封测试错误通知邮件', settings.SERVER_EMAIL, ['******@gmail.com'])
    
    如果执行时报错,错误信息会直接告诉你问题所在;如果没报错但收不到邮件,检查邮箱垃圾邮件文件夹,或确认邮箱服务商是否拦截了该地址的邮件。
  • 检查环境变量加载完整性:确保所有邮件相关的环境变量(SERVER_EMAIL、EMAIL_HOST、EMAIL_HOST_USER等)都已正确设置,没有为空值。可以在settings.py中临时添加打印语句验证(生产环境测试后记得移除):
    print(f"SERVER_EMAIL: {SERVER_EMAIL}")
    print(f"EMAIL_HOST: {EMAIL_HOST}")
    

内容的提问来源于stack exchange,提问作者jpm92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:56:16