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

Java XML郵件模板引擎:基於Commons Digester的動態郵件生成實戰

     編輯:Java 程式設計入門

為什麼選擇XML而非Properties?

郵件發送是Web應用基礎功能,但硬編碼字串維護困難。Properties檔雖簡單但缺陷明顯:

  • 鍵值對結構難支援多收件人、多CC/BCC
  • 單行限制導致長HTML郵件體編輯痛苦(需轉義換行)
  • 無原生條件邏輯、迴圈、巢狀結構支援

XML提供豐富結構表達力,天然支援多值、多層級、長文本,配合MessageFormat風格參數替換,實現靈活模板化。

郵件模板XML結構設計

<email-template>
    <from>system@example.com</from>
    <to>user1@example.com</to>
    <to>user2@example.com</to>
    <cc>manager@example.com</cc>
    <subject>歡迎 {0},您的帳號 {1} 已啟用</subject>
    <body>
        <![CDATA[
        親愛的 {0},
        您好!您的帳號 {1} 已成功啟用。
        登入網址:{2}
        ]]>
    </body>
</email-template>

Commons Digester整合實現

public class EmailTemplateEngine {
    private Digester digester;
    
    public EmailTemplateEngine() {
        digester = new Digester();
        digester.setValidating(false);
        // 映射規則
        digester.addObjectCreate("email-template", EmailTemplate.class);
        digester.addBeanPropertySetter("email-template/from", "from");
        digester.addBeanPropertySetter("email-template/subject", "subject");
        digester.addBeanPropertySetter("email-template/body", "body");
        digester.addSetNext("email-template/to", "addTo");
        digester.addSetNext("email-template/cc", "addCc");
        digester.addSetNext("email-template/bcc", "addBcc");
    }
    
    public EmailTemplate parse(InputStream xml) throws Exception {
        return (EmailTemplate) digester.parse(xml);
    }
    
    public String renderSubject(EmailTemplate tpl, Object... args) {
        return MessageFormat.format(tpl.getSubject(), args);
    }
    
    public String renderBody(EmailTemplate tpl, Object... args) {
        return MessageFormat.format(tpl.getBody(), args);
    }
}

JavaMail發送整合

public void sendEmail(EmailTemplate tpl, Object[] args) throws MessagingException {
    Session session = Session.getInstance(props, authenticator);
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(tpl.getFrom()));
    tpl.getTo().forEach(addr -> msg.addRecipient(TO, new InternetAddress(addr)));
    tpl.getCc().forEach(addr -> msg.addRecipient(CC, new InternetAddress(addr)));
    
    msg.setSubject(renderSubject(tpl, args), "UTF-8");
    msg.setContent(renderBody(tpl, args), "text/html; charset=UTF-8");
    
    Transport.send(msg);
}

優勢總結

  • 結構化管理:收件人列表、主題、正文分離,支援多實例
  • CDATA區塊:HTML郵件體無需轉義,所見即所得編輯
  • 參數化模板:{0}, {1}佔位符,型別安全格式化
  • 可擴展性:易加入attachments, headers, priority等元素
  • 本地化友善:每種語言一份XML模板,邏輯程式碼完全復用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved