smtp.gmail.com TLS连接异常,不使用smtplib的SMTP认证失败问题
问题排查及修复方案
核心问题1:SMTP返回码校验规则完全错误
SMTP协议的标准返回码含义完全写反,错误的判断逻辑会导致程序提前进入异常流程,后续命令执行全部错乱:
- 正常HELO命令返回码为
250,代码中错误判断为530才合法,530实际是「未认证禁止操作」的错误码 - MAIL FROM、RCPT TO命令正常返回码为
250,全部被设置为判断530合法 - DATA命令正常返回码为
354,也被错误设置为判断530合法
核心问题2:发送用户名/密码时缺少协议要求的换行符
SMTP所有交互内容都必须以\r\n结尾,对用户名、密码做base64编码后直接发送,没有追加换行符,服务器会一直等待输入结束,所以会出现输入后一直返回空白的卡顿现象。
需要修改为:
uname = base64.b64encode(username.encode()) + b'\r\n' pword = base64.b64encode(password.encode()) + b'\r\n'
核心问题3:ssl.wrap_socket缺少必要参数
当前Python的ssl模块调用wrap_socket封装SMTP服务的TLS连接时,必须指定server_hostname参数,否则会出现证书验证失败或者TLS握手异常,修改为:
ssl_clientSocket = ssl.wrap_socket(clientSocket, server_hostname=mailserver)
其他注意事项
- 谷歌SMTP服务已经不再支持普通账号密码直接登录,如果开启了谷歌账号两步验证,必须创建应用专用密码用于SMTP登录
- 第二次HELO后的响应打印被注释,建议取消注释方便排查响应内容
- 所有套接字的recv/read结果建议统一做decode处理,方便查看错误信息
内容的提问来源于stack exchange,提问作者user16951674
相关产品推荐
相关产品推荐

