I am trying to send an email using Jakarta Mail with Exchange Online, but I am encountering the following error:
Error Message:
SASL authentication failed
Steps I have taken:
I have configured the Jakarta Mail library with the correct SMTP server (
smtp.office365
) and port (587).STARTTLS is enabled, and I am using the XOAUTH2 mechanism for authentication.
I have verified that my OAuth2 token is valid and has the required scopes.
MSTP Log (Partial):
Here are some relevant portions of the log when debug mode is enabled:
DEBUG: Jakarta Mail version 2.0.1
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPTransport=jakarta.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=jakarta.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3Store=jakarta.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], com.sun.mail.smtp.SMTPSSLTransport=jakarta.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.imap.IMAPStore=jakarta.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3SSLStore=jakarta.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]}
DEBUG: Providers Listed By Protocol: {imap=jakarta.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtp=jakarta.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], pop3=jakarta.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], imaps=jakarta.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], smtps=jakarta.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3s=jakarta.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning jakarta.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: enable SASL
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.office365", port 587, isSSL false
220 TYCP286CA0151.outlook.office365 Microsoft ESMTP MAIL Service ready at Fri, 6 Dec 2024 07:04:30 +0000 [08DD1544C327E87B]
DEBUG SMTP: connected to host "smtp.office365", port: 587
EHLO 10.0.0.135
250-TYCP286CA0151.outlook.office365 Hello [35.73.88.183]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "157286400"
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 SMTP server ready
EHLO 10.0.0.135
250-TYCP286CA0151.outlook.office365 Hello [35.73.88.183]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH LOGIN XOAUTH2
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "157286400"
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN XOAUTH2"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.office365, [email protected], password=dXNlcj1uaG9fYWRtaW5AejZjd20ub25taWNyb3NvZnQuY29tAWF1dGg9QmVhcmVyIGV5SjBlWEFpT2lKS1YxUWlMQ0p1YjI1alpTSTZJakpvTmw5V1NtRkJkSFpwUW5ReGNFeDViRFJFVFRsWk0wUjJRUzFqTVZwbWRuZHdMVTVwZVVJMGFWa2lMQ0poYkdjaU9pSlNVekkxTmlJc0luZzFkQ0k2SW5wNFpXY3lWMDlPY0ZScmQwNDFSMjFsV1dOMVZHUjBRelpLTUNJc0ltdHBaQ0k2SW5wNFpXY3lWMDlPY0ZScmQwNDFSMjFsV1dOMVZHUjBRelpLTUNKOS5leUpoZFdRaU9pSm9kSFJ3Y3pvdkwyOTFkR3h2YjJzdWIyWm1hV05sTXpZMUxtTnZiU0lzSW1semN5STZJbWgwZEhCek9pOHZjM1J6TG5kcGJtUnZkM011Ym1WMEwyVmhZemN6TWpneUxUaGxNamd0TkRjNFpTMWhZamhoTFdSbVltSXlaalJtWTJNNU5TOGlMQ0pwWVhRaU9qRTNNek0wTmpnek56QXNJbTVpWmlJNk1UY3pNelEyT0RNM01Dd2laWGh3SWpveE56TXpORGN5TWpjd0xDSmhhVzhpT2lKQlUxRkJNaTg0V1VGQlFVRmhkM1pYVGk5TU5GUklhaXR4TnpKcmNsaFViREYyVEZWUWJIWkViRkoxVW5sa2VUUXlXa2hYT0ZGdlBTSXNJbUZ3Y0Y5a2FYTndiR0Y1Ym1GdFpTSTZJazFwWTNKdmMyOW1kQ0JGYm5SeVlTQlRRVTFNSUZSdmIyeHJhWFFnWm05eUlHOXdaWEpoZEdsdVp5SXNJbUZ3Y0dsa0lqb2lZMkppWmpGaU1tVXRZMlpsWWkwMFptSXpMVGcwTTJZdFpHUTRZamd5WldGbU1UQm1JaXdpWVhCd2FXUmhZM0lpT2lJeElpd2lhV1J3SWpvaWFIUjBjSE02THk5emRITXVkMmx1Wkc5M2N5NXVaWFF2WldGak56TXlPREl0T0dVeU9DMDBOemhsTFdGaU9HRXRaR1ppWWpKbU5HWmpZemsxTHlJc0ltbGtkSGx3SWpvaVlYQndJaXdpYjJsa0lqb2lNVGcxT0RKbVpHRXRaak0wWVMwME56TTFMVGcxWVdFdE9URTNaalExTkdVek9ESTBJaXdpY21naU9pSXhMa0ZZUlVGbmFreElObWxwVDJwclpYSnBkQzAzVERCZlRXeFJTVUZCUVVGQlFWQkZVSHBuUVVGQlFVRkJRVUZEU0VGQlFuaEJRUzRpTENKeWIyeGxjeUk2V3lKVFRWUlFMbE5sYm1SQmMwRndjQ0pkTENKemFXUWlPaUl3T0RCa05tTmpaaTB6Wm1FeUxUUmtZVGd0T0RreFl5MDVaVGMxTmpGaVpqSmtOalFpTENKemRXSWlPaUl4T0RVNE1tWmtZUzFtTXpSaExUUTNNelV0T0RWaFlTMDVNVGRtTkRVMFpUTTRNalFpTENKMGFXUWlPaUpsWVdNM016STRNaTA0WlRJNExUUTNPR1V0WVdJNFlTMWtabUppTW1ZMFptTmpPVFVpTENKMWRHa2lPaUp1VWpjNFVGbE1NbFJGZVdWaVlVaFBVMjUyVkVGQklpd2lkbVZ5SWpvaU1TNHdJaXdpZDJsa2N5STZXeUl3T1RrM1lURmtNQzB3WkRGa0xUUmhZMkl0WWpRd09DMWtOV05oTnpNeE1qRmxPVEFpWFN3aWVHMXpYMmxrY21Wc0lqb2lOeUE0SWl3aWVHMXpYM0prSWpvaU1DNDBNa3hzV1VKS2FVeEJVVUVpZlEudU4zVDhhSDdMbHFlT1pkUW5peG5LQ2g5a3B4U3g2ZWhac2JLdXRxSGtmeVdaUndLN18xUEJRaDFpRlN5bTIwRXY5ZnlqQUY0Nll0eE9NZWhIZHZPU0c5aG1LWTBWd0hxVVhVSldjdFN4ZUZDQi1HU3ZOa2tWZmZYOVdSbXQxUmZRWU9TaFk4Z2NXRVFZNU1GY1NGQWo4MzlCdmZPX3JRZzRtbWxENUZ5MUYyX0s3UTJUMzMwVjJZM2pZTlJoR0pTVFQ3WlgteklwY3VzeWhVSEJNOFZDQ3FXYzBmQW9sTkI4TXRTb0xpSFNMWmxFa3NhV0RxUHdvNkQ3blcyV2h6SnAxbklybkRYYTdvTm1JZ3Q3OWNRUXRVU19vc3FqN0paYUduMkdIT0ItbExTY1I1NUV6eUt6aUpJYkhDZzBsbHJuSjlHbnJPMl90dTd1STdqZE1palZRAQE=
DEBUG SMTP: Authenticate with SASL
DEBUG SMTP: SASL Mechanisms:
DEBUG SMTP: LOGIN
DEBUG SMTP: XOAUTH2
DEBUG SMTP:
DEBUG SMTP: SASL client XOAUTH2
DEBUG SMTP: SASL callback length: 2
DEBUG SMTP: SASL callback 0: javax.security.auth.callback.NameCallback@34525851
DEBUG SMTP: SASL callback 1: javax.security.auth.callback.PasswordCallback@76e6a11
AUTH XOAUTH2 dXNlcj1uaG9fYWRtaW5AejZjd20ub25taWNyb3NvZnQuY29tAWF1dGg9QmVhcmVyIGRYTmxjajF1YUc5ZllXUnRhVzVBZWpaamQyMHViMjV0YVdOeWIzTnZablF1WTI5dEFXRjFkR2c5UW1WaGNtVnlJR1Y1U2pCbFdFRnBUMmxLUzFZeFVXbE1RMHAxWWpJMWFscFRTVFpKYWtwdlRtdzVWMU50UmtKa1NGcHdVVzVSZUdORmVEVmlSRkpGVkZSc1drMHdVakpSVXpGcVRWWndiV1J1WkhkTVZUVndaVlZKTUdGV2EybE1RMHBvWWtkamFVOXBTbE5WZWtreFRtbEpjMGx1WnpGa1EwazJTVzV3TkZwWFkzbFdNRGxQWTBaU2NtUXdOREZTTWpGc1YxZE9NVlpIVWpCUmVscExUVU5KYzBsdGRIQmFRMGsyU1c1d05GcFhZM2xXTURsUFkwWlNjbVF3TkRGU01qRnNWMWRPTVZaSFVqQlJlbHBMVFVOS09TNWxlVXBvWkZkUmFVOXBTbTlrU0ZKM1kzcHZka3d5T1RGa1IzaDJZakp6ZFdJeVdtMWhWMDVzVFhwWk1VeHRUblppVTBselNXMXNlbU41U1RaSmJXZ3daRWhDZWs5cE9IWmpNMUo2VEc1a2NHSnRVblprTTAxMVltMVdNRXd5Vm1oWmVtTjZUV3BuZVV4VWFHeE5hbWQwVGtSak5GcFRNV2haYW1ob1RGZFNiVmx0U1hsYWFsSnRXVEpOTlU1VE9HbE1RMHB3V1ZoUmFVOXFSVE5OZWswd1RtcG5lazU2UVhOSmJUVnBXbWxKTmsxVVkzcE5lbEV5VDBSTk0wMURkMmxhV0doM1NXcHZlRTU2VFhwT1JHTjVUV3BqZDB4RFNtaGhWemhwVDJsS1FsVXhSa0pOYVRnMFYxVkdRbEZWUm1oa00xcFlWR2s1VFU1R1VrbGhhWFI0VG5wS2NtTnNhRlZpUkVZeVZFWldVV0pJV2tWaVJrb3hWVzVzYTJWVVVYbFhhMmhZVDBaR2RsQlRTWE5KYlVaM1kwWTVhMkZZVG5kaVIwWTFZbTFHZEZwVFNUWkphekZ3V1ROS2RtTXlPVzFrUTBKR1ltNVNlVmxUUWxSUlZURk5TVVpTZG1JeWVISmhXRkZuV20wNWVVbEhPWGRhV0Vwb1pFZHNkVnA1U1hOSmJVWjNZMGRzYTBscWIybFpNa3BwV21wR2FVMXRWWFJaTWxwc1dXa3dNRnB0U1hwTVZHY3dUVEpaZEZwSFVUUlphbWQ1V2xkR2JVMVVRbTFKYVhkcFdWaENkMkZYVW1oWk0wbHBUMmxKZUVscGQybGhWMUozU1dwdmFXRklVakJqU0UwMlRIazVlbVJJVFhWa01teDFXa2M1TTJONU5YVmFXRkYyV2xkR2FrNTZUWGxQUkVsMFQwZFZlVTlETURCT2VtaHNURmRHYVU5SFJYUmFSMXBwV1dwS2JVNUhXbXBaZW1zeFRIbEpjMGx0Ykd0a1NHeDNTV3B2YVZsWVFuZEphWGRwWWpKc2EwbHFiMmxOVkdjeFQwUktiVnBIUlhSYWFrMHdXVk13TUU1NlRURk1WR2N4V1ZkRmRFOVVSVE5hYWxFeFRrZFZlazlFU1RCSmFYZHBZMjFuYVU5cFNYaE1hMFpaVWxWR2JtRnJlRWxPYld4d1ZESndjbHBZU25Ca1F6QXpWRVJDWmxSWGVGSlRWVVpDVVZWR1FsRldRa1pWU0hCdVVWVkdRbEZWUmtKUlZVWkVVMFZHUWxGdWFFSlJVelJwVEVOS2VXSXllR3hqZVVrMlYzbEtWRlJXVWxGTWJFNXNZbTFTUW1Nd1JuZGpRMHBrVEVOS2VtRlhVV2xQYVVsM1QwUkNhMDV0VG1wYWFUQjZXbTFGZVV4VVVtdFpWR2QwVDBScmVGbDVNRFZhVkdNeFRtcEdhVnBxU210T2FsRnBURU5LZW1SWFNXbFBhVWw0VDBSVk5FMXRXbXRaVXpGdFRYcFNhRXhVVVROTmVsVjBUMFJXYUZsVE1EVk5WR1J0VGtSVk1GcFVUVFJOYWxGcFRFTktNR0ZYVVdsUGFVcHNXVmROTTAxNlNUUk5hVEEwV2xSSk5FeFVVVE5QUjFWMFdWZEpORmxUTVd0YWJVcHBUVzFaTUZwdFRtcFBWRlZwVEVOS01XUkhhMmxQYVVwMVZXcGpORlZHYkUxTmJGSkdaVmRXYVZsVmFGQlZNalV5VmtWR1FrbHBkMmxrYlZaNVNXcHZhVTFUTkhkSmFYZHBaREpzYTJONVNUWlhlVWwzVDFSck0xbFVSbXROUXpCM1drUkdhMHhVVW1oWk1rbDBXV3BSZDA5RE1XdE9WMDVvVG5wTmVFMXFSbXhQVkVGcFdGTjNhV1ZITVhwWU1teHJZMjFXYzBscWIybE9lVUUwU1dsM2FXVkhNWHBZTTBwclNXcHZhVTFETkRCTmEzaHpWMVZLUzJGVmVFSlZWVVZwWmxFdWRVNHpWRGhoU0RkTWJIRmxUMXBrVVc1cGVHNUxRMmc1YTNCNFUzZzJaV2hhYzJKTGRYUnhTR3RtZVZkYVVuZExOMTh4VUVKUmFERnBSbE41YlRJd1JYWTVabmxxUVVZME5sbDBlRTlOWldoSVpIWlBVMGM1YUcxTFdUQldkMGh4VlZoVlNsZGpkRk40WlVaRFFpMUhVM1pPYTJ0V1ptWllPVmRTYlhReFVtWlJXVTlUYUZrNFoyTlhSVkZaTlUxR1kxTkdRV280TXpsQ2RtWlBYM0pSWnpSdGJXeEVOVVo1TVVZeVgwczNVVEpVTXpNd1ZqSlpNMnBaVGxKb1IwcFRWRlEzV2xndGVrbHdZM1Z6ZVdoVlNFSk5PRlpEUTNGWFl6Qm1RVzlzVGtJNFRYUlRiMHhwU0ZOTVdteEZhM05oVjBSeFVIZHZOa1EzYmxjeVYyaDZTbkF4YmtseWJrUllZVGR2VG0xSlozUTNPV05SVVhSVlUxOXZjM0ZxTjBwYVlVZHVNa2RJVDBJdGJFeFRZMUkxTlVWNmVVdDZhVXBKWWtoRFp6QnNiSEp1U2psSGJuSlBNbDkwZFRkMVNUZHFaRTFwYWxaUkFRRT0BAQ==
535 5.7.3 Authentication unsuccessful [TYCP286CA0151.JPNP286.PROD.OUTLOOK.COM 2024-12-06T07:04:37.640Z 08DD1544C327E87B]
DEBUG SMTP: SASL authentication failed
My source code:
public void send() throws ZSendFailedException, AddressException, MessagingException {
// Get accessToken
String accessToken = config.getAccessToken();
String authToken = buildOAuth2Token("[email protected]", accessToken);
// Create a mail session
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.office365");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.connectiontimeout", "10000");
props.put("mail.smtp.timeout", "10000");
props.put("mail.smtp.sendpartial", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.trust", "*");
props.put("mail.smtp.sasl.enable", "true");
props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
props.put("mail.smtp.sasl.mechanisms.oauth2.oauthToken", authToken);
props.put("mail.smtp.auth.login.disable", "true");
props.put("mail.smtp.auth.plain.disable", "true");
props.put("mail.smtp.auth.xoauth2.disable", "false");
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
props.put("mail.debug.auth", "true");
props.put("mail.debug.auth.password", "true");
Session session = Session.getInstance(props, null);
// Construct the message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]"));
msg.setSubject("Subject mail");
msg.setText("1234");
msg.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
msg.saveChanges();
Transport transport = session.getTransport("smtp");
try {
transport.connect("[email protected]", authToken);
transport.sendMessage(msg, msg.getAllRecipients());
} finally {
transport.close();
}
}
public static String buildOAuth2Token(String email, String accessToken) {
String authString = "user=" + email + "\u0001auth=Bearer " + accessToken + "\u0001\u0001";
return Base64.getEncoder().encodeToString(authString.getBytes());
}
Question:
What could cause this SASL authentication failure?
Are there any additional steps I need to take to ensure XOAUTH2 authentication works with Exchange Online?
Additional Information:
Jakarta Mail version: 2.0.1
OAuth2 token was generated using Azure Identity and has the
/.default
scope.The SMTP server responds correctly to the EHLO and STARTTLS commands.