Heroku部署Django项目调用Gmail API发邮件失败如何排查?
排查思路
- 核对Heroku环境变量配置
本地读取的EMAIL_USERNAME、EMAIL_PASSWORD来自本地.env文件,Heroku不会自动同步该文件配置,需要进入你的Heroku应用后台,在「设置」->「Config Vars」板块确认两个变量是否已正确添加,变量值和本地使用的完全一致。 - 检查Gmail账号的安全拦截规则
- 若你的Gmail账号未开启两步验证,需要先开启「不太安全的应用访问」权限;若已开启两步验证,必须使用应用专用密码作为
EMAIL_HOST_PASSWORD的值,不能直接使用账号登录密码。 - 登录对应Gmail账号查看安全提醒邮件,Google会默认拦截陌生IP的登录请求,Heroku服务器IP属于陌生访问源,找到对应的拦截通知后选择允许访问即可。
- 若你的Gmail账号未开启两步验证,需要先开启「不太安全的应用访问」权限;若已开启两步验证,必须使用应用专用密码作为
- 补充错误日志定位具体问题
你当前提供的Heroku日志只有路由访问记录,没有发信逻辑的报错信息,建议在发信代码外层添加异常捕获,输出详细错误到日志:
重新部署后触发一次发信操作,再去Heroku日志中搜索对应的错误输出,即可确定是登录失败、连接超时还是其他逻辑问题。import traceback import logging logger = logging.getLogger(__name__) # 原有发信逻辑外层加try catch try: with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp: smtp.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD) smtp.send_message(message) except Exception as e: logger.error(f"发信失败错误:{str(e)}") logger.error(traceback.format_exc()) - 测试Heroku出站网络连通性
执行heroku run bash进入应用dyno的终端,手动运行telnet smtp.gmail.com 465测试是否能连通Gmail的SMTP服务器,若连不通则是网络层面的问题。 - 检查上层调用逻辑
确认你调用MailJournals函数的上层代码,有没有捕获异常后没有输出日志的情况,避免错误被静默吞掉。
注:你描述中提到使用Gmail API,但提供的代码是直接通过SMTP协议发信,如果你实际是走Gmail API发信,还需要确认OAuth2凭证、API密钥等配置是否已正确同步到Heroku的环境变量中。
内容的提问来源于stack exchange,提问作者Tomasz Gryczka
相关产品推荐
相关产品推荐

