使用Python smtplib无法发送Yahoo邮件?求解决方案
解决Yahoo邮箱通过smtplib发送邮件时的连接断开问题
问题现象
使用Python的smtplib库发送邮件,Gmail配置可正常运行,但切换为Yahoo邮箱后,执行到login步骤时抛出smtplib.SMTPServerDisconnected: Connection unexpectedly closed错误。
核心原因
Yahoo邮箱默认禁止使用普通账号密码登录第三方邮件脚本/客户端,必须使用应用专用密码,且前提是已开启账号的两步验证。
解决步骤
1. 开启Yahoo账号的两步验证
- 登录Yahoo账号的安全设置页面
- 找到「两步验证」选项并开启,按指引完成验证流程
2. 创建应用专用密码
- 在安全设置页面找到「应用专用密码」选项
- 选择对应应用类型(如「邮件」或「其他应用」),生成16位的应用专用密码
- 将该密码替换
.env文件中的LOGIN_PW值
3. 代码优化(可选但推荐)
部分SMTP服务器在starttls加密后需要重新发送EHLO指令,避免连接异常;同时添加异常处理便于排查问题。
修改后的完整代码
from email.mime.text import MIMEText import smtplib from dotenv import load_dotenv import os import sys if __name__ == '__main__': path = os.path.abspath(os.path.dirname(sys.argv[0])) fn = os.path.join(path, ".env") load_dotenv(fn) LOGIN_EMAIL = os.environ.get("LOGIN_EMAIL") LOGIN_PW = os.environ.get("LOGIN_PW") SMTP_SERVER = os.environ.get("SMTP_SERVER") SMTP_PORT = int(os.environ.get("SMTP_PORT")) MAIL_TO = os.environ.get("MAIL_TO") headlineTxt = "The Headline" msgTxt = "This is some Text" try: # 初始化SMTP连接 s = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) print(s.ehlo()) # 初始握手 print(s.starttls()) # 启用TLS加密 print(s.ehlo()) # 加密后重新握手,适配部分服务器 # 使用应用专用密码登录 print(s.login(LOGIN_EMAIL, LOGIN_PW)) # 构造邮件 msg = MIMEText(msgTxt) msg['Subject'] = headlineTxt msg['From'] = LOGIN_EMAIL msg['To'] = MAIL_TO # 补充To头,符合邮件规范 # 发送邮件 s.sendmail(LOGIN_EMAIL, MAIL_TO, msg.as_string()) print("邮件发送成功") except Exception as e: print(f"发送失败: {str(e)}") finally: # 确保连接关闭 if 's' in locals(): s.quit()
正确的Yahoo配置(.env文件)
LOGIN_EMAIL = your_yahoo_email@yahoo.com LOGIN_PW = 你的应用专用密码 SMTP_SERVER = smtp.mail.yahoo.com SMTP_PORT = 587 MAIL_TO = recipient_email@example.com
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

