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 = [email protected];
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" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="configLocation" value="classpath:cn/spring21/conf/velocity-config.properties" />
</bean>
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" 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" class="com.xxx.mail.template.VelocityTemplateMailAgent">
<property name="javaMailSender" 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([email protected],"邮件标题","hello.vm",context);