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

Python 2.7:同脚本桌面正常,虚拟机无法发送邮件

解决SMTP Office365发送邮件时的Socket 10013权限错误

这个socket权限错误我在虚拟机部署脚本时也踩过坑,针对你用smtp.office365.com发邮件的问题,给你几个实用的排查和解决方向:

1. 先查虚拟机防火墙的出站拦截

错误[Errno 10013]本质是进程没有权限访问指定的SMTP端口,首先要排除防火墙的锅:

  • 先临时关闭虚拟机的Windows防火墙(或者对应系统的防火墙),测试脚本能不能正常发送邮件。如果成功了,就需要给Python进程(或者Jenkins进程,看报错路径是Jenkins工作空间)添加出站规则,允许访问587端口(Office365推荐的SMTP端口)。
  • 以Windows为例:打开Windows Defender防火墙 → 高级设置 → 出站规则 → 新建规则,选择「端口」,指定TCP 587端口,允许连接,应用到目标程序(可以选Python.exe或者Jenkins的启动程序)。

2. 检查Jenkins服务的运行权限

从报错路径看,脚本是在Jenkins工作流里跑的,Jenkins默认用的Local Service账户权限很低,可能没有网络连接权限:

  • 打开Windows服务列表,找到Jenkins服务,右键「属性」→「登录」选项卡,切换成本地系统账户(记得勾选「允许服务与桌面交互」),或者用有管理员权限的本地/域账户,重启Jenkins后再测试。

3. 验证虚拟机的网络连通性

有些企业虚拟机环境会有网络策略限制,拦截SMTP出站流量:

  • 先在虚拟机里用telnet测试连通性:telnet smtp.office365.com 587,如果连不上,说明是网络层面的限制,得找运维调整虚拟机的网络策略,允许访问这个地址和端口。

4. 确认SMTP配置的正确性

Office365对SMTP连接有严格要求,别用错端口和加密方式:

  • 检查你NewEmailUtility.py第190行的配置,确保SMTPEMAILPORT是587,并且连接后要启用TLS加密,代码大概是这样:
import smtplib

SMTPEMAILHOST = 'smtp.office365.com'
SMTPEMAILPORT = 587
EMAIL_USER = 'your-account@outlook.com'
EMAIL_PASSWORD = 'your-password'

server = smtplib.SMTP(SMTPEMAILHOST, SMTPEMAILPORT)
server.starttls()  # 这行必须加,Office365要求TLS加密
server.login(EMAIL_USER, EMAIL_PASSWORD)
# 后续的发邮件逻辑...

5. 排查杀毒软件的拦截

虚拟机里的杀毒软件可能会把Python的网络连接误判为恶意行为,拦截socket访问:

  • 临时关闭杀毒软件测试,如果能正常发送,就把Python.exe和Jenkins的安装目录加入杀毒软件的信任列表。

内容的提问来源于stack exchange,提问作者thebadguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:29:34