通过spring,javamail,和freemarker集成发送HTML方式的电子邮件

一) 现在项目中用的javamail和org.springframework.mail.javamail.JavaMailSender来发送电子邮件的,而邮件正文的模板是在spring的配置文件中完成的。
修改起来比较麻烦,并缺乏一些逻辑控制。我决定改造一下,把这些模板性质的东西都用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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值