在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富多彩,而且是“定制的”,能够灵活修改。这时候使用一个方便修改的邮件模板就显得非常必要了。

对于发送邮件,大家都知道Oracle提供了官方的JavaMail API,这个API没有包含在标准的JDK中,所以需要额外下载。JavaMail功能全而强大,但是在易用性方面还是略微差点,这方面Spring对JavaMail API的调用作了很好的封装,让开发者更多地考虑邮件的内容处理即可。至于邮件模板的生成,这里选用非常强大且好用的模板引擎Freemarker。

下面是简单的代码示例:
一、发送邮件处理类

FreemarkerMailService.java

  1. /**
  2. * 使用freemarker文件作为模板发送邮件
  3. * @author wdmcygah
  4. *
  5. */
  6. @Service
  7. public class FreemarkerMailService {
  8. @Autowired
  9. private JavaMailSender mailSender;
  10. @Autowired
  11. private FreeMarkerConfigurer fmConfigurer;
  12. /**
  13. * 发送邮件
  14. * @param templateName 模板文件名
  15. * @param toEmailAddr  要发送到的邮箱地址
  16. * @param subject   邮件主题名
  17. * @param content   邮件内容
  18. */
  19. public void sendMail(String templateName,String toEmailAddr, String subject, Map<String,String> content){
  20. MimeMessage msg = mailSender.createMimeMessage();
  21. try {
  22. MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf-8");
  23. //要发送到的邮箱地址
  24. helper.setTo(toEmailAddr);
  25. //从哪发送的邮箱地址,自己改成真实的
  26. helper.setFrom("fromEmailAddress");
  27. helper.setSubject(subject);
  28. String text = getMailContent(content,templateName);
  29. helper.setText(text,true);
  30. helper.setSentDate(new Date());
  31. mailSender.send(helper.getMimeMessage());
  32. } catch (MessagingException e) {
  33. e.printStackTrace();
  34. System.out.println("发送邮件异常");
  35. }
  36. }
  37. /**
  38. * 根据模板获得解析后的内容
  39. * @param content   邮件内容
  40. * @param templateName  邮件模板名
  41. * @return
  42. */
  43. private String getMailContent(Map<String,String> content, String templateName) {
  44. String result = null;
  45. try {
  46. Template template = fmConfigurer.getConfiguration().getTemplate(templateName);
  47. result = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. System.out.println("获得freemarker模板出错");
  51. } catch (TemplateException e) {
  52. e.printStackTrace();
  53. System.out.println("模板解析出错");
  54. }
  55. return result;
  56. }
  57. }

二、关键配置文件

spring-mail.xml

  1. <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  2. <!-- 这里选用163邮件服务器地址 -->
  3. <property name="host" value="smtp.163.com"></property>
  4. <!-- 用户名、密码改成自己真实的 -->
  5. <property name="username" value="real_username"></property>
  6. <property name="password" value="real_password"></property>
  7. <property name="defaultEncoding" value="UTF-8"></property>
  8. <property name="javaMailProperties">
  9. <props>
  10. <prop key="mail.smtp.auth">true</prop>
  11. </props>
  12. </property>
  13. </bean>
  14. <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  15. <property name="templateLoaderPath" value="classpath:/freemarker"/><!--指定模板文件目录-->
  16. <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->
  17. <props>
  18. <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->
  19. <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
  20. <prop key="locale">zh_CN</prop><!-- 本地化设置-->
  21. </props>
  22. </property>
  23. </bean>

三、Freemarker模板文件

hello.ftl

  1. 恭喜你,${name}!你已经用spring+freemarker发送了一封模板邮件!

四、主要依赖包

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context-support</artifactId>
  4. <version>4.0.0.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>javax.mail</groupId>
  8. <artifactId>mail</artifactId>
  9. <version>1.4.7</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.freemarker</groupId>
  13. <artifactId>freemarker</artifactId>
  14. <version>2.3.21</version>
  15. </dependency>

五、测试类

  1. public class FreemarkerMailServiceTest extends BaseTest{
  2. @Autowired
  3. private FreemarkerMailService fmService;
  4. @Test
  5. public void sendMail() {
  6. String templateName = "hello.ftl";
  7. Map<String,String> content = new HashMap<String, String>();
  8. content.put("name", "wdmcygah");
  9. String addr = "ToEmailAddress";
  10. String subject = "测试";
  11. fmService.sendMail(templateName, addr, subject, content);
  12. }
  13. }

如果想看完整源码,可以到我的Github仓库查看:https://github.com/wdmcygah/research-spring
另外有些时候你可能只是想发送简单文本,那就在设置邮件内容(setText)的时候设置简单文本即可,同时比如邮件里面希望附带附件之类的,只需调用MimeMessageHelper的addAttachment方法即可。类似下面的这种处理方式:

