Delphi 如何解决[EIdSMTPReplyError]身份验证失败的问题?

Delphi 如何解决[EIdSMTPReplyError]身份验证失败的问题?,delphi,Delphi,我正在尝试将SMTP与TLS和Office365一起使用。我能够使用powershell和TLS成功发送电子邮件,但以下示例中我当前遇到了错误: 项目SMTP_SSL_Example.exe引发异常类EIdSMTPReplyError 消息“身份验证”失败 [JN2P275CA0026.ZAFP275.PROD.OUTLOOK.COM] 连接成功,但代码中的身份验证部分失败。我以前被告知,响应来自服务器。如果我使用PowerShell成功收到邮件,这有什么不同?有什么想法吗 我用的是印地10.6

我正在尝试将SMTP与TLS和Office365一起使用。我能够使用powershell和TLS成功发送电子邮件,但以下示例中我当前遇到了错误:

项目SMTP_SSL_Example.exe引发异常类EIdSMTPReplyError 消息“身份验证”失败 [JN2P275CA0026.ZAFP275.PROD.OUTLOOK.COM]

连接成功,但代码中的身份验证部分失败。我以前被告知,响应来自服务器。如果我使用PowerShell成功收到邮件,这有什么不同?有什么想法吗

我用的是印地10.6.2.5366

更新:另一套组件套装也出现了同样的错误。我只是不明白为什么Powershell允许我发送邮件,但我无法编程

procedure TForm28.Method2Click(Sender: TObject);
var
  idSMTP1: TIdSMTP;
  idSASLLogin: TIdSASLLogin;
  idUserPassProvider: TIdUserPassProvider;
begin
  idSMTP1 := TIdSMTP.Create(nil);
  try
    idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
    idSMTP1.UseTLS := utUseExplicitTLS;
    TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;

    idSMTP1.Host := 'smtp.office365.com';
    idSMTP1.Port := StrToInt(cbPort.Text);

    idSASLLogin := TIdSASLLogin.Create(idSMTP1);
    idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);

    idSASLLogin.UserPassProvider := idUserPassProvider;
    idUserPassProvider.Username := 'my username';
    idUserPassProvider.Password := 'my passowrd';

    idSMTP1.AuthType := satSASL;
    idSMTP1.SASLMechanisms.Add.SASL := idSASLLogin;

    try
      idSMTP1.Connect;
      try
        idSMTP1.Authenticate;
        SendEmail(idSMTP1);
      finally
        idSMTP1.Disconnect;
      end;
      ShowMessage('OK');
    except
      on E: Exception do
      begin
        ShowMessage(Format('Failed!'#13'[%s] %s', [E.ClassName, E.Message]));
        raise;
      end;
    end;
  finally
    idSMTP1.Free;
  end;
end;

procedure TForm28.Mehod1Click(Sender: TObject);
var
  idSMTP1: TIdSMTP;
begin
  idSMTP1 := TIdSMTP.Create(nil);
  try
    idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
    idSMTP1.UseTLS := utUseExplicitTLS;
    TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;

    idSMTP1.Host := 'smtp.office365.com';
    idSMTP1.Port := StrToInt(cbPort.Text);

    idSMTP1.AuthType := satDefault;
    idSMTP1.Username := 'my username';
    idSMTP1.Password := 'my password';


    try
      idSMTP1.Connect;
      try
        idSMTP1.Authenticate;
        SendEmail(idSMTP1);
      finally
        idSMTP1.Disconnect;
      end;
      ShowMessage('OK');
    except
      on E: Exception do
      begin
        ShowMessage(Format('Failed!'#13'[%s] %s', [E.ClassName, E.Message]));
        raise;
      end;
    end;
  finally
    idSMTP1.Free;
  end;
end;
Office 365会,但您的代码强制Indy改用TLS 1.0。Office 365正式不再支持TLS 1.0或1.1,但它暂时仍接受1.0/1.1会话,但这将在未来几个月发生变化

因此,至少你需要改变这一点:

TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method:=sslvTLSv1;
为此:

TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method:=sslvTLSv1\u 2;
或者更好的做法是:

TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.SSLVersions:=[sslvTLSv1、sslvTLSv1、sslvTLSv1、sslvTLSv1、sslvtlsv2];
也就是说,使用
tidsallogin
作为唯一的SASL机制与使用
tidstp.AuthType=satDefault
完全相同。它们都向服务器发送相同的
AUTH LOGIN
命令。而这个命令就是失败的地方。但没有办法确切知道为什么会发生这种情况。“身份验证不成功”是一条太普通的错误消息,在Office 365中发生此错误的原因有很多。可能您使用了错误的用户名/密码。服务器上可能没有将通过其
EHLO
命令1中的
tidmtp
发送的主机名解析的IP地址列入白名单。谁知道呢


1:尝试将客户端计算机的
tidstp.HeloName
属性设置为FQDN,您可以从中获取该属性。

我尝试了所有建议,但仍未解决此问题。