Django应用部署到Heroku后使用EmailMessage发送邮件功能失效求助
问题排查步骤
1. 优先修复Gmail账号权限配置
本地可以发送但Heroku线上失败,最常见原因是Gmail的安全策略拦截了来自Heroku服务器的访问请求:
- 确认你的Gmail账号已开启两步验证,当前Google已完全禁止未开启两步验证的账号使用第三方SMTP服务发信
- 进入Google账号安全中心,生成应用专用密码,替换你现有配置中
EMAIL_HOST_PASSWORD字段的账号登录密码,不要直接使用原账号登录密码用于SMTP认证 - 检查Gmail账号的安全活动记录,将被拦截的Heroku服务器访问请求手动放行
- 如果使用的是Google Workspace企业账号,还需要联系管理员开启第三方SMTP发信权限
2. 修正Heroku环境变量配置
不要将邮箱账号、密码等敏感信息硬编码在settings.py中,Heroku线上环境需要通过配置变量传递这类参数:
- 首先修改
settings.py中的邮件配置,读取环境变量取值:
import os EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" EMAIL_HOST = "smtp.gmail.com" EMAIL_USE_TLS = True EMAIL_PORT = 587 EMAIL_HOST_USER = os.environ.get("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = os.environ.get("EMAIL_HOST_PASSWORD") EMAIL_USE_SSL = False
- 配置Heroku环境变量,两种方式二选一:
- 本地安装Heroku CLI后执行命令:
heroku config:set EMAIL_HOST_USER=你的Gmail账号 EMAIL_HOST_PASSWORD=你生成的应用专用密码 - 进入Heroku应用后台的「Settings」页面,在「Config Vars」板块手动添加对应变量和值
- 本地安装Heroku CLI后执行命令:
3. 开启错误日志排查具体问题
如果修改后仍无法发送,通过日志定位具体报错:
- 在调用
send方法时传入fail_silently=False参数,触发异常方便定位问题:
email_to_send.send(fail_silently=False)
- 本地执行
heroku logs --tail实时查看线上运行日志,确认是SMTP认证失败、连接超时还是其他逻辑报错
4. 额外配置校验
- 确认你部署到Heroku的生产环境配置没有覆盖上述邮件相关参数,很多项目会单独拆分
settings/prod.py类的生产配置文件,避免参数被覆盖 - 确认Heroku没有封禁587端口的出站请求,当前Heroku官方允许SMTP 587端口的出站流量,无需额外配置防火墙规则
内容的提问来源于stack exchange,提问作者leauradmin
相关产品推荐
相关产品推荐

