You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:55:30