读书人

Spring的E-mail支持在现实开发中的应用

发布时间: 2012-07-05 07:59:18 作者: rapoo

Spring的E-mail支持在实际开发中的应用

1.使用系统指定的邮件模板

使用Velocity的VTL编写模板如下:

Hello,${userName}

邮件模板内容可以vm模板文件形式保存,也可以存入数据库中。暂且将其存入hello.vm文件,并将该文件放在Classpath的根路径下

ITemplateMailAgent抽象接口定义

public interface ITemplateMailAgent{

???????//convenient sending method with only recipient.TO

?????? void sendMail(String receiver,String subject,String templateKey,Map<String,Object>context);

?????? //central method to send E-mail with template support

???????//@param receivers Recipients as a Parameter wrapper object

???????//@param templateKey the identity of the template to use

?????? //@param context contains data that will be merged into template

?????? void sendMai(Recipients receivers,String subject,String templateKey,Map<String,Object>context);

}

ITemplateMailAgent的抽象允许我们提供基于不同模板技术的实现类,我们使用Velocity

针对Velocity的ITemplateMailAgent实现类定义代码

public class VelocityTemplateMailAgent implements ITemplateMailAgent{

??????? private final String DEFAULT_SENDER = sender@xxx.com.cn;

??????? private final String DEFAULT_ENCODING = "UTF-8";

??????? private String mailFrom = DEFAULT_SENDER;

????????private String mailEncoding = DEFAULT_ENCODING;

????????private JavaMailSender javaMailSender;

??????? private VelocityEngine velocityEngine;

??????? public void sendMail(String receiver,String subject,String templateKey,

??????????Map<String,Object>context){

??????????????? Recipients recipients = new Recipients(receiver);

??????????????? sendMail(recipients,subject,templateKey,context);

??????? }???????

????????public void sendMail(final Recipients receivers,final String subject,String templateKey,

????????? Map<String,Object>context){

???????????????? validateRecipients(receivers);

???????????????? Validate.notEmpty(templateKey);

???????????????? StringWriter writer = new StringWriter();

???????????????? VelocityEngineUtils.mergeTemplate(velocityEngine,templateKey,getMailEncoding(),context,writer);

?????????????????final String mailText = writer.toString();? //mail content is ready

???????????????? getJavaMailSender().send(new MmeMessagePreparator(){

????????????????????????public void prepare(MimeMessage message)throws Exception{

????????????????????????????MimeMessageHelper helper = new MimeMessageHelper(message,getMailEncoding());

??????????????????????????? helper.setFrom(getMailFrom());

??????????????????????????? helper.setTo(receivers.getTo());

??????????????????????????? if(!CollectionUtils.isEmpty(receivers.getCcList())){

???????????????????????????????? helper.setCc(receivers.getCc());

??????????????????????????? }

????????????????????????????if(!CollectionUtils.isEnpty(receivers.getBccList())){

???????????????????????????????? helper.setBcc(receivers.getBcc());

???????????????????????????????? helper.setSubject(subject);

???????????????????????????????? helper.setText(mailText);

??????????????????????????? }

??????????????????????? }

???????????????? });

??????? }

????????private void validateRecipients(Recipients receivers){

???????????????? //...

??????? }

???????? //用于依赖注入的getter和setter方法定义

}

VelocityTemplateMailAgent的实现逻辑依赖于两个主要组件:模板引擎VelocityEngine,JavaMailSender

?

VelocityTemplateMailAgent及其相关实现类使用配置示例

<bean id="cpLoaderVelocityEngine" value="classpath:cn/spring21/conf/velocity-config.properties"?/>

</bean>

<bean id="javaMailSender" value="..." />

?????? <property name="username" value="..." />

?????? <property name="password" value="..." />

?????? <property name="javaMailProperties">

????????????? <props>

???????????????????? <prop key="mail.smtp.auth">true</prop>

????????????? </props>

?????? </property>

</bean>

<bean id="templateEmailAgent" ref="javaMailSender" />

??????? <property name="velocityEngine" ref="cpLoaderVelocityEngine" />

</bean>

?

#velocity-config.properties

resource.loader=classpath

classpath.resource.loader.description=Classpath Resource Loader

classpath.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

velocimacro.library=

?

通过如下方式发送最初模板所设定的邮件内容

VelocityTemplateMailAgent mailAgent = ... //通过IoC容器注入或查找相应实例

Map<String,Object>context = new HashMap<String,Object>();

context.put("userName","Allen");

mailAgent.sendMail(test@gmail.com,"邮件标题","hello.vm",context);

读书人网 >网络基础

热点推荐