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

JavaMail 完整郵件發送實作:支援 HTML 內容、附件與 SMTP 認證

     編輯:Java 相關知識

核心架構

JavaMail API (javax.mail) + JavaBeans Activation Framework (JAF, javax.activation)。JAF 處理 MIME 編碼,郵件附件必須依賴它。

環境準備

  1. JDK 1.4+
  2. mail.jar (JavaMail 1.3.2+)
  3. activation.jar (JAF 1.0.2+)
  4. 將兩者加入 CLASSPATH

核心類別:SendMail (工具類封裝)


public class SendMail {
    private MimeMessage mimeMsg;
    private Session session;
    private Properties props;
    private boolean needAuth = false;
    private String username, password;
    private Multipart mp; // 郵件內容容器:正文 + 附件

    public SendMail(String smtpHost) {
        setSmtpHost(smtpHost);
        createMimeMessage();
    }

    // 設定 SMTP 主機
    public void setSmtpHost(String host) {
        if (props == null) props = System.getProperties();
        props.put("mail.smtp.host", host);
    }

    // 建立 Session 與 MimeMessage
    public boolean createMimeMessage() {
        try {
            session = Session.getDefaultInstance(props, null);
            mimeMsg = new MimeMessage(session);
            mp = new MimeMultipart();
            return true;
        } catch (Exception e) { return false; }
    }

    // 啟用 SMTP 認證
    public void setNeedAuth(boolean need) {
        if (props == null) props = System.getProperties();
        props.put("mail.smtp.auth", need ? "true" : "false");
        this.needAuth = need;
    }

    public void setNamePass(String user, String pwd) {
        this.username = user; this.password = pwd;
    }

    // 設定主旨
    public boolean setSubject(String subject) {
        try { mimeMsg.setSubject(subject); return true; }
        catch (Exception e) { return false; }
    }

    // 設定 HTML 正文
    public boolean setBody(String htmlBody) {
        try {
            BodyPart bp = new MimeBodyPart();
            bp.setContent(htmlBody, "text/html;charset=GB2312");
            mp.addBodyPart(bp);
            return true;
        } catch (Exception e) { return false; }
    }

    // 新增附件
    public boolean addFileAffix(String filename) {
        try {
            BodyPart bp = new MimeBodyPart();
            FileDataSource fds = new FileDataSource(filename);
            bp.setDataHandler(new DataHandler(fds));
            bp.setFileName(fds.getName()); // 保留原檔名
            mp.addBodyPart(bp);
            return true;
        } catch (Exception e) { return false; }
    }

    // 設定寄件者
    public boolean setFrom(String from) {
        try { mimeMsg.setFrom(new InternetAddress(from)); return true; }
        catch (Exception e) { return false; }
    }

    // 設定收件者 (TO)
    public boolean setTo(String to) {
        if (to == null) return false;
        try {
            mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            return true;
        } catch (Exception e) { return false; }
    }

    // 發送郵件
    public boolean sendout() {
        try {
            mimeMsg.setContent(mp);
            mimeMsg.saveChanges();
            
            Session mailSession = Session.getInstance(props, null);
            Transport transport = mailSession.getTransport("smtp");
            transport.connect((String)props.get("mail.smtp.host"), username, password);
            transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
            transport.close();
            return true;
        } catch (Exception e) { return false; }
    }
}

使用範例


public static void main(String[] args) {
    SendMail mail = new SendMail("smtp.163.com");
    mail.setNeedAuth(true);
    mail.setNamePass("sendMail", "Javacode"); // 帳號密碼
    mail.setSubject("測試主旨");
    mail.setBody("<h1>HTML 內容</h1><p>支援中文</p>");
    mail.setFrom("sendMail@163.com");
    mail.setTo("recipient@example.com");
    mail.addFileAffix("D:/SendMail.java"); // 附件路徑
    mail.sendout();
}

關鍵點總結

功能關鍵類/方法注意事項
HTML 內容MimeBodyPart.setContent(html, "text/html;charset=GB2312")編碼需與中文環境匹配
附件FileDataSource + DataHandler大檔案建議分段或壓縮
SMTP 認證props.put("mail.smtp.auth", "true") + Transport.connect(host, user, pwd)163/126/QQ 等均需認證
多收件者InternetAddress.parse("a@b.com, c@d.com")逗號分隔
抄送/密送Message.RecipientType.CC / BCC同 setRecipients

常見問題排查

  • NoClassDefFoundError: javax/activation/DataHandler → 缺 activation.jar
  • Authentication failed → 帳號/密碼錯誤,或郵箱需開啟「SMTP 服務」與「授權碼」
  • 中文附件檔名亂碼 → MimeUtility.encodeWord(filename, "GB2312", "B") 編碼檔名
  • 連線逾時 → 檢查防火牆、SMTP 埠 (25/465/587)、SSL 設定
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved