Python脚本通过Outlook发送自动化邮件报连接超时错误如何解决
这类SMTP连接超时报错的通用解决方案
- 第一步:修正服务配置认知误区
你在账户设置中看到的443端口、https://outlook.office365.com/subdomain/Exchange.asmx是Exchange Web Services(EWS)接口的地址,并非SMTP发信的服务配置。Office365官方标准SMTP发信配置为:- 服务器地址:
smtp.office365.com - 端口:
587(使用STARTTLS加密),禁止直接填写带https前缀的地址作为SMTP服务器域名
- 服务器地址:
- 第二步:排查网络连通性
超时报错90%以上是网络层面不通导致,优先用命令行工具验证端口连通性:
如果命令行也返回超时,依次检查:# Mac/Linux 下执行 telnet smtp.office365.com 587 # 或用nc验证 nc -zv smtp.office365.com 587- 本地设备防火墙是否阻止了Python对外连接587/465端口
- 所在公司内网是否限制了对外SMTP端口的访问(很多企业为了防控垃圾邮件会封公网SMTP端口)
- 是否开启了代理/VPN,代理规则是否拦截了SMTP协议请求
- 第三步:校验账号权限配置
网络连通正常的前提下,检查账号配置:- 确认管理员已为该Office365账号开启SMTP AUTH权限
- 若账号开启了多因素认证(MFA),不能直接用账号密码登录,需申请专用应用密码,或使用OAuth2方式完成认证
- 第四步:修正代码逻辑
标准Office365 SMTP发信参考代码如下:import smtplib, ssl from email.mime.text import MIMEText username = 'me@company.com' password = '你的密码/专用应用密码' smtp_server = "smtp.office365.com" port = 587 sender_email = username receiver_email = "me@company.com" # 构造标准邮件格式,避免被服务器拒收 message = MIMEText("Hi there! This message is sent from Python.") message['Subject'] = "测试邮件" message['From'] = sender_email message['To'] = receiver_email context = ssl.create_default_context() with smtplib.SMTP(smtp_server, port) as server: server.starttls(context=context) server.login(username, password) server.sendmail(sender_email, receiver_email, message.as_string()) - 备选方案:绕开SMTP限制
若内网确实封了SMTP端口,可使用exchangelib库调用EWS接口发信,走的就是常规443端口,不会被防火墙拦截,也符合Office365的接口规范。
额外说明:Mac系统本身完全支持SMTP协议,Outlook for Mac默认用IMAP是收信协议,发信仍默认调用SMTP服务,你的初始推测不成立。
内容的提问来源于stack exchange,提问作者NayefMusa
相关产品推荐
相关产品推荐

