郵件發送是Web應用基礎功能,但硬編碼字串維護困難。Properties檔雖簡單但缺陷明顯:
XML提供豐富結構表達力,天然支援多值、多層級、長文本,配合MessageFormat風格參數替換,實現靈活模板化。
<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>
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);
}
}
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);
}
{0}, {1}佔位符,型別安全格式化attachments, headers, priority等元素