使用smtplib发送邮件遭遇ssl.SSLEOFError错误求助
使用smtplib发送Gmail邮件时遭遇SSL错误的解决方法
问题描述
我严格按照教程用smtplib发送邮件,代码如下:
import smtplib my_email = "XXXX@gmail.com" password = "YYYY" connection = smtplib.SMTP("smtp.gmail.com", port=587) connection.starttls() connection.login(user=my_email, password=password) connection.sendmail(from_addr=my_email,to_addrs="VVVV", msg="hello") connection.close()
运行时一直报错:ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:997),偶尔还会出现其他异常。请问是系统问题吗?
解决方案
- 替换为应用专用密码:Gmail目前禁止第三方应用使用普通密码登录,需先给账号开启两步验证,然后在Google账号安全设置中生成「应用专用密码」,用这个密码替换代码里的
YYYY。 - 改用SMTP_SSL连接:放弃SMTP+starttls的方式,直接建立SSL加密连接,同时修正邮件格式(必须包含标准邮件头),示例代码:
import smtplib my_email = "XXXX@gmail.com" app_password = "你的应用专用密码" # 使用with语句自动管理连接,无需手动close with smtplib.SMTP_SSL("smtp.gmail.com", 465) as connection: connection.login(my_email, app_password) # 邮件必须包含From、To、Subject头,正文和头之间用空行分隔 msg_content = f"From: {my_email}\nTo: VVVV\nSubject: 测试邮件\n\nhello" connection.sendmail(my_email, "VVVV", msg_content)
- 修正邮件格式:原代码里的
msg仅为纯文本内容,不符合SMTP协议要求,服务器会拒绝此类请求,必须添加邮件头信息。 - 排查网络拦截:如果以上操作无效,检查本地防火墙、代理是否拦截了465或587端口,确保网络能正常访问Gmail的SMTP服务器。
内容的提问来源于stack exchange,提问作者Resherry2020
相关产品推荐
相关产品推荐

