You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:01:11