7

私は INDY SMTP コンポーネントに慣れていません。INDY と Office 365 を使用してメールを送信したいと考えています。次のトピックが役に立ちました: SMTP Indy コンポーネントのセキュリティと認証プロパティは何をしますか? しかし、SASL の使い方がわかりませんでした。Office365 アドレスは smtp.office365.com で、ポート 587 と TLS を使用します。そこで、フォームに SMTP と OpenSSL-IOHandler を追加し、プロパティを設定しました。しかし、私は機能しませんでした。アプリはフリーズしています。Office365 で SASL を使用する方法を知る必要があります。

ありがとう。

4

1 に答える 1

16

Office365 は、LOGINTLS ポート 587 での SASL のみをサポートします。

次のコードは、試してみたところうまくいきました(これらの設定はすべて、設計時にも設定できます)。

  1. SMTPコマンドを使用する にTIdSMTP.AuthTypeプロパティを設定します。satDefaultAUTH 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 に答える