在Office365中使用INDY 10 SMTP

Tim*_*top 5 delphi smtp indy indy10 office365

我不熟悉INDY SMTP组件.我想用INDY和Office 365发送邮件.这是一个很好的主题,它帮助了我很多:SMTP Indy组件的安全性和身份验证属性有什么作用? 但我没想出如何使用SASL.Office365地址是smtp.office365.com,端口为587和TLS.所以我在表单中添加了一个SMTP和一个OpenSSL-IOHandler并设置了属性.但我没有工作,应用程序只是冻结.我需要知道如何在Office365中使用SASL.

谢谢.

Rem*_*eau 13

Office365仅支持LOGINTLS端口587上的SASL.

当我尝试它时,以下代码对我来说很好(所有这些设置也可以在设计时设置):

  1. TIdSMTP.AuthType属性设置为satDefault,使用SMTP AUTH LOGIN命令:

    var
      idSMTP1: TIdSMTP;
    begin
      idSMTP1 := TIdSMTP.Create(nil);
      try
        idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
        idSMTP1.UseTLS := utUseExplicitTLS;
        TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;
    
        idSMTP1.Host := 'smtp.office365.com';
        idSMTP1.Port := 587;
    
        idSMTP1.AuthType := satDefault;
        idSMTP1.Username := ...;
        idSMTP1.Password := ...;
    
        try
          idSMTP1.Connect;
          try
            idSMTP1.Authenticate;
          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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. TIdSMTP.AuthType属性设置为satSASL和使用TIdSASLLogin,它使用相同的SMTP AUTH LOGIN命令:

    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 := sslvSSLv3;
    
        idSMTP1.Host := 'smtp.office365.com';
        idSMTP1.Port := 587;
    
        idSASLLogin := TIdSASLLogin.Create(idSMTP1);
        idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);
    
        idSASLLogin.UserPassProvider := idUserPassProvider;
        idUserPassProvider.Username := ...;
        idUserPassProvider.Password := ...;
    
        idSMTP1.AuthType := satSASL;
        idSMTP1.SASLMechanisms.Add.SASL := idSASLLogin;
    
        try
          idSMTP1.Connect;
          try
            idSMTP1.Authenticate;
          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;
    
    Run Code Online (Sandbox Code Playgroud)

更新:Office365不再支持SSL v3,您必须立即使用TLS v1.x:

(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
Run Code Online (Sandbox Code Playgroud)