修改起来比较麻烦,并缺乏一些逻辑控制。我决定改造一下,把这些模板性质的东西都用freemarker管理起来。于是就有了这篇文章。
二) 代码和配置
package mail; import java.io.IOException; import java.util.Collection; import javax.mail.internet.MimeMessage; import org.springframework.beans.factory.InitializingBean; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.util.Assert; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreeMarkerConfiguredMailSender implements InitializingBean { private Configuration freeMarkerConfiguration; private JavaMailSender javaMailSender; private String encoding = "UTF-8"; // constructor // ----------------------------------------------------------------------- public FreeMarkerConfiguredMailSender() { super(); } public FreeMarkerConfiguredMailSender( Configuration freeMarkerConfiguration, JavaMailSender javaMailSender) { this(); this.freeMarkerConfiguration = freeMarkerConfiguration; this.javaMailSender = javaMailSender; } // send html email, exception thrown maybe // ----------------------------------------------------------------------- public void sendMail(final String[] to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) throws IOException, TemplateException { Template template = freeMarkerConfiguration.getTemplate(templateName); final String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); javaMailSender.send(new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, encoding); message.setTo(to); message.setFrom(from); message.setCc(cc != null ? cc : new String[0]); message.setBcc(bcc != null ? bcc : new String[0]); message.setSubject(subject != null ? subject : ""); message.setText(text, true); } }); } public void sendMail(final String to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) throws IOException, TemplateException { sendMail(new String[]{to}, from, cc, bcc, subject, templateName, model); } public void sendMail(final Collection<String> to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model) throws IOException, TemplateException { sendMail(_toArray(to), from, _toArray(cc), _toArray(bcc), subject, templateName, model); } public void sendMail(final String to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model) throws IOException, TemplateException { sendMail(to, from, _toArray(cc), _toArray(bcc), subject, templateName, model); } // send html email quietly // ----------------------------------------------------------------------- public boolean sendMailQuietly(final String[] to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) { try { sendMail(to, from, cc, bcc, subject, templateName, model); } catch (IOException e) { return false; } catch (TemplateException e) { return false; } return true; } public boolean sendMailQuietly(final String to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) { try { sendMail(new String[]{to}, from, cc, bcc, subject, templateName, model); } catch (IOException e) { return false; } catch (TemplateException e) { return false; } return true; } public boolean sendMailQuietly(final Collection<String> to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model) { try { sendMail(_toArray(to), from, _toArray(cc), _toArray(bcc), subject, templateName, model); } catch (IOException e) { return false; } catch (TemplateException e) { return false; } return true; } public boolean sendMailQuietly(final String to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model) { try { sendMail(to, from, _toArray(cc), _toArray(bcc), subject, templateName, model); } catch (IOException e) { return false; } catch (TemplateException e) { return false; } return true; } // inner util method // ------------------------------------------------------------------------------------------------------ private String[] _toArray(Collection<String> collection) { if (collection == null || collection.isEmpty()) return new String[0]; return collection.toArray(new String[0]); } // // ------------------------------------------------------------------------------------------------------ public void afterPropertiesSet() throws Exception { Assert.notNull(encoding); Assert.notNull(freeMarkerConfiguration); Assert.notNull(javaMailSender); freeMarkerConfiguration.setDefaultEncoding(encoding); } // setter and getter // ------------------------------------------------------------------------------------------------------ public JavaMailSender getJavaMailSender() { return javaMailSender; } public void setJavaMailSender(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } public Configuration getFreeMarkerConfiguration() { return freeMarkerConfiguration; } public void setFreeMarkerConfiguration(Configuration freeMarkerConfiguration) { this.freeMarkerConfiguration = freeMarkerConfiguration; } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } }
<bean class="mail.FreeMarkerConfiguredMailSender"> <property name="freeMarkerConfiguration"> <bean class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean"> <property name="templateLoaderPath" value="classpath:email-templates" /> <property name="freemarkerSettings"> <props> <prop key="tag_syntax">auto_detect</prop> <prop key="template_update_delay">0</prop> <!-- <prop key="default_encoding">UTF-8</prop> <prop key="output_encoding">UTF-8</prop> --> <prop key="locale">zh_CN</prop> <prop key="date_format">yyyy-MM-dd</prop> <prop key="time_format">HH:mm:ss</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> </props> </property> </bean> </property> <property name="javaMailSender"> <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.xxx.com" /> <property name="port" value="25" /> <property name="username" value="[email protected]" /> <property name="password" value="password" /> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">true</prop> </props> </property> </bean> </property> </bean>