JavaMail mit OAuth2 an O365

wersi77

Aktives Mitglied
Hallo zusammen,

ich versuche nun schon seit längerem ein O365 Postfach über OAuth2 unter Verwendung der JavaMail 1.6.2 API zu verbinden.
Über die PLAIN (Username und Password) Methode klappt es ohne weitere Probleme. Zu diesem Zweck verwende ich folgenden Code:

Java:
package mail;

import java.net.http.HttpClient;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Store;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;


public class MailOAuth2 {

    public static void main(String[] args) {
        String mailServerAdress = "outlook.office365.com";
        String mailboxUserName = "###MyUserName###";
        String mailboxPassword = "###MyPassword###";
        String protocol = "imaps";

        String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = new Properties();

        props.put("mail.imap.ssl.enable", "true");
        props.put("mail.imap.port", "993");

        props.put("mail.imap.auth.mechanisms", "XOAUTH2");
        props.put("mail.imap.sasl.mechanisms", "XOAUTH2");

        props.put("mail.imap.auth.login.disable", "true");
        props.put("mail.imap.auth.plain.disable", "true");
       
        props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.imap.socketFactory.fallback", "false");
        props.setProperty("mail.imap.socketFactory.port", "993");
        props.setProperty("mail.imap.starttls.enable", "true");

        props.put("mail.debug", "true");
        props.put("mail.debug.auth", "true");
       
       
        mailboxPassword=getAuthToken();
        System.out.println("info: AccessToken: " + mailboxPassword);

        try {
            Session session = Session.getInstance(props);
            session.setDebug(true);
            System.out.println("info: properties: " + session.getProperties().toString());
            Store store = session.getStore(protocol);
            store.connect(mailServerAdress, mailboxUserName, mailboxPassword);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   
    public static String getAuthToken() {
        try {
            CloseableHttpClient client = HttpClients.createDefault();
            HttpPost loginPost =  new HttpPost("https://login.microsoftonline.com/###MyTenantID###/oauth2/v2.0/token");
            String clientId = "###MyClientId###";
            String scopes = "https://outlook.office365.com/.default";
         
            String client_secret = "###MyClientSecret###";
         
            String encodedBody = "client_id=" + clientId
                   + "&scope=" + scopes
                   + "&client_secret=" + client_secret
                   + "&grant_type=client_credentials";
                     
            loginPost.setEntity(new StringEntity(encodedBody, ContentType.APPLICATION_FORM_URLENCODED));

            loginPost.addHeader(new BasicHeader("cache-control", "no-cache"));
            CloseableHttpResponse loginResponse = client.execute(loginPost);
            byte[] response = loginResponse.getEntity().getContent().readAllBytes();
            ObjectMapper objectMapper = new ObjectMapper();
            JavaType type = objectMapper.constructType(objectMapper.getTypeFactory()
                    .constructParametricType(Map.class, String.class, String.class));
            Map<String, String> parsed = new ObjectMapper().readValue(response, type);
            return parsed.get("access_token");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

Leider erhalte ich nach Ausführung stets den folgenden Output:

Code:
info: AccessToken: ###SehrLangerAccessToken###
DEBUG: JavaMail version 1.6.2
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: setDebug: JavaMail version 1.6.2
info: properties: {mail.imap.starttls.enable=true, mail.imap.socketFactory.port=993, mail.debug=true, mail.debug.auth=true, mail.imap.port=993, mail.imap.auth.plain.disable=true, mail.imap.auth.mechanisms=XOAUTH2, mail.imap.auth.login.disable=true, mail.imap.ssl.enable=true, mail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory, mail.imap.socketFactory.fallback=false, mail.imap.sasl.mechanisms=XOAUTH2}
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: closeFoldersOnStoreFailure
DEBUG IMAPS: trying to connect to host "outlook.office365.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready. [###auskommentiert###]
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAPS: AUTH: PLAIN
DEBUG IMAPS: AUTH: XOAUTH2
DEBUG IMAPS: protocolConnect login, host=outlook.office365.com, user=###, password=<non-null>
A1 AUTHENTICATE PLAIN
+
###auskommentiert###
A1 NO AUTHENTICATE failed.
javax.mail.AuthenticationFailedException: AUTHENTICATE failed.
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:732)
    at javax.mail.Service.connect(Service.java:366)
    at javax.mail.Service.connect(Service.java:246)
    at mail.MailOAuth2.main(MailOAuth2.java:61)

Ich habe bereits sehr viel gesucht, aber noch keine Lösung zu diesem Problem gefunden.
Gibt es hier vielleicht jemanden, der weiterhelfen kann?
Viele Grüsse
 

KonradN

Super-Moderator
Mitarbeiter
Meine Empfehlung bei diesen Anbietern (Egal ob Office 365 oder Google Mail oder ähnlichen Angeboten): Nutzt die vorgesehenen APIs. Also bei Office 365 wäre es vermutlich diese https://learn.microsoft.com/de-de/previous-versions/office/office-365-api/

Die Office365 API kenne ich dabei noch nicht - ich habe in der Vergangenheit nur mit Google APIs gearbeitet. Die Problematik hört sich aber sehr stark nach einer ähnlichen Thematik an, wie ich halt auf Google Seite auch schon kennen gelernt habe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
V JavaMail (die 2.) Allgemeine Java-Themen 5
V Java8 und JavaMail Allgemeine Java-Themen 27
U Javamail Allgemeine Java-Themen 12
OnDemand JavaMail ohne Anhang senden Allgemeine Java-Themen 4
S JavaMail - MailSubject,MailFrom,MailDate in String Array speichern NullPointerException Allgemeine Java-Themen 2
L ClassCastException (JavaMail API) Allgemeine Java-Themen 3
M JavaMail Spam-Ordner Allgemeine Java-Themen 2
J javamail --- UnsupportedDataTypeException Allgemeine Java-Themen 6
N [GWT] JavaMail kommt nicht an Allgemeine Java-Themen 9
T JavaMail: "No provider for imaps" Allgemeine Java-Themen 2
B JavaMail Allgemeine Java-Themen 10
GUI-Programmer JavaMail - Anhang hochladen vor senden der Nachricht Allgemeine Java-Themen 4
F JavaMail - Lokale eMail-Datei einlesen und parsen? Allgemeine Java-Themen 9
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
Mike90 JavaMail: Betreff bei POP3 nicht abrufbar Allgemeine Java-Themen 2
hdi JavaMail Lib einbinden? Allgemeine Java-Themen 5
B JavaMail + Bouncy Castle: isEncrypted Allgemeine Java-Themen 3
N Again - JavaMail Allgemeine Java-Themen 4
F Eclipse JAVAMAIL läuft nur unter Eclipste Applet Viewer Allgemeine Java-Themen 4
M Javamail -> andere Möglichkeit für Attachment Allgemeine Java-Themen 5
J JavaMail nur mit JEE? Allgemeine Java-Themen 4
C javamail signatur und verschlüsselung Allgemeine Java-Themen 2
R Javamail Allgemeine Java-Themen 5
V Source zu Javamail? Allgemeine Java-Themen 2
F Umlaute: E-Mail per JavaMail und Textfile Allgemeine Java-Themen 5
G Javamail Nachricht senden: Betreff und Header fehlen Allgemeine Java-Themen 4
G Frage zu JAVAMail Allgemeine Java-Themen 10
T JavaMail versendet Schrott Allgemeine Java-Themen 9
C Probleme mit JavaMail und JAR-File Allgemeine Java-Themen 10
S JavaMail --> HTML-Mail verschicken? Allgemeine Java-Themen 7
J Externe File Emails für JavaMail Allgemeine Java-Themen 4
D JavaMail SMTP Fehlermeldung Allgemeine Java-Themen 2
D JavaMail Fehlermeldung Allgemeine Java-Themen 4
Luma JavaMail, Was versteht sich unter der CDDL Lizenz Allgemeine Java-Themen 6
G JavaMail API Allgemeine Java-Themen 4
S Mit javamail kompiliertes Programm läuft nicht ohne jar's Allgemeine Java-Themen 6
G JavaMail - Message vom Server, wie abfragen? Allgemeine Java-Themen 2
R JavaMail + Lotus Notes Allgemeine Java-Themen 8
S JavaMail: Problem mit SecurityException Allgemeine Java-Themen 2
P Probleme mit javaMail Allgemeine Java-Themen 2
M JavaMail? Allgemeine Java-Themen 3
D JavaMail - Authenticator Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben