Using INDY 10 SMTP with Office365

后端 未结 1 1008
星月不相逢
星月不相逢 2020-12-11 04:53

I\'m not familar with the INDY SMTP component. I want to send a mail with INDY and Office 365. Here is a nice topic which helped me a lot: What do the SMTP Indy component se

相关标签:
1条回答
  • 2020-12-11 05:22

    Office365 only supports the LOGIN SASL on TLS port 587.

    The following code works fine for me when I just tried it (all of these settings can also be set up at design-time as well):

    1. setting the TIdSMTP.AuthType property to satDefault, which uses the SMTP AUTH LOGIN command:

      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;
      
    2. setting the TIdSMTP.AuthType property to satSASL and using TIdSASLLogin, which uses the same SMTP AUTH LOGIN command:

      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;
      

    Update: Office365 no longer supports SSL v3, you must use TLS v1.x now:

    (idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
    
    0 讨论(0)
提交回复
热议问题