一) 现在项目中用的javamail和org.springframework.mail.javamail.JavaMailSender来发送电子邮件的,而邮件正文的模板是在spring的配置文件中完成的。
修改起来比较麻烦,并缺乏一些逻辑控制。我决定改造一下,把这些模板性质的东西都用freemarker管理起来。于是就有了这篇文章。
二) 代码和配置
修改起来比较麻烦,并缺乏一些逻辑控制。我决定改造一下,把这些模板性质的东西都用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="foo@xxx.com" />
<property name="password" value="password" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
</property>
</bean>