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
相关产品推荐
相关产品推荐

