如何在Heroku上通过Gmail账号使用yagmail发送邮件?
问题排查与修复方案
- 优先确认Heroku环境变量配置
你在GitHub Secrets中存储的变量默认不会自动同步到Heroku运行环境,需要手动配置:进入Heroku对应应用后台 → 点击Settings标签 → 找到Config Vars栏目 → 分别添加SENDER_EMAIL、SENDER_APP_PASSWORD、RECEIVER_EMAIL三个变量,确认值和本地测试用的完全一致。如果你是通过GitHub Actions自动部署,需要在工作流配置文件中将GitHub Secrets的值写入Heroku配置变量,否则运行时读取到的三个值都是空值,自然无法发信。 - 显式指定yagmail的SMTP连接参数
本地运行时yagmail会自动适配默认的Gmail SMTP参数,但Heroku网络环境下默认参数可能失效,需要在初始化时显式指定服务地址、端口和加密方式,修改后的代码参考:
import os import yagmail SENDER_EMAIL = os.getenv("SENDER_EMAIL") SENDER_APP_PASSWORD = os.getenv("SENDER_APP_PASSWORD") RECEIVER_EMAIL = os.getenv("RECEIVER_EMAIL") test_sub = "Test mail" test_cont = "Test content" # 显式指定Gmail SMTP配置 try: with yagmail.SMTP( user=SENDER_EMAIL, password=SENDER_APP_PASSWORD, host='smtp.gmail.com', port=465, smtp_ssl=True ) as yag: yag.send(RECEIVER_EMAIL, test_sub, test_cont) print("邮件发送成功") except Exception as e: # 打印错误信息方便排查,可在Heroku日志中查看具体报错 print(f"邮件发送失败,错误信息:{e}")
- 确认Google账号安全配置
再次确认你的Google账号已开启两步验证,生成的应用专用密码没有过期、没有输错,同时查看Google账号的安全通知,确认没有拦截来自Heroku的登录请求,如有拦截点击信任即可。 - 排查网络限制问题
如果上述配置都正确,可查看Heroku应用运行日志的报错内容:如果是连接超时,大概率是Heroku动态出口IP被Google临时拦截,可尝试更换SMTP端口为587,将smtp_ssl=True改为smtp_starttls=True;如果是认证失败,重新生成Google应用专用密码后更新到Heroku配置变量即可。
内容的提问来源于stack exchange,提问作者Littlefatkid
相关产品推荐
相关产品推荐

