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

JavaMail 實戰:從 Maven 依賴到發送郵件完整代碼範例

     編輯:Java 相關知識

JavaMail 是 Java 平台發送電子郵件的標準 API。本文記錄從 Maven 引入依賴、SMTP 服務配置、核心代碼封裝到常見坑點(SSL/TLS、授權碼、附件發送)的完整實戰流程,助你快速集成郵件功能。

環境準備:Maven 依賴

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

或手動下載 javax.mail.jar 放入 classpath。推薦使用 MvnRepository 查詢最新版本。

核心發送邏輯封裝

package com.example.util;

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

public class MailUtil {

    /** 發送純文本郵件
     * @param subject 主題
     * @param content 正文
     * @param toAddress 收件人地址
     * @throws MessagingException 郵件發送異常
     */
    public static void sendTextMail(String subject, String content, String toAddress)
            throws MessagingException {

        // 1. SMTP 會話屬性
        Properties props = new Properties();
        props.setProperty("mail.smtp.auth", "true");           // 需認證
        props.setProperty("mail.host", "smtp.163.com");        // 發件郵箱 SMTP 地址
        props.setProperty("mail.transport.protocol", "smtp");  // 協議

        // 2. 建立會話
        Session session = Session.getInstance(props);

        // 3. 構建郵件對象
        MimeMessage message = new MimeMessage(session);
        message.setSubject(subject);
        message.setText(content);
        message.setFrom(new InternetAddress("your_email@163.com")); // 發件人

        // 4. 連接發送
        Transport transport = session.getTransport();
        transport.connect("your_email@163.com", "your_auth_code"); // 授權碼非登錄密碼
        transport.sendMessage(message, new Address[]{new InternetAddress(toAddress)});
        transport.close();
    }
}

關鍵配置說明

屬性說明常見值
mail.smtp.auth是否需身份驗證true
mail.hostSMTP 服務器地址smtp.163.com / smtp.qq.com / smtp.gmail.com
mail.transport.protocol傳輸協議smtp
mail.smtp.portSMTP 端口(可選)25 / 465(SSL) / 587(TLS)
mail.smtp.ssl.enable啟用 SSLtrue (465 端口)
mail.smtp.starttls.enable啟用 STARTTLStrue (587 端口)

常見郵箱 SMTP 設定對照

  • 163/126:smtp.163.com,端口 25/465/587,需開啟「SMTP 服務」並獲取授權碼。
  • QQ 郵箱:smtp.qq.com,端口 465(SSL)/587(TLS),需開啟「POP3/SMTP 服務」獲取授權碼。
  • Gmail:smtp.gmail.com,端口 587(TLS),需開啟「低安全性應用存取」或使用應用專用密碼。

進階:發送 HTML 郵件與附件

public static void sendHtmlWithAttachment(String subject, String htmlContent,
                                          String toAddress, File attachment)
        throws MessagingException, IOException {

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.host", "smtp.163.com");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.ssl.enable", "true");

    Session session = Session.getInstance(props);
    MimeMessage message = new MimeMessage(session);
    message.setSubject(subject);
    message.setFrom(new InternetAddress("sender@163.com"));

    // 建立 Multipart 容器
    Multipart multipart = new MimeMultipart();

    // 1. HTML 正文部分
    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(htmlContent, "text/html;charset=UTF-8");
    multipart.addBodyPart(htmlPart);

    // 2. 附件部分
    if (attachment != null && attachment.exists()) {
        MimeBodyPart attachPart = new MimeBodyPart();
        DataSource source = new FileDataSource(attachment);
        attachPart.setDataHandler(new DataHandler(source));
        attachPart.setFileName(MimeUtility.encodeText(attachment.getName()));
        multipart.addBodyPart(attachPart);
    }

    message.setContent(multipart);

    Transport transport = session.getTransport();
    transport.connect("sender@163.com", "auth_code");
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
}

常見錯誤與排查

異常原因解決
AuthenticationFailedException密碼/授權碼錯誤確認使用授權碼而非登錄密碼;檢查郵箱是否開啟 SMTP/IMAP 服務
Could not connect to SMTP host網絡/防火牆/端口telnet smtp.xxx.com 25 測試連通性;嘗試 465/587 端口並啟用 SSL/TLS
MessagingException: 554 DT:SPM內容被判定為垃圾郵件避免敏感詞;添加 DKIM/SPF 記錄;使用正規域名郵箱
javax.net.ssl.SSLHandshakeExceptionSSL 證書不信任JDK 信任庫導入郵箱 CA 證書;或臨時信任所有憑證(僅測試)

最佳實踐建議

  • ✅ 郵件發送異步化:放入消息佇列(RabbitMQ/Kafka)或線程池,避免阻塞主業務。
  • ✅ 配置外部化:SMTP 主機、端口、帳號、授權碼放入配置中心或環境變數。
  • ✅ 重試機制:網絡抖動導致失敗時指數退避重試 3 次。
  • ✅ 日誌記錄:記錄 Message-ID、收件人、發送耗時、成功/失敗狀態,便於追蹤。
  • ✅ 模板引擎:複雜 HTML 郵件使用 Thymeleaf/FreeMarker 渲染,分離業務與視圖。

總結

JavaMail API 設計經典,掌握 Session → Message → Transport 三步驟即可發送郵件。生產環境務必關注異步化、配置管理、重試與監控,確保郵件送達率。下一步可探索 Spring Boot JavaMailSender 封裝,進一步簡化代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved