使用Python发邮件遇smtplib.SMTPAuthenticationError的排查
排查SMTP认证失败(535错误)原因
执行Python发送邮件代码时出现错误:smtplib.SMTPAuthenticationError: (535, b'5.7.8 Error: authentication failed: UGFzc3dvcmQ6')。已确认登录账号密码正确,使用的是测试专用邮箱,尝试过更换端口、邮件服务商及主机,但仍无法发送测试邮件。附上代码及server.set_debuglevel(1)的输出,请求排查登录失败原因。
代码示例
import smtplib mailFrom = "Test email sends" mailTo = ["python123321testowy@op.pl"] mailSubjest = "Test message" mailBody = ''' email test test ''' msg = '''From: {} Subject: {} {} '''.format(mailFrom,mailSubjest,mailBody) user = "python123321testowy@op.pl" password = "pwd" server = smtplib.SMTP_SSL('SMTP.poczta.onet.pl', 465) server.ehlo() server.login(user, password) server.sendmail(user, mailTo, msg) server.close()
server.set_debuglevel(1)输出
send: 'ehlo [192.168.0.19]\r\n' reply: b'250-smtp.poczta.onet.pl\r\n' reply: b'250-PIPELINING\r\n' reply: b'250-SIZE 90000000\r\n' reply: b'250-ETRN\r\n' reply: b'250-AUTH PLAIN LOGIN XOAUTH2\r\n' reply: b'250-AUTH=PLAIN LOGIN XOAUTH2\r\n' reply: b'250-ENHANCEDSTATUSCODES\r\n' reply: b'250 8BITMIME\r\n' reply: retcode (250); Msg: b'smtp.poczta.onet.pl\nPIPELINING\nSIZE 90000000\nETRN\nAUTH PLAIN LOGIN XOAUTH2\nAUTH=PLAIN LOGIN XOAUTH2\nENHANCEDSTATUSCODES\n8BITMIME' send: 'AUTH PLAIN AHB5dGhvbjEyMzMyMXRlc3Rvd3lAb3AucGwAUXdlcnR5MTIzNDU2Nzg5QEAh\r\n' reply: b'535 5.7.8 Error: authentication failed: \r\n' reply: retcode (535); Msg: b'5.7.8 Error: authentication failed:' send: 'AUTH LOGIN cHl0aG9uMTIzMzIxdGVzdG93eUBvcC5wbA==\r\n' reply: b'334 UGFzc3dvcmQ6\r\n' reply: retcode (334); Msg: b'UGFzc3dvcmQ6' send: 'UXdlcnR5MTIzNDU2Nzg5QEAh\r\n' reply: b'535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6\r\n' reply: retcode (535); Msg: b'5.7.8 Error: authentication failed: UGFzc3dvcmQ6' send: 'quit\r\n' reply: b'221 2.0.0 Bye\r\n' reply: retcode (221); Msg: b'2.0.0 Bye'
排查方向及解决方案
从debug输出可见,服务器支持PLAIN、LOGIN、XOAUTH2三种认证方式,但两次认证尝试均失败,可从以下几点排查:
密码一致性验证:
debug中发送的密码Base64串UXdlcnR5MTIzNDU2Nzg5QEAh解码后是Qwerty123456789@@!,但代码里写的是password = "pwd",明显不符。先确认代码中实际使用的密码是否正确,排查是否存在变量赋值错误、复制粘贴时的遗漏或特殊字符问题。可以用以下代码验证密码的Base64编码是否和debug中的一致:import base64 actual_pwd = "你的实际密码" print(base64.b64encode(actual_pwd.encode('utf-8')).decode('utf-8'))邮箱服务商安全限制:
- 确认是否在邮箱网页端开启了SMTP服务:多数邮箱默认关闭SMTP功能,需手动在设置中启用。
- 若开启了两步验证,不能使用普通登录密码,必须生成应用专用密码用于SMTP登录。
- 检查是否有IP登录限制:如果是首次在当前IP登录SMTP,可能触发邮箱的安全机制,需要在网页端登录邮箱完成验证。
代码及连接调整:
- 尝试去掉
server.ehlo()调用:SMTP_SSL连接建立后,部分服务器会自动完成EHLO握手,手动调用可能干扰认证流程。 - 改用
STARTTLS连接方式:尝试使用587端口,代码示例:server = smtplib.SMTP('smtp.poczta.onet.pl', 587) server.starttls() # 启用加密 server.login(user, password) - 确认SMTP服务器地址准确性:验证onet.pl官方SMTP服务器地址是否为
smtp.poczta.onet.pl(大小写不影响,但建议统一小写)。
- 尝试去掉
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

