javax.mail.AuthenticationFailedException认证失败问题求助
将旧项目中可用的javax.mail邮件发送代码复制到新项目后,出现javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful错误。尝试使用1.5.0和1.6.2版本的javax.mail均未解决问题,以下是相关代码及调试日志:
final Properties props = new Properties(); props.put("mail.smtp.host", "mail.mycompany.net"); props.put("mail.smtp.timeout", "10000"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.ssl.protocols", "TLSv1.2"); props.put("mail.debug", "true"); final class MailAuthenticator extends javax.mail.Authenticator { @Override public javax.mail.PasswordAuthentication getPasswordAuthentication() { return new javax.mail.PasswordAuthentication(user, password); } } final Session session = Session.getInstance(props, new MailAuthenticator()); final MimeMessage msg = new MimeMessage(session); msg.addHeader("Content-type", "text/HTML; charset=UTF-8"); msg.addHeader("format", "flowed"); msg.addHeader("Content-Transfer-Encoding", "8bit"); msg.setFrom(new InternetAddress(replyMail, replyId)); msg.setReplyTo(InternetAddress.parse(replyMail, false)); msg.setSubject(subject, "UTF-8"); msg.setContent(body, "text/html; charset=utf-8"); msg.setSentDate(java.sql.Date.valueOf(localDate)); toEmails = toEmails.replace(";", ","); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmails, false)); Transport.send(msg);
报错信息:
javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful
调试日志:
DEBUG: Jakarta Mail version 1.6.4.payara-p1 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=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]} DEBUG: Providers Listed By Protocol: {imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]} DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle DEBUG SMTP: need username and password for authentication DEBUG SMTP: protocolConnect returning false, host=mail.mycompany.net, user=ann, password=<null> DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "mail.mycompany.net", port 587, isSSL false 220 SMUCMP04A.europe.mycompany.corp Microsoft ESMTP MAIL Service ready at Wed, 15 Feb 2023 15:23:51 +0100 DEBUG SMTP: connected to host "mail.mycompany.net", port: 587 EHLO SWE-mycompany-WS16-09.localdomain 250-SMUCMP04A.europe.mycompany.corp Hello [10.30.85.214] 250-SIZE 20971520 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-STARTTLS 250-AUTH GSSAPI NTLM 250-8BITMIME 250-BINARYMIME 250-CHUNKING 250 SMTPUTF8 DEBUG SMTP: Found extension "SIZE", arg "20971520" 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 "AUTH", arg "GSSAPI NTLM" 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 SWE-mycompany-WS16-09.localdomain 250-SMUCMP04A.europe.mycompany.corp Hello [10.30.85.214] 250-SIZE 20971520 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-AUTH GSSAPI NTLM LOGIN 250-8BITMIME 250-BINARYMIME 250-CHUNKING 250 SMTPUTF8 DEBUG SMTP: Found extension "SIZE", arg "20971520" DEBUG SMTP: Found extension "PIPELINING", arg "" DEBUG SMTP: Found extension "DSN", arg "" DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" DEBUG SMTP: Found extension "AUTH", arg "GSSAPI NTLM LOGIN" 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=mail.mycompany.net, user=myuser@europe.mycompany.corp, password=<non-null> DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEBUG SMTP: Using mechanism LOGIN DEBUG SMTP: AUTH LOGIN command trace suppressed DEBUG SMTP: AUTH LOGIN failed
从调试日志可知,你的SMTP服务器是Microsoft ESMTP,支持GSSAPI、NTLM、LOGIN三种认证机制,但JavaMail优先尝试LOGIN认证失败,可从以下方向解决:
强制使用NTLM认证
服务器明确支持NTLM,可在Properties中添加配置指定优先使用该机制:props.put("mail.smtp.auth.mechanisms", "NTLM"); // 域环境下需指定域名 props.put("mail.smtp.ntlm.domain", "europe.mycompany.corp");同时注意用户名格式,部分Microsoft邮件服务器要求使用
域名\用户名(如europe\myuser)而非完整邮箱地址,可尝试调整。排查依赖冲突
调试日志显示实际加载的是Jakarta Mail version 1.6.4.payara-p1,与你手动引入的1.5.0/1.6.2版本冲突,说明新项目中存在Payara相关依赖覆盖了javax.mail。需清理项目依赖,排除多余的Jakarta Mail包,确保使用统一的javax.mail版本。验证账号密码有效性
确认新项目中传入的user和password是否正确,是否存在大小写、特殊字符转义问题;部分企业邮箱可能开启二次验证或限制了新环境的登录权限,可尝试用该账号登录网页邮箱确认可用性。尝试GSSAPI(Kerberos)认证
若处于企业域环境,GSSAPI(Kerberos)可能是更适配的认证方式,添加以下配置:props.put("mail.smtp.auth.mechanisms", "GSSAPI"); props.put("mail.smtp.gssapi.auth", "true"); // 需指定Kerberos配置文件时添加 // System.setProperty("java.security.krb5.conf", "/path/to/krb5.conf");
内容的提问来源于stack exchange,提问作者Ann-Christin Lindras

