Delphi 11 Indy调用Gmail SMTP报用户名密码不接受问题咨询
Delphi 11 SMTP发信报“Username and Password not accepted”修复方案
之前可正常运行的代码突发该错误,90%以上场景是邮箱服务商安全策略调整导致,按以下顺序排查即可:
- 检查SMTP服务状态:登录对应邮箱的网页端,进入设置页确认POP3/SMTP/IMAP服务处于开启状态,部分服务商会定期自动关闭长期未使用的第三方客户端访问权限,重新开启即可。
- 替换为SMTP专用授权码:目前所有主流邮箱均已禁止使用账号登录密码直接通过SMTP认证,必须在邮箱安全设置页生成独立的第三方客户端授权码,将代码中
FromPassword变量的值替换为该授权码即可。注意授权码仅在生成时展示一次,丢失需重新生成。 - 匹配TLS模式与端口:当前代码使用
utUseImplicitTLS隐式TLS模式,对应端口必须为465;如果使用587端口,需将UseTLS改为utUseExplicitTLS显式TLS模式;25端口因垃圾邮件管控普遍被运营商、云服务商封禁,不建议使用。不要用StrToIntDef(PortNumber, 0)动态读端口,端口配置错误会直接导致连接异常被服务端返回认证失败。 - 补全正确版本的OpenSSL依赖:Delphi 11自带的Indy组件仅兼容OpenSSL 1.0.2版本(对应
libeay32.dll、ssleay32.dll两个文件),需将和程序位数一致的dll放在exe同目录,dll版本不匹配会导致SSL握手失败,服务端会直接返回用户名密码错误。 - 补全认证配置:当前代码未显式指定SMTP认证方式,需在连接前添加
AuthType := satDefault;,强制组件连接后发送用户名密码完成认证,部分服务端未收到认证请求会直接返回账号不接受错误。 - 修正代码字段错误:原代码中
IdMessage1.From.Name := 'Subject'写法错误,该字段是发件人展示名称,不是邮件主题,邮件主题需单独给IdMessage1.Subject赋值。 - 不要空吞异常:原代码的异常块没有任何输出,排查时建议临时添加错误日志输出
E.Message,可以快速定位是认证失败、连接失败还是SSL握手失败。
修正后的可运行代码参考:
with IdSMTP1 Do begin IOHandler := IdSSLIOHandlerSocketOpenSSL1; UseTLS := utUseImplicitTLS; AuthType := satDefault; Host := SMTP; Username := FromUser; Password := FromPassword; // 替换为SMTP专用授权码,勿用账号登录密码 Port := 465; IdMessage1.From.Address := IdSMTP1.Username; IdMessage1.From.Name := '发件人展示名称'; IdMessage1.Subject := '邮件实际主题'; try Connect; try Send(IdMessage1); Result := True; finally Disconnect; end; except on E:Exception do begin // 临时添加日志输出E.Message排查问题 end; end; end;
若使用Gmail、Outlook这类海外邮箱,开启两步验证后必须生成应用专用密码作为SMTP登录凭证,无法直接使用账号密码;使用企业邮箱的话需先确认管理员未限制第三方SMTP访问权限。
内容的提问来源于stack exchange,提问作者hi hello
相关产品推荐
相关产品推荐