JavaMailService.java

    1. /**
    2. * 邮件发送处理类
    3. * @author wdmcygah
    4. *
    5. */
    6. @Service
    7. public class JavaMailService {
    8. @Autowired
    9. private JavaMailSender mailSender;
    10. /**
    11. * 发送简单文本
    12. */
    13. public void sendSimpleMail(){
    14. MimeMessage javaMailMessage = mailSender.createMimeMessage();
    15. MimeMailMessage msgWrapper = new MimeMailMessage(javaMailMessage);
    16. msgWrapper.setTo("toEmailAddress");
    17. msgWrapper.setFrom("fromEmailAddress");
    18. msgWrapper.setSubject("测试");
    19. msgWrapper.setText("测试的内容.");
    20. msgWrapper.setSentDate(new Date());
    21. mailSender.send(msgWrapper.getMimeMessage());
    22. System.out.println("发送成功........");
    23. }
    24. /**
    25. * 发送更多内容邮件
    26. */
    27. public void sendMultiMail(){
    28. mailSender.send(new MimeMessagePreparator() {
    29. public void prepare(MimeMessage mimeMessage) throws Exception {
    30. MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
    31. helper.setTo("toEmailAddress");
    32. helper.setFrom("fromEmailAddress");
    33. helper.setSubject("测试");
    34. StringBuilder sb = new StringBuilder("<html><body>hello..</body></html>");
    35. helper.setText(sb.toString(),true);
    36. helper.addInline("inlinePng", new ClassPathResource("/multisource/test.jpg"));
    37. helper.addAttachment("test.png", new ClassPathResource("/multisource/test.png"));
    38. }
    39. });
    40. }
    41. }

Spring发送基于freemarker模板的邮件的更多相关文章

  1. Spring 4 使用Freemarker模板发送邮件&添加附件

    前言 Spring对Java的邮件发送提供了很好的支持,提供了超级简单的API,大大简化了Java邮件发送功能的开发. Spring对Email的支持是基于JavaMail API开发的,所以,我们在 ...

  2. Spring 发送内嵌图片的邮件 遇到的问题

    问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...

  3. spring mvc 集成freemarker模板

    主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...

  4. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

  5. idea 使用spring boot 搭建freemarker模板

      一丶新建maven spring boot 项目 新建好了开始使用模板 先看一个目录结构 二丶配置pox.xml <?xml version="1.0" encoding ...

  6. Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

    Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...

  7. FreeMarker模板引擎

    现在开发的项目,也是基于SOA架构,每个功能接口都是用WebService实现,Web服务的通信协议就是用XML来传输. 以前写WebService都是自动生成XML,没想到这项目竟然要自己定义XML ...

  8. Spring框架集成FreeMarker

    一.Spring in Action (转自:http://blog.163.com/zhang-_-jie/blog/static/16178437820105821120822/ ) FreeMa ...

  9. 使用Spring的JAVA Mail支持简化邮件发送(转)

    闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...

随机推荐

  1. Mycat SqlServer Do not have slave connection to use, use master connection instead

    Do not have slave connection to use, use master connection instead 很奇怪啊 都是按照配置配置的 怎么就是不通呢 有点怀疑人生了吧 其 ...

  2. ES6学习之ES5之后新增的字符串方法

    1.字符串模板:用法:`${变量名}` (好像是C#6.0中也引入了类似的方法.C#中的用法:$"我是{变量名}" ---> $"我叫{name}" ,相 ...

  3. UWP开发入门(三)——{x:Bind}扩展标记

    上周打炉石打得太晚……忘记更新了,本周补上.本篇我们讲一下{x:Bind}扩展标记.{x:Bind}扩展标记也是Windows 10 Uinversal 新增的内容,按官方的说法是 {Binding} ...

  4. Let it crash philosophy for distributed systems

    This past weekend I read Joe Armstrong’s paper on the history of Erlang. Now, HOPL papers in general ...

  5. A - 畅通工程 (并查集)

    点击打开链接 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连 ...

  6. CPU缓存刷新的误解

    即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新.看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区.本文将致力于解释CPU缓存的功能以及执行程序 ...

  7. javascript IE事件处理及跨浏览器事件处理程序

    一.javascript事件处理中 addEventListener/removeEventListener 用于绑定事件和解除事件,但大多用于chrome/火狐/IE9这些比较高级的浏览器中,IE8 ...

  8. php解析word,获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

  9. 多线程:GCD

    多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西.同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂.如果使用过程中对多线程不够熟悉,很可能会埋下一些 ...

  10. (C/C++) 指向函數的指標

    最近再跟指標做朋友, 正好遇到函數與指標. 其實函數也在程式內也是有屬於自己的位址 所以指標一樣能指向函數, 在此釐清自己的觀念以及記錄下來. #include <stdio.h> #in ...