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:
Leider erhalte ich nach Ausführung stets den folgenden Output:
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
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