Einzelnen Beitrag anzeigen

friedt99

Registriert seit: 17. Mär 2010
45 Beiträge
 
#1

Indy und OAuth / Microsoft365

  Alt 5. Sep 2023, 12:07
Hallo Zusammen,

ich versuche mich an microsoft365 und SMTP mit OAuth.
Habe nach diversen Anleitungen eine App dort angelegt und entsprechende Rechte eingerichtet.

Aktuell beziehe ich einen Token über eine Komponenten von https://www.esegece.com/websockets,
das klappt soweit.

Was nicht klappt ist der Indy SMTP Teil. Hier die Funktion mit der per OAuth eine Mail gesendet werden soll.

Delphi-Quellcode:
procedure TForm1.SendSMTP(ptToken:String);
Var lcSMTP:TIdSMTP;
    lcMail:TIdMessage;
    lcRec:TIdEMailAddressItem;
    ltAuth:String;
    lcAuthSASL:TIdSASLListEntry;
    lcIdSSLIOHandlerSocketSMTP:TidSSLIOHandlerSocketOpenSSL;
    lcUserPass:TIdUserPassProvider;
    lcDebug:TIdLogDebug;
begin
  lcSMTP:=TIdSMTP.Create;
  Try
    lcSMTP.Host:='smtp.office365.com';
    lcSMTP.Port:=587;

    lcMail:=TIdMessage.Create(lcSMTP);
    Try
      lcMail.Encoding:=meMime;
      lcRec:=lcMail.Recipients.Add;
      lcRec.Address:='XXX@YYY.de';
      lcRec.Name:='XXX@YYY.de';

      lcMail.Subject:='Test';
      lcMail.Body.Text:='Testnachricht via OAuth';

      lcIdSSLIOHandlerSocketSMTP:=TidSSLIOHandlerSocketOpenSSL.Create(lcSMTP);
      lcIdSSLIOHandlerSocketSMTP.SSLOptions.SSLVersions:=[sslvTLSv1_2];

      lcUserPass:=TIdUserPassProvider.Create(lcSMTP);
      lcUserPass.Username:='myname@test.onmicrosoft.com';
      lcUserPass.Password:=ptToken;

      lcAuthSASL:=lcSMTP.SASLMechanisms.Add;
      lcAuthSASL.SASL:=TIdSASLXOAuth2.Create(lcSMTP);
      TIdSASLXOAuth2(lcAuthSASL.SASL).UserPassProvider:=lcUserPass;

      lcDebug:=TIdLogDebug.Create(lcSMTP);
      lcDebug.OnReceive:=DoAddLogReceive;
      lcDebug.OnSend:=DoAddLogSend;

      lcSMTP.Intercept:=lcDebug;
      lcSMTP.AuthType:=satSASL;
      lcSMTP.Connect;

      --------------------------------------
      - hier wird eine Exception ausgelöst -
      --------------------------------------
      lcSMTP.Authenticate;

      lcSMTP.Send(lcMail);
    Finally
      lcMail.Free;
    End;
    lcSMTP.Disconnect;
  Finally
    lcSMTP.Free;
  End;
end;
Der Token sieht wie folgt aus (gekürzt)

Code:
{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0eXAiOiJKV1Q...iLCJub}
Über IdLogDebug kommen folgende Ausgaben:

Zitat:
<- 220 FR3P281CA0153.outlook.office365.com Microsoft ESMTP MAIL Service ready at Tue, 5 Sep 2023 10:40:17 +0000

-> EHLO VM054

<- 250-FR3P281CA0153.outlook.office365.com Hello [91.66.249.39]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8

Error Access Token: invalid_request Doesn't support AUTH or the specified SASL handlers!!
Auslöser ist, das bei der Rückmeldung nach dem EHLO der Wert "XOAUTH" fehlt.

Aber was kann der Grund dafür sein ? Ist der Token nicht korrekt ? Nutze ich Indy an der Stelle falsch ?

Vielen Dank für eure Hilfe.
  Mit Zitat antworten Zitat