Python3.7使用SMTP发送邮件遇TimeoutError问题排查求助
问题诊断与修复方案
首先,你的代码存在几个明确错误,同时也可能伴随账户权限或网络层面的问题,咱们一步步拆解解决:
1. SMTP连接逻辑错误
你先初始化了smtplib.SMTP('smtp.gmail.com', 25),紧接着又调用server.connect("smtp.gmail.com",465)——这里的核心问题是:
- 端口465是SMTP over SSL的专用端口,必须用
smtplib.SMTP_SSL类初始化连接,而非普通的SMTP类 - 普通SMTP(端口25)要么是明文传输,要么需要后续调用
starttls()升级加密,但Gmail现在更推荐使用465(SSL)或587(STARTTLS)端口
正确的连接方式二选一:
方式一:SMTP_SSL(端口465)
server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.ehlo() # 可选但建议保留,用于确认服务器连接
方式二:STARTTLS(端口587)
server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() # 必须调用此方法启用加密 server.ehlo() # 再次调用确认加密连接状态
你当前的代码混用了两种连接逻辑,这是触发超时错误的主要原因。
2. Gmail账户权限设置问题
即使修复了代码,Gmail默认会阻止第三方应用用普通密码登录,你需要做以下设置:
- 若开启了两步验证(2FA):必须创建应用专用密码(App Password),用这个密码替代你的邮箱登录密码
- 若未开启2FA:需要在Google账户设置中启用"不太安全的应用访问"(不过该选项已逐步被废弃,更推荐启用2FA后使用应用专用密码)
3. 网络层面的排查方向
如果上述修复后仍报错,再考虑网络因素:
- 你的防火墙/路由器可能拦截了25、465或587端口,可切换到手机热点测试
- 部分地区网络无法直接访问Gmail的SMTP服务器,这种情况需要使用代理服务
修复后的完整代码示例
这里给你一个基于SMTP_SSL的可运行版本:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # 正确初始化SSL连接 server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.ehlo() # 读取密码(建议使用应用专用密码) with open('password.txt', 'r') as f: password = f.read().strip() # 加上strip()避免读取到多余换行符 server.login('mymail@gmail.com', password) msg = MIMEMultipart() msg['From'] = 'mymail@gmail.com' msg['To'] = 'mymail2@yahoo.com' msg['Subject'] = 'Mail testing with Python' with open('message.txt', 'r') as f: message = f.read() msg.attach(MIMEText(message, 'plain')) text = msg.as_string() server.sendmail('mymail@gmail.com', 'mymail2@yahoo.com', text) # 记得关闭连接 server.quit()
最后提醒:不要把密码明文写在代码里,用文件读取是个好习惯,但要确保password.txt的权限安全,避免被他人访问。
内容的提问来源于stack exchange,提问作者Mohammad Isaac Norman
相关产品推荐
相关产品推荐

