在Office365中使用INDY 10 SMTP

时间:2013-07-18 21:39:20

标签: delphi smtp indy indy10 office365

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

感谢。

1 个答案:

答案 0 :(得分:13)

Office365仅支持TLS端口587上的LOGIN 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;
    
  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;
    
  3. 更新:Office365不再支持SSL v3,您必须立即使用TLS v1.x:

    (idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;