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

Java Mail:如何在587端口强制启用TLSv1.2/TLSv1.3的SMTPS协议

需求:在587端口通过TLSv1.2/TLSv1.3发送SMTPS邮件

我使用Axigen作为邮件服务器,相关配置如下:

  • 监听SSL端口:465 / 587(配图)
  • SSL协议配置:TLS 1.2 / TLS 1.3(配图)

587端口测试示例

以下是Java调试日志:

DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=192.168.59.99, user="user", password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "192.168.59.99", port 587, isSSL true
220 axigen Axigen ESMTP ready
DEBUG SMTP: connected to host "192.168.59.99", port: 587
EHLO "DOMAIN"
250-axigen Axigen ESMTP hello
...
DEBUG SMTP: STARTTLS requested but already using SSL
DEBUG SMTP: protocolConnect login, host=192.168.59.99, user=jacques.durand@ca.lan, 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 succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<jacques.durand@ca.lan>
250 Sender accepted
RCPT TO:<jacques.durand@ca.lan>
250 Recipient accepted
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   jacques.durand@ca.lan
DATA
354 Ready to receive data; remember <CRLF>.<CRLF>
Date: Tue, 7 Feb 2023 10:03:25 +0100 (CET)
From: jacques.durand@ca.lan
To: jacques.durand@ca.lan
Message-ID: <947679291.0.1675760605998@192.168.59.99>
Subject: TestMail
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

TestMail
.
250 Mail queued for delivery
DEBUG SMTP: message successfully delivered to mail server
QUIT
221-axigen Axigen ESMTP is closing connection
221 Good bye

Process finished with exit code 0

通过Wireshark抓包查看邮件服务器交互,发现587端口使用的是TCP/SMTP协议,并非SMTPS。

465端口测试示例

Java调试日志:

DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=192.168.59.99, user="user", password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "192.168.59.99", port 465, isSSL true
220 axigen Axigen ESMTP ready
DEBUG SMTP: connected to host "192.168.59.99", port: 465
EHLO "DOMAIN"
250-axigen Axigen ESMTP hello
...
DEBUG SMTP: STARTTLS requested but already using SSL
DEBUG SMTP: protocolConnect login, host=192.168.59.99, user=jacques.durand@ca.lan, 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 succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<jacques.durand@ca.lan>
250 Sender accepted
RCPT TO:<jacques.durand@ca.lan>
250 Recipient accepted
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   jacques.durand@ca.lan
DATA
354 Ready to receive data; remember <CRLF>.<CRLF>
Date: Tue, 7 Feb 2023 10:58:52 +0100 (CET)
From: jacques.durand@ca.lan
To: jacques.durand@ca.lan
Message-ID: <947679291.0.1675763932670@192.168.59.99>
Subject: TestMail
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

TestMail
.
250 Mail queued for delivery
DEBUG SMTP: message successfully delivered to mail server
QUIT
221-axigen Axigen ESMTP is closing connection
221 Good bye

Process finished with exit code 0

通过Wireshark抓包查看465端口,确认使用的协议是TLSv1.3。

发送邮件的Java代码(已尝试所有SMTP/SMTPS属性组合但未成功)

import com.sun.mail.smtp.SMTPTransport;
import jakarta.mail.*;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeMultipart;

public class SendMail {

    public static void main(String[] args) throws MessagingException {

        Session session = null;

        Properties properties = System.getProperties();

        properties.put("mail.debug", "true");

        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.host", "192.168.59.99");
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.port", "587");

        // Enable STARTTLS
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.starttls.required", "true");

        // Accept only TLS 1.1 and 1.2
        properties.setProperty("mail.smtp.ssl.enable", "true");
        properties.setProperty("mail.smtp.ssl.trust", "192.168.59.99");
        properties.setProperty("mail.smtp.ssl.protocols", "TLSv1.2 TLSv1.3");


       // properties.put("mail.transport.protocol.rfc822", "smtp");

        session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("jacques.durand@ca.lan", "us3r");
            }
        });

        if (session == null) {
            throw new RuntimeException("Error creating mail session.");
        }

        session.setDebug(true);

        // message
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("jacques.durand@ca.lan"));
        message.setRecipients(Message.RecipientType.TO,   InternetAddress.parse("jacques.durand@ca.lan"));
        message.setSubject("TestMail");
        message.setText("TestMail");

        Transport.send(message);

    }

}

未成功的Java属性配置

Properties properties = System.getProperties();
    properties.setProperty("mail.smtp.host", "192.168.59.99");
    properties.setProperty("mail.smtp.port", "587");
    properties.put("mail.smtp.auth", true);
    properties.put("mail.smtp.socketFactory.port", "587");
    properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    properties.put("mail.smtp.socketFactory.fallback", "false");
    properties.put("mail.smtp.ssl.enable", "true");
    properties.put("mail.smtp.ssl.protocols", "TLSv1.2");
    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.starttls.required", "true");
    ////
    properties.put("mail.smtps.host", "192.168.59.99");
    properties.put("mail.smtps.port", "587");
    properties.put("mail.smtps.socketFactory.port", "587");
    properties.put("mail.smtps.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    properties.put("mail.smtps.socketFactory.fallback", "false");
    properties.put("mail.transport.protocol", "smtps");
    properties.put("mail.smtps.ssl.enable","true");
    properties.put("mail.smtps.starttls.enable","false");
    properties.put("mail.smtps.auth", "true");
    properties.put("mail.smtps.ssl.protocols", "TLSv1.2");
    ///
    properties.put("mail.transport.protocol.rfc822", "smtp");

尝试过的库版本

  • javax.mail : 1.5.0-b01
  • javax.mail : 1.6.2
  • jakarta.mail : 2.0.1

核心需求:在587端口强制启用TLSv1.2或TLSv1.3协议。

内容的提问来源于stack exchange,提问作者Lisa Trz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:30:55