首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaMail 發送郵件實戰:TLS 加密與協議版本衝突解決

     編輯:Java 相關知識

遇到的兩個坑

1. Office365 必須啟用 STARTTLS

Exception: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM

解決:設置 mail.smtp.starttls.enable=true。

2. 運行時 NoSuchProviderException: Invalid protocol: null

原因:應用打包時攜帶的 javax.mail 版本與容器(Jetty)自帶版本衝突,容器優先加載舊版 Jar,導致默認協議解析失效。

解決:顯式指定協議 session.getTransport("smtp"),或升級容器 Jar / 打包排除依賴。

最終可用工具類

package com.zhyea.zytools;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class MailSender {
    private static final String HOST = "smtp.exmail.qq.com";
    private static final int PORT = 587;
    private static final String USER = "robin@zhyea.com";
    private static final String PASS = "robinzhyea";

    private static final Properties PROPS = new Properties();
    static {
        PROPS.put("mail.smtp.host", HOST);
        PROPS.put("mail.smtp.port", PORT);
        PROPS.put("mail.smtp.auth", "true");
        PROPS.put("mail.smtp.user", USER);
        PROPS.put("mail.smtp.password", PASS);
        PROPS.put("mail.smtp.starttls.enable", "true"); // 關鍵
    }

    public static void send(String to, String subject, String htmlContent) {
        try {
            Session session = Session.getInstance(PROPS);
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(USER));
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            msg.setSubject(subject);
            msg.setContent(htmlContent, "text/html;charset=gbk");
            msg.setSentDate(new Date());
            msg.saveChanges();

            Transport transport = session.getTransport("smtp"); // 顯式指定協議
            transport.connect(USER, PASS);
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

關鍵配置對照表

屬性值說明
mail.smtp.hostsmtp.exmail.qq.comSMTP 服務器
mail.smtp.port587STARTTLS 端口
mail.smtp.starttls.enabletrue啟用 TLS 升級
mail.smtp.authtrue需要認證

總結

  1. Office365/騰訊企業郵等現代郵件服務均要求 STARTTLS。
  2. Jar 衝突顯式指定 getTransport("smtp") 可繞過默認協議解析 Bug。
  3. 生產環境建議使用 Spring Boot JavaMailSender 統一管理配置與連接池。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved