使用Python通过Gmail发送邮件时程序卡住问题排查
问题分析与修复方案
核心问题
你的代码存在三个关键问题,导致邮件发送失败(或看似卡住):
1. 邮件消息格式不符合SMTP规范
当前的message是一个包含字符串的元组,且缺少SMTP要求的必要邮件头(From、To、Subject),头与正文之间也没有空行。SMTP服务器需要符合RFC 2822标准的邮件内容,否则会拒绝处理或进入等待状态。
2. 异常处理错误
Python 3中Exception对象没有message属性,导致发生异常时无法打印错误信息,你误以为程序"卡住",实际上是抛出了异常但未正确输出。
3. 非英文主题未编码
如果subject包含波兰语等非ASCII字符,直接拼接会导致格式错误或乱码,需要进行编码处理。
修复后的代码
import smtplib, ssl from email.mime.text import MIMEText from email.header import Header port = 465 # For SSL password = "valid password" context = ssl.create_default_context() def sendEmail(to_email, subject, content): from_email = "valid_email@zaliczenie.pl" # 构造符合规范的邮件内容,支持非英文主题 msg = MIMEText(f"Tresc zadania: {content}", 'plain', 'utf-8') msg['From'] = from_email msg['To'] = to_email msg['Subject'] = Header(subject, 'utf-8') message = msg.as_string() try: print("connecting") with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server: print("connected") server.login("tmp_email@gmail.com", password) print("logged") server.sendmail( from_addr=from_email, to_addrs=to_email, msg=message, ) print("sent") except Exception as e: # 正确打印异常信息 print(f"Error: {str(e)}")
额外注意事项
- Gmail会将发件人地址自动改写为你登录的
tmp_email@gmail.com,除非你在Gmail设置中添加了valid_email@zaliczenie.pl作为别名并验证通过。 - 确保应用密码是针对启用2FA的
tmp_email@gmail.com生成的,且选择的应用类别为"邮件"。
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

