Spring发送基于freemarker模板的邮件
在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富多彩,而且是“定制的”,能够灵活修改。这时候使用一个方便修改的邮件模板就显得非常必要了。
对于发送邮件,大家都知道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"));
- }
- });
- }
- }
Spring发送基于freemarker模板的邮件的更多相关文章
- Spring 4 使用Freemarker模板发送邮件&添加附件
前言 Spring对Java的邮件发送提供了很好的支持,提供了超级简单的API,大大简化了Java邮件发送功能的开发. Spring对Email的支持是基于JavaMail API开发的,所以,我们在 ...
- Spring 发送内嵌图片的邮件 遇到的问题
问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...
- spring mvc 集成freemarker模板
主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...
- Spring Boot☞ 使用freemarker模板引擎渲染web视图
效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...
- idea 使用spring boot 搭建freemarker模板
一丶新建maven spring boot 项目 新建好了开始使用模板 先看一个目录结构 二丶配置pox.xml <?xml version="1.0" encoding ...
- Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...
- FreeMarker模板引擎
现在开发的项目,也是基于SOA架构,每个功能接口都是用WebService实现,Web服务的通信协议就是用XML来传输. 以前写WebService都是自动生成XML,没想到这项目竟然要自己定义XML ...
- Spring框架集成FreeMarker
一.Spring in Action (转自:http://blog.163.com/zhang-_-jie/blog/static/16178437820105821120822/ ) FreeMa ...
- 使用Spring的JAVA Mail支持简化邮件发送(转)
闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...
随机推荐
- MVC页面移除HTTP Header中服务器信息
默认情况下,每一个MVC请求的HTTP Header中都会包含着当前服务器的一些信息,出于安全还是性能还是处女座的强迫症等等,都想把这些信息移除掉,增加一些应用程序的神秘感,如下,默认情况下Chrom ...
- 个人常用的win7 快捷键
1.Win + D – 显示桌面 2.Win+L 锁定系统 3.Win + R – 打开运行窗口 4.Win+M 最小化所有窗口 当按下后当前所有窗口全都最小化.再次按下这个组 ...
- AVA + Spectron + JavaScript 对 JS 编写的客户端进行自动化测试
什么是 AVA (类似于 unittest) AVA 是一种 JavaScript 单元测试框架,是一个简约的测试库.AVA 它的优势是 JavaScript 的异步特性和并发运行测试, 这反过来提高 ...
- kvm虚拟化存储池配置
1.创建基于文件夹的存储池(目录) 2.定义存储池与其目录 # virsh pool-define-as vmdisk --type dir --target /data/vmfs 3.创建已定义的存 ...
- Python之机器学习K-means算法实现
一.前言: 今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事.今天就给大家分享一下我的代码.代码可以运行,运行的Python环境是Python3.6以上 ...
- Solr7.4的学习与使用
学习的原因: 17年的时候有学习使用过lucene和solr,但是后来也遗忘了,最近公司有个项目需要使用到全文检索,正好也顺便跟着学习一下,使用的版本是Solr7.4的,下载地址:http://arc ...
- 架构师养成记--35.redis集群搭建
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...
- Visual Studio进行负载测试,RIG和负载测试术语- Part II
对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...
- linux下线程的分离和结合属性
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反, ...
- 北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...