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

JavaMail 發送郵件完整實戰:基於 126 郵箱的 SMTP 整合範例與反垃圾郵件避坑指南

     編輯:Java 相關知識

JavaMail 核心流程與關鍵配置

使用 JavaMail API 發送郵件的標準流程包含:建立 Session、構建 MimeMessage、設定發件人/收件人/主旨/內容、透過 Transport 連接 SMTP 伺服器發送。以下以 126 郵箱為例,提供可直接運行的完整工具類。

完整可用程式碼範例

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

public class EmailSender {
    // === 請替換為您的真實帳號資訊 ===
    private static final String USERNAME = "your_username";
    private static final String PASSWORD = "your_auth_code"; // 客戶端授權碼,非登入密碼
    private static final String SMTP_HOST = "smtp.126.com";
    private static final String FROM_EMAIL = USERNAME + "@126.com";
    private static final String FROM_NAME = "我的應用系統";

    public static void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException {
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);
        props.put("mail.smtp.auth", "true");
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.port", "25"); // 或 465 (SSL), 587 (TLS)

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(FROM_EMAIL, FROM_NAME, "UTF-8"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject(subject, "UTF-8");
        message.setSentDate(new Date());

        // 建立 HTML 郵件內容
        MimeBodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent(htmlContent, "text/html;charset=UTF-8");

        MimeMultipart multipart = new MimeMultipart("mixed");
        multipart.addBodyPart(htmlPart);
        message.setContent(multipart);
        message.saveChanges();

        // 發送
        try (Transport transport = session.getTransport("smtp")) {
            transport.connect(SMTP_HOST, 25, USERNAME, PASSWORD);
            transport.sendMessage(message, message.getAllRecipients());
        }
        System.out.println("郵件發送成功: " + to);
    }

    public static void main(String[] args) {
        String html = "

歡迎註冊

請點擊 啟用帳號

"; try { sendHtmlMail("target@qq.com", "帳號啟用通知", html); } catch (Exception e) { e.printStackTrace(); } } }

關鍵避坑指南:為什麼郵件發不出去?

  1. 使用授權碼而非密碼: 126/163/QQ 等主流郵箱 SMTP 驗證需開啟「客戶端授權碼」,登入密碼無效。
  2. 內容觸發反垃圾規則: 避免大量連結、敏感詞、純圖片、誇大宣傳語。測試階段建議使用簡單純文字內容。
  3. 發送頻率過高: 短時間大量發送同樣內容極易被攔截。建議加入隨機延遲、內容變數化。
  4. 錯誤代碼 554 DT:SPM: 明確標識被判定為垃圾郵件。需登入郵箱網頁版查看具體原因並申訴,或調整內容/頻率/發信 IP 信譽。
  5. 編碼問題: 主旨、發件人名稱、內容均需統一指定 UTF-8,使用 MimeUtility.encodeText() 處理中文。

進階擴充:附件、內嵌圖片、SSL/TLS

  • 附件: 新增 MimeBodyPart,使用 FileDataSource + DataHandler,設定 setFileName(MimeUtility.encodeText(name)) 避免中文亂碼。
  • 內嵌圖片: 使用 multipart/related,htmlPart 引用 cid:imageId,另一個 MimeBodyPart 設定 setHeader("Content-ID", "<imageId>")。
  • SSL (465) / TLS (587): 屬性加入 mail.smtp.ssl.enable=true 或 mail.smtp.starttls.enable=true,端口對應修改。

總結

JavaMail 發送郵件核心不複雜,難點在於郵箱服務商的反垃圾策略與網路環境變數。掌握授權碼配置、內容合規、編碼處理、異常排查,即可構建穩健的郵件通知服務。

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