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

在AWS上部署的Django应用无法发送Gmail邮件的问题求助

问题描述

我用Django+Apache2开发的Web应用部署到AWS EC2后,通过表单发送邮件时出现500错误,但在python manage.py shell_plus里执行send_mail命令却能成功发送Gmail邮件。本地Ubuntu环境下一切正常。

相关配置与环境信息:

  • settings.py邮件配置:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = os.environ.get("GMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = os.environ.get("GMAIL_HOST_PASSWORD")
EMAIL_FROM_EMAIL = os.environ.get("GMAIL_HOST_EMAIL")
EMAIL_USE_TLS = True
  • EC2入站规则已添加:port:587 IPv4:0.0.0.0
  • 环境版本:Django 4.1.7、Python 3.8.16、Apache 2.4.56、mod_wsgi 4.9.4

修复Gmail发送问题的步骤

1. 同步Apache进程的环境变量

命令行下的shell_plus能读取到邮箱环境变量,但Apache运行Django时可能未加载这些变量:

  • 编辑Apache配置文件(如/etc/httpd/conf/httpd.conf或站点专属配置文件),直接添加环境变量:
    SetEnv GMAIL_HOST_USER "你的邮箱地址"
    SetEnv GMAIL_HOST_PASSWORD "你的应用专用密码"
    SetEnv GMAIL_HOST_EMAIL "发件邮箱地址"
    
  • 重启Apache生效:sudo systemctl restart httpd

2. 检查Gmail安全设置

  • 若未启用两步验证,需开启Gmail的"不太安全的应用访问"(但Google已逐步禁用该选项,优先推荐应用专用密码)
  • 启用两步验证后,在Google账号后台生成应用专用密码,替换EMAIL_HOST_PASSWORD的值
  • 确认Gmail的IMAP服务已开启:登录Gmail → 「设置」→「转发和POP/IMAP」→ 勾选启用IMAP

3. 补充EC2出站规则

仅配置入站规则不够,EC2需要能向外访问smtp.gmail.com的587端口:

  • 进入AWS控制台的EC2安全组,添加出站规则:
    • 类型:自定义TCP
    • 端口范围:587
    • 目标:0.0.0.0/0

4. 排查错误日志定位问题

  • 查看Apache错误日志:路径通常为/var/log/httpd/error_log
  • 配置Django邮件错误日志(添加到settings.py):
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'ERROR',
                'class': 'logging.FileHandler',
                'filename': '/var/log/django/email_error.log',
            },
        },
        'loggers': {
            'django.core.mail': {
                'handlers': ['file'],
                'level': 'ERROR',
                'propagate': True,
            },
        },
    }
    
    日志会明确显示500错误的具体原因,比如权限不足、变量未加载等。

改用Amazon SES的建议

如果Gmail配置问题始终无法解决,推荐改用Amazon SES,更适配AWS环境:

1. 配置步骤

  • 在AWS控制台开通SES服务,完成发件邮箱或域名的验证
  • 在SES控制台的「SMTP设置」中生成SMTP凭证
  • 修改settings.py的邮件配置:
    EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
    EMAIL_HOST = "email-smtp.你的区域.amazonaws.com" # 例如us-east-1
    EMAIL_PORT = 587
    EMAIL_HOST_USER = "SES的SMTP用户名"
    EMAIL_HOST_PASSWORD = "SES的SMTP密码"
    EMAIL_FROM_EMAIL = "已验证的发件邮箱"
    EMAIL_USE_TLS = True
    

2. 优势

  • 与AWS生态深度集成,服务稳定性更高
  • 发送量限制更宽松(新账号有初始配额,可申请提升)
  • 无需担心Gmail安全策略变更导致服务中断

内容的提问来源于stack exchange,提问作者K-Yuuma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:13:34