利用Velocity结合Spring发email
2015-09-30 11:26
405 查看
在spring中发mail是一件容易的事,如果利用Velocity做mail的模板来发送就更得心应手了。 首先,还是简单描述sping中的配置,发mail需要一个mail的engin: <bean id="mailEngine" class="com.aodragon.jdt.backend.service.impl.MailEngineImpl"> <property name="mailSender"> <ref local="mailSender"/> </property> <property name="velocityEngine"> <ref local="velocityEngine"/> </property> </bean> 实现的类如下: package com.aodragon.jdt.backend.service.impl; import java.util.Map; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.apache.commons.logging.*; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.exception.VelocityException; import org.springframework.core.io.ClassPathResource; import org.springframework.mail.*; import org.springframework.mail.javamail.*; import org.springframework.ui.velocity.VelocityEngineUtils; import com.aodragon.jdt.backend.service.MailEngine; public class MailEngineImpl implements MailEngine { protected static final Log log = LogFactory.getLog(MailEngineImpl.class); private MailSender mailSender; private VelocityEngine velocityEngine; public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } public void setVelocityEngine(VelocityEngine velocityEngine) { this.velocityEngine = velocityEngine; } public void sendMessage(SimpleMailMessage msg, String templateName, Map model) { String result = null; try { result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, templateName, model); } catch (VelocityException e) { e.printStackTrace(); } msg.setText(result); send(msg); } public void sendMessage(SimpleMailMessage msg, String templateName, String encoding, Map model) { String result = null; try { result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, templateName, encoding,model); } catch (VelocityException e) { e.printStackTrace(); } msg.setText(result); send(msg); } public void send(SimpleMailMessage msg) { try { mailSender.send(msg); } catch (MailException ex) { //log it and go on log.error(ex.getMessage()); } } public void sendMessage(String[] emailAddresses, ClassPathResource resource, String bodyText, String subject, String attachmentName) throws MessagingException { MimeMessage message = ((JavaMailSenderImpl) mailSender).createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo(emailAddresses); helper.setText(bodyText); helper.setSubject(subject); helper.addAttachment(attachmentName, resource); ((JavaMailSenderImpl) mailSender).send(message); } } 这个engin实现了4个方法,在需要的时候调用,这里也需要两个对象: private MailSender mailSender; private VelocityEngine velocityEngine; 所以在配置的时候需要注意有: <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host"> <value>${email.host}</value> </property> <property name="username"> <value>${email.username}</value> </property> <property name="password"> <value>${email.password}</value> </property> </bean> <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> <property name="velocityProperties"> <props> <prop key="resource.loader">class</prop> <prop key="class.resource.loader.class">org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader</prop> <prop key="velocimacro.library"/> </props> </property> </bean> 这样配置是完成了,下面给一个在Action中发mail的调用示例 public ActionForward save(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletRresponse) throws Exception { String toEmail = "…" HashMap model = new HashMap(); this.smm.setTo(toEmail); this.smm.setSubject("谢谢您的关注"); model.put("content","………….. "); MessageResources resources = getResources(httpServletRequest); this.mailEngin.sendMessage(this.smm,resources.getMessage(_locale,"velocity.email.bookproduct"),model); return list(actionMapping, actionForm, httpServletRequest, httpServletRresponse); } // end save 这里需要说明的就是调用sendMessage中的第2个参数为resources.getMessage(_locale,"velocity.email.bookproduct"),这里是为了适应多语言版本,调用对应的vm文件,velocity.email.bookproduct是保存在ApplicationResource.properties各个版本中的vm文件对应的路径。其中_locale = (Locale)request.getSession().getAttribute(Globals.LOCALE_KEY)。 这样,简单的Velocity结合Spring发送email就完成了,还可以添加一个TASK来管理邮件的队列,让系统定时发送队列中的邮件;在线管理mailSender中的各个参数等等。
相关文章推荐
- 创建eclipse新的workspace并设置workspace共享配置
- Java 如何有效地避免OOM:善于利用软引用和弱引用
- Spring事务配置的五种方式
- 在eclipse中使用maven工具构建项目
- MyEclipse部署项目出错解决方法
- [转]Eclipse 的快捷键以及文档注释、多行注释的快捷键
- Java高级特性 内省
- 怎么修改eclipse项目的svn路径
- java向上转型
- Java基础学习总结——Java对象的序列化和反序列化
- java注释说明
- Java生成一个UTF-8文件
- Spring4 MVC json问题(406 Not Acceptable)
- spring----contextConfigLocation
- Java DFA算法实现敏感词过滤
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
- java08:成绩管理系统
- Java抽象类和接口的区别
- java实例变量初始化
- Protobuf在Java中的使用