使用Python smtplib连接Gmail SMTP发邮件无输出无报错问题求助
逐步骤排查解决方法
1. 优先修复代码中的基础配置与参数错误
- 代码中所有写死的
sender、reciever是无意义的字符串占位,不是可识别的真实邮箱,SMTP服务器无法定位发件/收件地址:msg['From']、msg['To']、smtp.sendmail()方法里的发件人、收件人参数,全部要替换为完整的、带域名的真实邮箱地址(比如xxx@gmail.com)smtp.login()方法里的'gmail'、'code'同样是占位值:第一个参数要填完整的发件人Gmail账号,第二个参数不能填账号日常登录密码,要填Gmail生成的应用专用密码
- 原代码中
smtp.sendmail()的第三个参数直接传入了msg对象,没有调用msg.as_string()方法把邮件对象转成符合RFC标准的字符串格式,服务器收到非标准格式的邮件内容会直接丢弃,不会给发件人返回明显的错误提示。
2. 解决“运行无任何输出”的静默问题
当前的代码没有加任何交互日志和异常捕获,哪怕连接失败、认证被拒、参数错误,也可能因为没有主动打印内容,让控制台看起来没有反应。只需做两处调整就能把所有问题暴露出来:
- 打开SMTP模块的内置调试日志:在SMTP连接代码块里加上
smtp.set_debuglevel(1),运行后控制台会打印你和Gmail邮件服务器的每一步交互指令、返回结果,哪一步卡住或者被拒绝会直接显示在终端 - 给所有SMTP操作套上异常捕获块,把错误信息打印到控制台,不要让异常静默吃掉
参考调整后的可直接定位问题的代码片段:
import smtplib from email.message import EmailMessage # 替换为真实值 SENDER = "你的完整gmail账号@gmail.com" RECEIVER = "收件人完整邮箱地址" APP_SPECIFIC_PASSWORD = "gmail生成的16位应用专用密码" msg = EmailMessage() msg['Subject'] = 'Product in Stock Alert' msg['From'] = SENDER msg['To'] = RECEIVER msg.set_content( "Hey, {} is now available in stock\n" "Check it out soon : {}".format('hamza', 'google.com') ) try: with smtplib.SMTP('smtp.gmail.com', 587, timeout=15) as smtp: smtp.set_debuglevel(1) smtp.ehlo() smtp.starttls() smtp.ehlo() smtp.login(SENDER, APP_SPECIFIC_PASSWORD) smtp.sendmail(SENDER, RECEIVER, msg.as_string()) print("邮件发送请求已成功提交到服务器") except Exception as e: print(f"发送流程出错,具体原因:{str(e)}")
3. 纠正Gmail账号的配置误区
之前提到的“开启低安全应用访问、关闭两步验证”的配置逻辑,现在已经不适用:
- Gmail在2022年5月已永久下线全局的“低安全应用访问”开关,这个选项在当前的账号设置里已经找不到入口,老的认证规则完全失效
- 现在哪怕关闭两步验证,Gmail也不支持直接用账号日常登录密码做SMTP客户端认证,必须通过账号安全页生成独立的16位应用专用密码,用这个密码完成SMTP登录,否则会被服务器静默拒绝,且因为原代码没有开调试日志,根本看不到认证失败的提示
4. 补充排查其他影响因素
- 检查本地网络连通性:确认本地网络可以正常连通
smtp.gmail.com的587端口,不要被本地防火墙、系统代理拦截出站连接,连接被拦时代码会卡在连接环节,没有日志的情况下就会表现为“运行没反应” - 检查收件箱的垃圾邮件文件夹:就算发送流程全部走通,这类库存提醒类的邮件很容易被邮箱服务商判定为垃圾邮件,不会出现在收件箱的默认位置
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

