使用Python smtplib发送邮件时出现PermissionError的原因咨询
问题分析与解决思路
错误核心原因
WinError 10013是Windows系统阻止Python程序创建网络套接字连接导致的,结合你的Gmail SMTP场景,主要原因有这些:
- 拼写错误(先修正):你代码里写的是
smpt.gmail.com,正确域名是smtp.gmail.com,虽然这不会直接触发权限错误,但会导致后续连接失败。 - 防火墙/杀毒软件拦截:Windows Defender或第三方杀毒软件会监控程序网络访问,可能把Python的SMTP连接判定为风险操作,直接拦截了端口访问。
- 端口权限与ISP限制:smtplib.SMTP默认用25端口,很多ISP会封禁这个端口防垃圾邮件;同时Windows对普通用户使用知名端口(如25)有严格权限限制,普通进程可能没法访问。
- Gmail账号配置问题:如果你的Gmail开了两步验证,必须用应用专用密码登录,不能用原账号密码;没开两步验证的话,得在Google账号设置里允许“不太安全的应用访问”(更推荐用应用密码),否则Gmail会拒绝登录,间接引发连接类错误。
修正后的代码示例
import smtplib from email.mime.text import MIMEText my_email = "sender_email@gmail.com" # 开启两步验证就填应用专用密码,没开就填原密码(需允许低安全应用) my_password = "your_app_password_or_account_password" # 指定Gmail推荐的587端口,避免25端口被封禁/权限不足 connection = smtplib.SMTP("smtp.gmail.com", 587) connection.starttls() connection.login(user=my_email, password=my_password) # 构造符合邮件标准的消息体,避免被邮箱服务商拒收 msg = MIMEText("Hello") msg["Subject"] = "Test Email" msg["From"] = my_email msg["To"] = "receiver_email@gmail.com" connection.sendmail(from_addr=my_email, to_addrs="receiver_email@gmail.com", msg=msg.as_string()) connection.quit()
额外排查步骤
- 暂时关闭防火墙/杀毒软件测试,要是能正常发邮件,就把Python程序添加到防火墙允许列表里。
- 用
telnet smtp.gmail.com 587测试端口是否可用,能连接说明ISP没封禁这个端口。 - 检查Google账号安全设置,确认应用密码或低安全应用权限配置正确。
内容的提问来源于stack exchange,提问作者bchyou
相关产品推荐
相关产品推荐

