使用Python发送邮件报错:smtplib.SMTPServerDisconnected连接意外关闭
解决Yahoo SMTP发送邮件时Connection unexpectedly closed错误
核心问题分析
你遇到的断开连接错误,主要原因是**sendmail参数使用错误**,以及邮件内容不符合SMTP协议规范,导致服务器拒绝请求并断开连接。另外需确认Yahoo账号的认证方式是否正确。
具体修复步骤
- 修正
sendmail调用格式:smtplib.SMTP.sendmail()的第三个参数是完整的邮件内容(包含所有邮件头和正文),不能分开传Subject和message。当前写法会导致请求格式非法,触发服务器断开。 - 构建标准邮件内容:必须包含
From、To、Subject等邮件头,头信息和正文之间用空行分隔(SMTP协议强制要求)。 - 使用Yahoo应用密码:如果账号开启了两步验证,必须使用应用专用密码登录,而非普通账号密码;即使没开两步验证,也建议尝试应用密码——Yahoo对SMTP登录的普通密码限制较多。
修复后的完整代码
import smtplib import ssl port = 465 # Yahoo SSL端口 smtp_server = "smtp.mail.yahoo.com" sender_email = "c.junction@yahoo.com" # 注意:开启两步验证时,此处需填写应用专用密码 password = input("Type your password and press enter:") receiver_email = "jawoneb660@jobsfeel.com" # 构建符合SMTP标准的邮件内容 message = f"""\ From: {sender_email} To: {receiver_email} Subject: Hi there Hello World!!! This message is sent from Python.""" context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as smtp: smtp.login(sender_email, password) # 正确调用sendmail:仅三个参数,第三个为完整邮件内容 smtp.sendmail(sender_email, receiver_email, message)
额外排查点
- 确认防火墙或代理没有拦截465端口的出站连接。
- 检查Yahoo账号的SMTP服务是否被禁用(可在账号设置的“邮件选项”中确认)。
内容的提问来源于stack exchange,提问作者Gaarrud
相关产品推荐
相关产品推荐

