Python smtplib发送Gmail邮件触发SMTPAuthenticationError报错
报错根因
你遇到的smtplib.SMTPAuthenticationError: (534, b'5.7.9 Application-specific password required')是Gmail的安全机制导致的:当前Gmail默认禁止第三方脚本直接使用账号登录密码调用SMTP服务,若账号开启了两步验证,必须使用单独生成的应用专用密码完成SMTP身份校验。
你参考的教程发布时间较早,未同步Gmail近年更新的安全规则,所以按旧教程操作会触发报错。
修复步骤
- 登录对应Gmail账号,确认账号已开启两步验证,未开启的话先完成两步验证绑定流程
- 进入账号安全设置页面,找到「应用专用密码」生成入口
- 应用类型选择「邮件」,设备选择当前运行Python脚本的设备,点击生成即可得到16位长度的应用专用密码
- 修改代码中
smtp.login()的密码参数,将原账号登录密码替换为刚生成的16位应用专用密码,密码不需要保留生成时显示的分隔空格
修正后可运行代码
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib msg = MIMEMultipart() msg["from"] = "jaibhamare@gmail.com" msg["to"] = "leenabhamare@gmail.com" msg["subject"] = "This is a python program" msg.attach(MIMEText("This is body", "plain")) with smtplib.SMTP(host="smtp.gmail.com", port=587) as smtp: smtp.ehlo() smtp.starttls() # 第二个参数替换为你自己生成的16位应用专用密码 smtp.login("jaibhamare@gmail.com", "xxxxxxxxxxxxxxxx") smtp.send_message(msg) print("sent")
补充说明:原代码中冗余导入了
from email import message,又用message作为邮件实例的变量名,会覆盖导入的模块,修正代码里把实例变量名改成msg避免冲突。另外不要把密码硬编码在代码中,建议通过环境变量读取敏感信息,避免密码泄露。
内容的提问来源于stack exchange,提问作者Jai Bhamare
相关产品推荐
相关产品推荐

