Python 3.10调用Yahoo SMTP发信报错SMTPServerDisconnected求助
问题原因
该报错和Python版本、运行环境无关,是Yahoo邮箱的安全策略限制导致:
2020年之后Yahoo官方全面禁止第三方应用/客户端直接使用账号主密码登录SMTP、POP3、IMAP服务,即使主密码输入正确也会判定为非法登录,多次尝试后会触发临时风控,返回
535 5.7.0 (#AUTH005) Too many bad auth attempts错误并主动断开连接。
解决步骤
- 首先暂停所有测试请求1-2小时,当前已经触发临时登录限制,频繁尝试会延长封禁时间。
- 登录Yahoo账号网页端,进入账号安全设置,开启两步验证(2FA),这是生成应用专用密码的强制前提。
- 在账号安全页找到「应用密码」入口,选择自定义应用类型,任意命名(例如Python SMTP),系统会生成一个16位无空格的专用密码,仅在生成时展示一次,注意留存。
- 将代码中
smtp.login方法的第二个参数,从原来的账号主密码替换为上述生成的16位应用专用密码即可。
修改后代码示例
仅需修改登录行,其余逻辑无需调整:
import smtplib from email.message import EmailMessage email = EmailMessage() email['from'] = 'PM' email['to'] = 'someone@gmail.com' email['subject'] = 'Test text' email.set_content('Once upon a time ......') with smtplib.SMTP(host = 'smtp.mail.yahoo.com', port = 587) as smtp: smtp.set_debuglevel(1) smtp.ehlo() smtp.starttls() # 仅修改此处密码为生成的16位应用专用密码 smtp.login('another@yahoo.com' , 'xxxxxxxxxxxxxxxx') smtp.send_message(email) print('Done!')
注意事项
- 应用专用密码丢失可以直接重新生成,无需修改账号主密码。
- 若修改后仍报错,先在Yahoo网页端查看安全告警,确认所有陌生登录提示为本人操作,解除账号临时限制。
内容的提问来源于stack exchange,提问作者Positive Matician
相关产品推荐
相关产品推荐

