使用smtplib自动发送Gmail邮件失败(账号密码正确)问题排查
Gmail SMTP 465端口发信失败(账号密码正确场景)排查方案


排除账号密码拼写错误的前提,按出现概率从高到低排查以下问题即可:
- 未使用应用专用密码做SMTP认证
Gmail 2022年就下线了「允许低安全性应用访问」的开关,普通账号密码无法用于第三方SMTP调用。如果账号没开两步验证,先去Google账号安全中心开启两步验证,之后在安全页底部找到「应用专用密码」入口,选择应用类型为邮件、设备为当前运行脚本的设备,生成16位专用密码,替换代码里原来的账号密码即可。如果不想用应用专用密码,需要走OAuth2.0授权流程,个人脚本场景用应用专用密码是成本最低的方案。 - 出口IP被Gmail反垃圾策略拦截
如果你使用的网络出口是被标记为垃圾邮件源的代理节点、国内机房IP,或者短时间发信量过高触发风控,Gmail会直接断开SMTP连接,不会返回明确的密码错误提示。可以先切换到常用的海外家庭宽带IP、或者官方客户端能正常登录发信的网络环境重试。 - 465端口连接代码写法错误
465端口是SMTP over SSL协议端口,不能初始化普通SMTP实例后再调用starttls(),正确的最小参考代码如下:import smtplib from email.mime.text import MIMEText sender_addr = "你的Gmail地址@gmail.com" sender_pwd = "16位应用专用密码" receiver_addr = "收信人邮箱地址" mail_content = MIMEText("邮件正文内容", "plain", "utf-8") mail_content["From"] = sender_addr mail_content["To"] = receiver_addr mail_content["Subject"] = "邮件标题" # 465端口必须直接初始化SMTP_SSL实例 with smtplib.SMTP_SSL("smtp.gmail.com", 465, timeout=10) as smtp_conn: smtp_conn.login(sender_addr, sender_pwd) smtp_conn.sendmail(sender_addr, receiver_addr, mail_content.as_string()) - 本地网络拦截了465端口出站请求
本地执行telnet smtp.gmail.com 465测试连通性,如果连接超时,排查本地防火墙、路由器规则、云服务器安全组是否放通465端口的出站访问权限即可。
内容的提问来源于stack exchange,提问作者Nguyen Minh
相关产品推荐
相关产品推荐

