7

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

谢谢。

4

1 回答 1

16

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

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

  1. TIdSMTP.AuthType属性设置为satDefault,它使用 SMTPAUTH 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,它使用相同的 SMTPAUTH 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;
    

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

(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
于 2013-07-19T00:09:39.913 回答