使用Indy发送邮件时遇EIdSMTPReplyError:用户名和密码不被接受
解决Gmail SMTP认证失败(EIdSMTPReplyError: Username and Password not accepted)
一、Gmail账户安全设置排查
- 未开启两步验证:前往Google账户设置,启用不太安全的应用访问(部分地区该选项已移除,建议改为开启两步验证后使用应用专用密码)
- 已开启两步验证:生成应用专用密码,替换代码中原账户密码使用
- 解除CAPTCHA锁定:前往Google账户解锁验证页面,解除账户的CAPTCHA限制
二、调整Indy SSL配置
Gmail目前要求更高版本的TLS协议,同时需明确SSL模式为客户端,修正代码中SSL相关设置:
SSL.SSLOptions.Method := sslvTLSv1_2; // 替换原sslvTLSv1,也可尝试sslvTLSv1_3 SSL.SSLOptions.Mode := sslmClient; // 替换原sslmUnassigned,明确客户端模式
三、修复资源释放逻辑
原代码在异常场景下会导致资源泄漏,用try...finally包裹资源创建与释放:
procedure Gmail(UserName, Password, ToTarget, Subject, Body : String); var DATA : TIdMessage; SMTP : TIdSMTP; SSL : TIdSSLIOHandlerSocketOpenSSL; begin SMTP := TIdSMTP.Create(nil); try DATA := TIdMessage.Create(nil); try SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); try SSL.SSLOptions.Method := sslvTLSv1_2; SSL.SSLOptions.Mode := sslmClient; SSL.SSLOptions.VerifyMode := []; SSL.SSLOptions.VerifyDepth := 0; DATA.From.Address := UserName; DATA.Recipients.EMailAddresses := ToTarget; DATA.Subject := Subject; DATA.Body.Text := Body; SMTP.IOHandler := SSL; SMTP.Host := 'smtp.gmail.com'; SMTP.Port := 587; SMTP.Username := UserName; SMTP.Password := Password; SMTP.UseTLS := utUseExplicitTLS; SMTP.Connect; try SMTP.Send(DATA); finally SMTP.Disconnect; end; finally SSL.Free; end; finally DATA.Free; end; finally SMTP.Free; end; end;
四、优化异常提示
原异常捕获仅显示模糊信息,改为输出详细异常类与错误内容:
procedure TFormMain.Button1Click(Sender: TObject); begin mail_username := EditUserName.Text; mail_password := EditPassword.Text; mail_to := EditTo.Text; mail_subject := EditSubject.Text; mail_body := MemoBody.Text; try Gmail(mail_username, mail_password, mail_to, mail_subject, mail_body); ShowMessage('邮件发送成功!'); except on E: Exception do ShowMessage('发送失败:' + E.ClassName + ' - ' + E.Message); end; end;
内容的提问来源于stack exchange,提问作者QRick
相关产品推荐
相关产品推荐

