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);