使用Python通过SMTP发Outlook邮件时偶发TimeoutError[WinError10060]求助
解决Outlook SMTP发送邮件偶尔超时(WinError 10060)的方案
针对你遇到的SMTP连接偶发超时问题,以下是几个实用的解决方向:
1. 给SMTP连接添加超时控制+重试机制
网络波动是这类偶发超时的常见原因,通过设置超时时间并添加重试逻辑,可以大幅降低失败概率。修改后的代码示例:
import smtplib from email.message import EmailMessage from email.utils import formataddr import time def send_email(subject, receiver_email, name): max_retries = 3 retry_delay = 2 # 重试间隔秒数 timeout = 15 # 连接超时时间 msg = EmailMessage() msg["Subject"] = subject msg["From"] = formataddr(("Subject.", sender_email)) msg["To"] = receiver_email msg["BCC"] = sender_email msg.set_content(f""" some message """) for attempt in range(max_retries): try: # 初始化SMTP时设置超时 with smtplib.SMTP(email_server, 587, timeout=timeout) as mailserver: mailserver.ehlo() mailserver.starttls() mailserver.ehlo() mailserver.login(sender_email, password_email) mailserver.sendmail(sender_email, receiver_email, msg.as_string()) return # 发送成功直接返回 except (smtplib.SMTPException, TimeoutError) as e: if attempt == max_retries - 1: raise e # 最后一次重试失败,抛出异常 time.sleep(retry_delay)
- 使用
with语句自动管理SMTP连接,避免手动quit()可能的资源泄漏 - 设置
timeout参数防止连接无限等待 - 最多重试3次,每次间隔2秒,适配临时网络波动
2. 确认Outlook SMTP配置正确性
Outlook(Office 365)的官方SMTP配置是固定的,不要随意更换:
- 服务器:
smtp.office365.com - 端口:587(必须配合STARTTLS)
- 如果你的账户开启了两步验证,不能用原密码登录,需要生成并使用「应用密码」
3. 排查网络环境限制
- 检查本地防火墙/杀毒软件是否拦截了SMTP连接(587端口)
- 如果是公司网络,确认是否需要通过代理服务器连接SMTP,若需要则在初始化SMTP前添加代理配置:
import socks socks.set_default_proxy(socks.HTTP, "proxy_host", proxy_port) socks.wrapmodule(smtplib) - 联系ISP确认是否对SMTP出站连接有限流
4. 控制邮件发送频率
Outlook对短时间内的邮件发送量有阈值限制,若批量发送邮件,建议每发送1-2封添加10-15秒的延迟,避免触发服务器限流导致连接超时。
内容的提问来源于stack exchange,提问作者Gb Fd
相关产品推荐
相关产品推荐

