`
wdmcygah
  • 浏览: 62481 次
社区版块
存档分类
最新评论

使用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"));
			}
		});
	}
	
}

 


扩展链接:
1. JavaMail官网地址
2. JavaMail官方说明文档地址
3. Freemarker中文手册下载地址

分享到:
评论

相关推荐

    spring整合freemarker发送邮件例子

    在本示例中,我们将探讨如何使用Spring框架与FreeMarker模板引擎相结合,来实现一个功能丰富的电子邮件服务。这个服务能够发送HTML格式的邮件,其中包含内嵌的图片,并且能够处理附件,同时解决字符编码可能导致的...

    基于Spring Boot和Apache Freemarker的电子邮件发送系统

    该项目是一个基于Spring Boot和Apache Freemarker的电子邮件发送系统。它允许用户通过自定义电子邮件模板、附件等功能,向指定的电子邮件地址发送邮件。用户可以编辑项目资源文件夹中的'email.ftl'文件来个性化电子...

    Spring+Freemarker 使用163发HTML格式的邮件

    标题 "Spring+Freemarker 使用163发HTML格式的邮件" 描述的是一个使用Spring框架结合Freemarker模板引擎发送HTML格式邮件的过程。在这个场景中,开发人员可能需要通过编程方式向用户发送包含丰富格式内容的邮件,...

    SpringBoot使用FreeMarker模板发送邮件

    "SpringBoot使用FreeMarker模板发送邮件" 在本文中,我们将详细介绍如何使用SpringBoot框架和FreeMarker模板引擎来发送邮件。我们将从基本概念开始,逐步介绍如何配置SpringBoot项目来使用FreeMarker模板发送邮件。...

    spring + mail + 发送邮件完整 demo (含注释)

    通过这个Demo,你可以了解到如何配置邮件服务器、如何使用Freemarker模板生成动态邮件内容,以及如何利用Spring的`JavaMailSender`接口发送邮件。这只是一个基础的实现,你还可以根据需要扩展功能,比如支持附件、...

    Spring mvc 发送邮件功能

    在Spring MVC框架中,实现邮件发送功能通常涉及配置Spring的JavaMailSender接口和使用模板引擎如FreeMarker来创建动态邮件内容。以下是一个详细的步骤指南: 1. **依赖库**: - `javax.mail`:这是Java邮件API的...

    SpringBoot集成Freemarker+FlyingSaucer实现pdf在线预览.pdf

    一、Freemarker模板引擎 Freemarker是Java中的一款模板引擎,可以根据模板和参数生成输出结果。在本方案中,Freemarker用于生成HTML模板,并将其转换为PDF文档。Freemarker的模板语法简单易懂,且支持各种数据类型...

    基于java的模板引擎 FreeMarker.zip

    - **邮件发送**:自定义邮件模板,动态生成个性化邮件内容。 - **文档生成**:如生成报表、PDF、Excel等。 **最佳实践:** 1. **模板设计**:保持模板简洁,避免过多的业务逻辑。 2. **数据模型设计**:合理组织...

    spring boot+mail邮件服务学习demo项目源码

    Spring Mail支持创建复杂的HTML邮件,可以利用Velocity或FreeMarker模板引擎来生成动态内容。 6. **邮件附件** 发送带有附件的邮件也是常见的需求。Spring Mail提供了`MimeMessageHelper`类,允许我们方便地添加...

    javamail邮件发送项目

    综合以上信息,这个项目提供了一个完整的邮件发送解决方案,包括了Spring配置、FreeMarker模板、异步处理和批量发送邮件的特性,以及处理附件的功能,对于需要构建邮件服务的Java应用程序来说是一个有价值的参考。

    freemarker及安装

    2. 邮件发送:可以使用Freemarker模板动态生成邮件内容,提高邮件的个性化程度。 3. 文档生成:Freemarker也可用于生成各种格式的文档,如PDF、Excel等,只需为模板提供相应的数据模型。 4. API文档:一些API文档...

    spring框架各jar包详解

    Spring 提供了 FreeMarker 模板引擎的包装类,还为把 FreeMarker 模板用作 web 应用的视图提供了支持。只要使用 FreeMarker,就需要这个 JAR 文件。 hibernateehcache.jar, hibernate2.jar, odmg.jar 如果采用 ...

    springMail

    SpringMail 是一个基于 Java 的库,它允许开发者在 Spring 框架中轻松地发送电子邮件。这个库使得处理复杂的邮件任务变得简单,包括发送带有正文、附件以及多种内容类型的邮件。下面将详细介绍 SpringMail 的使用...

    java发送电子邮件代码

    - **邮件模板**:在实际应用中,经常需要发送结构相似但具体内容不同的邮件,此时可以使用模板引擎(如Freemarker)来动态生成邮件内容。代码中引用的`FreeMarkerConfigurer`和`Template`就是为此目的服务的,可以...

    SpringMail

    SpringMail 是一个在 Java 应用中发送电子邮件的库,它是 Spring 框架的一个扩展,使得在基于 Spring 的应用程序中集成邮件服务变得非常简单。SpringMail 提供了一种方便的方式来配置和使用 JavaMail API,避免了...

    spring boot资料以及项目

    此外,Spring Boot还集成了Thymeleaf、FreeMarker等模板引擎,用于构建动态网页。 在Web开发方面,Spring Boot提供了Spring MVC框架,用于处理HTTP请求。资料中可能会有RESTful API设计、WebSocket、Swagger接口...

    265-基于SpringBoot的邮件收发系统(源码+数据库)

    在实现这些功能的过程中,开发者可能使用了Thymeleaf或FreeMarker作为视图模板引擎,处理HTML页面的动态渲染;同时,使用MyBatis或JPA作为持久层框架,与数据库进行交互,存储和检索邮件信息。 最后,系统的源码...

    基于SSM实现的注册登录系统 验证码使用jcaptcha,发送邮件使用JEmail.zip

    这是一个基于Java的SSM(Spring、SpringMVC和MyBatis)框架实现的注册登录系统,其中集成了jcaptcha用于生成验证码以及JEmail用于发送邮件的功能。以下将详细阐述这个系统的组成部分及其工作原理。 1. **Spring框架...

    Spring in Action(第二版 中文高清版).part2

    14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity...

Global site tag (gtag.js) - Google Analytics