You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:37:31