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
相关产品推荐
相关产品推荐

