使用Spring发送基于freemarker模板的邮件 博客分类: Spring SpringFreemarkerJavaMail模板邮件
程序员文章站
2024-03-24 14:26:04
...
在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富多彩,而且是“定制的”,能够灵活修改。这时候使用一个方便修改的邮件模板就显得非常必要了。
对于发送邮件,大家都知道Oracle提供了官方的JavaMail API,这个API没有包含在标准的JDK中,所以需要额外下载。JavaMail功能全而强大,但是在易用性方面还是略微差点,这方面Spring对JavaMail API的调用作了很好的封装,让开发者更多地考虑邮件的内容处理即可。至于邮件模板的生成,这里选用非常强大且好用的模板引擎Freemarker。
下面是简单的代码示例:
一、发送邮件处理类
FreemarkerMailService.java
/** * 使用freemarker文件作为模板发送邮件 * @author wdmcygah * */ @Service public class FreemarkerMailService { @Autowired private JavaMailSender mailSender; @Autowired private FreeMarkerConfigurer fmConfigurer; /** * 发送邮件 * @param templateName 模板文件名 * @param toEmailAddr 要发送到的邮箱地址 * @param subject 邮件主题名 * @param content 邮件内容 */ public void sendMail(String templateName,String toEmailAddr, String subject, Map<String,String> content){ MimeMessage msg = mailSender.createMimeMessage(); try { MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf-8"); //要发送到的邮箱地址 helper.setTo(toEmailAddr); //从哪发送的邮箱地址,自己改成真实的 helper.setFrom("fromEmailAddress"); helper.setSubject(subject); String text = getMailContent(content,templateName); helper.setText(text,true); helper.setSentDate(new Date()); mailSender.send(helper.getMimeMessage()); } catch (MessagingException e) { e.printStackTrace(); System.out.println("发送邮件异常"); } } /** * 根据模板获得解析后的内容 * @param content 邮件内容 * @param templateName 邮件模板名 * @return */ private String getMailContent(Map<String,String> content, String templateName) { String result = null; try { Template template = fmConfigurer.getConfiguration().getTemplate(templateName); result = FreeMarkerTemplateUtils.processTemplateIntoString(template, content); } catch (IOException e) { e.printStackTrace(); System.out.println("获得freemarker模板出错"); } catch (TemplateException e) { e.printStackTrace(); System.out.println("模板解析出错"); } return result; } }
二、关键配置文件
spring-mail.xml
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <!-- 这里选用163邮件服务器地址 --> <property name="host" value="smtp.163.com"></property> <!-- 用户名、密码改成自己真实的 --> <property name="username" value="real_username"></property> <property name="password" value="real_password"></property> <property name="defaultEncoding" value="UTF-8"></property> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">true</prop> </props> </property> </bean> <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="classpath:/freemarker"/><!--指定模板文件目录--> <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性--> <props> <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒--> <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 --> <prop key="locale">zh_CN</prop><!-- 本地化设置--> </props> </property> </bean>
三、Freemarker模板文件
hello.ftl
恭喜你,${name}!你已经用spring+freemarker发送了一封模板邮件!
四、主要依赖包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.21</version> </dependency>
五、测试类
public class FreemarkerMailServiceTest extends BaseTest{ @Autowired private FreemarkerMailService fmService; @Test public void sendMail() { String templateName = "hello.ftl"; Map<String,String> content = new HashMap<String, String>(); content.put("name", "wdmcygah"); String addr = "ToEmailAddress"; String subject = "测试"; fmService.sendMail(templateName, addr, subject, content); } }
如果想看完整源码,可以到我的Github仓库查看:https://github.com/wdmcygah/research-spring。
另外有些时候你可能只是想发送简单文本,那就在设置邮件内容(setText)的时候设置简单文本即可,同时比如邮件里面希望附带附件之类的,只需调用MimeMessageHelper的addAttachment方法即可。类似下面的这种处理方式:
JavaMailService.java
/** * 邮件发送处理类 * @author wdmcygah * */ @Service public class JavaMailService { @Autowired private JavaMailSender mailSender; /** * 发送简单文本 */ public void sendSimpleMail(){ MimeMessage javaMailMessage = mailSender.createMimeMessage(); MimeMailMessage msgWrapper = new MimeMailMessage(javaMailMessage); msgWrapper.setTo("toEmailAddress"); msgWrapper.setFrom("fromEmailAddress"); msgWrapper.setSubject("测试"); msgWrapper.setText("测试的内容."); msgWrapper.setSentDate(new Date()); mailSender.send(msgWrapper.getMimeMessage()); System.out.println("发送成功........"); } /** * 发送更多内容邮件 */ public void sendMultiMail(){ mailSender.send(new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"UTF-8"); helper.setTo("toEmailAddress"); helper.setFrom("fromEmailAddress"); helper.setSubject("测试"); StringBuilder sb = new StringBuilder("<html><body>hello..</body></html>"); helper.setText(sb.toString(),true); helper.addInline("inlinePng", new ClassPathResource("/multisource/test.jpg")); helper.addAttachment("test.png", new ClassPathResource("/multisource/test.png")); } }); } }
扩展链接:
1. JavaMail官网地址
2. JavaMail官方说明文档地址
3. Freemarker中文手册下载地址