java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

博客分类:

本文主要介绍利用JavaMailSenderImpl发送邮件。首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件以velocity为模板发送邮件。

邮件发送分为为三步:创建邮件发送器编写邮件发送邮件

Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件、带附件邮件、html格式邮件、带图片邮件、设置发送内容编码格式、设置发送人的显示名称。

下面就进行介绍,示例代码中很多都是字符串硬编码,实际使用时推荐使用spring的配置文件进行配置。

1、创建邮件发送器

首先定义JavaMailSenderImpl对象,并对其进行smtp相关信息设置,相当于我们自己的邮箱,如下:

Java代码  

  1. JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  2. mailSender.setHost("smtp.qq.com");
  3. mailSender.setUsername("[email protected]");
  4. mailSender.setPassword("asterisks");
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.qq.com");
mailSender.setUsername("[email protected]");
mailSender.setPassword("asterisks");

当然更好的方法是使用配置文件进行配置,这里只是进行介绍,忽略硬编码先。

以上主机为邮箱服务商的smtp地址,用户名、密码为用户自己的邮箱。除以上外还可以设置

setPort(int port) 、setProtocol(String protocol) 等,可暂时不考虑。

这样我们便类似创建好了一个邮件发送器

2、 开始写邮件,编写邮件内容

JavaMailSenderImpl支持MimeMessagesSimpleMailMessages

MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。

SimpleMailMessages实现了MimeMessageHelper,为普通邮件模板,支持文本。

下面先以SimpleMailMessages为例进行介绍

Java代码  

  1. SimpleMailMessage smm = new SimpleMailMessage();
  2. // 设定邮件参数
  3. smm.setFrom(mailSender.getUsername());
  4. smm.setTo("[email protected]");
  5. smm.setSubject("Hello world");
  6. smm.setText("Hello world via spring mail sender");
  7. // 发送邮件
  8. mailSender.send(smm);
SimpleMailMessage smm = new SimpleMailMessage();
// 设定邮件参数
smm.setFrom(mailSender.getUsername());
smm.setTo("[email protected]");
smm.setSubject("Hello world");
smm.setText("Hello world via spring mail sender");
// 发送邮件
mailSender.send(smm);

如此,我们便完成了一个简单邮件的编写,对于复杂邮件,编写及发送如下

Java代码  

  1. //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
  2. MimeMessage msg = mailSender.createMimeMessage();
  3. //创建MimeMessageHelper对象,处理MimeMessage的辅助类
  4. MimeMessageHelper helper = new MimeMessageHelper(msg, true);
  5. //使用辅助类MimeMessage设定参数
  6. helper.setFrom(mailSender.getUsername());
  7. helper.setTo("[email protected]");
  8. helper.setSubject("Hello Attachment");
  9. helper.setText("This is a mail with attachment");
  10. //加载文件资源,作为附件
  11. ClassPathResource file = new ClassPathResource("Chrysanthemum.jpg");
  12. //加入附件
  13. helper.addAttachment("attachment.jpg", file);
  14. // 发送邮件
  15. mailSender.send(smm);
//使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
MimeMessage msg = mailSender.createMimeMessage();
//创建MimeMessageHelper对象,处理MimeMessage的辅助类
MimeMessageHelper helper = new MimeMessageHelper(msg, true);
//使用辅助类MimeMessage设定参数
helper.setFrom(mailSender.getUsername());
helper.setTo("[email protected]");
helper.setSubject("Hello Attachment");
helper.setText("This is a mail with attachment");
//加载文件资源,作为附件
ClassPathResource file = new ClassPathResource("Chrysanthemum.jpg");
//加入附件
helper.addAttachment("attachment.jpg", file);
// 发送邮件
mailSender.send(smm);

其中MimeMessageHelper为的辅助类MimeMessages。以上包含了以资源文件为附件进行发送。对于普通文件发送方式如下:

Java代码  

  1. FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
  2. helper.addInline("file", file);
FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
helper.addInline("file", file);

3、发送邮件

2中已经包含了发送的代码,只需使用JavaMailSenderImpl的send接口即可。支持类型为

Java代码  

  1. void    send(MimeMessage mimeMessage)
  2. Send the given JavaMail MIME message.
  3. void    send(MimeMessage[] mimeMessages)
  4. Send the given array of JavaMail MIME messages in batch.
  5. void    send(MimeMessagePreparator mimeMessagePreparator)
  6. Send the JavaMail MIME message prepared by the given MimeMessagePreparator.
  7. void    send(MimeMessagePreparator[] mimeMessagePreparators)
  8. Send the JavaMail MIME messages prepared by the given MimeMessagePreparators.
  9. void    send(SimpleMailMessage simpleMessage)
  10. Send the given simple mail message.
  11. void    send(SimpleMailMessage[] simpleMessages)
  12. Send the given array of simple mail messages in batch.
 void	send(MimeMessage mimeMessage)
          Send the given JavaMail MIME message.
 void	send(MimeMessage[] mimeMessages)
          Send the given array of JavaMail MIME messages in batch.
 void	send(MimeMessagePreparator mimeMessagePreparator)
          Send the JavaMail MIME message prepared by the given MimeMessagePreparator.
 void	send(MimeMessagePreparator[] mimeMessagePreparators)
          Send the JavaMail MIME messages prepared by the given MimeMessagePreparators.
 void	send(SimpleMailMessage simpleMessage)
          Send the given simple mail message.
 void	send(SimpleMailMessage[] simpleMessages)
          Send the given array of simple mail messages in batch.

下面介绍下怎么发送富文本文件以及以velocity为模板发送邮件。

4、发送html文件

只需要在MimeMessageHelper setText时将是否是html设为true即可。setText介绍如下:

Xml代码  

  1. setText(String text, boolean html)
  2. Set the given text directly as content in non-multipart mode or as default body part in multipart mode.
setText(String text, boolean html)
          Set the given text directly as content in non-multipart mode or as default body part in multipart mode.

示例代码(包括附件)如下:

Java代码  

  1. //第二个参数true,表示text的内容为html
  2. //注意<img/>标签,src=‘cid:file‘,‘cid‘是contentId的缩写,‘file‘是一个标记,需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件
  3. helper.setText("<body><p>Hello Html Email</p><img src=‘cid:file‘/></body>", true);
  4. FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
  5. helper.addInline("file", file);
//第二个参数true,表示text的内容为html
//注意<img/>标签,src=‘cid:file‘,‘cid‘是contentId的缩写,‘file‘是一个标记,需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件
helper.setText("<body><p>Hello Html Email</p><img src=‘cid:file‘/></body>", true);
FileSystemResource file = new FileSystemResource("C:\\Users\\image1.jpg");
helper.addInline("file", file);

5、以velocity为模板发送邮件

使用Velocity模板,需要Velocity的jar包,可以在官方网站下载,并加入ClassPath。

以velocity为模板发送邮件的原理如下:

a 类似web编程,将velocity作为前端,在java中设置vm中需要显示的变量值

b 使用VelocityEngineUtilsmergeTemplateIntoString函数将vm内容转换为文本

c 同4的发送html邮件一样发送邮件

所以最重要的过程将是将vm的内容转换为string,即设置邮件内容,其他同上面并无差异

5.1 新建vm文件,命名为index.vm

Java代码  

  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <div>${user} </div>
  6. <div>${content}</div>
  7. </body>
  8. </html><SPAN style="BACKGROUND-COLOR: #ffffff; WHITE-SPACE: normal"> </SPAN>
<html>
	<head>
	</head>
	<body>
		<div>${user} </div>
		<div>${content}</div>
	</body>
</html> 

为了方便省略了html头定义。
其中${user} 为Velocity的语法,相当于一个变量,在java程序中可以设置这个变量的值在前端显示。

5.2 创建VelocityEngineFactoryBean对象,并设置属性

Java代码  

  1. // Velocity的参数,通过VelocityEngineFactoryBean创建VelocityEngine,也是推荐在配置文件中配置的
  2. Properties properties = System.getProperties();
  3. properties.put("resource.loader", "class");
  4. properties.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
  5. VelocityEngineFactoryBean v = new VelocityEngineFactoryBean();
  6. v.setVelocityProperties(properties);
// Velocity的参数,通过VelocityEngineFactoryBean创建VelocityEngine,也是推荐在配置文件中配置的
Properties properties = System.getProperties();
properties.put("resource.loader", "class");
properties.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
VelocityEngineFactoryBean v = new VelocityEngineFactoryBean();
v.setVelocityProperties(properties);

5.3 转换vm内容为普通String

Java代码  

  1. // 声明Map对象,并填入用来填充模板文件的键值对
  2. Map<String, String> model = new HashMap<String, String>();
  3. model.put("user", "ooo");
  4. model.put("content", "nihao");
  5. // Spring提供的VelocityEngineUtils将模板进行数据填充,并转换成普通的String对象
  6. String emailText = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "index.vm", model);
// 声明Map对象,并填入用来填充模板文件的键值对
Map<String, String> model = new HashMap<String, String>();
model.put("user", "ooo");
model.put("content", "nihao");
// Spring提供的VelocityEngineUtils将模板进行数据填充,并转换成普通的String对象
String emailText = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "index.vm", model);

这样我们便将vm中的变量值填充好,并且将内容转换为了string

5.4 设置邮件内容,同4

Java代码

  1. helper.setText(emailText, true);
helper.setText(emailText, true);

其他内容同上面的1、2、3过程。

注意:vm文件格式需要与邮件编码一致否则会出现乱码

时间: 2024-08-07 08:26:44

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板的相关文章

框架源码|Java、Spring、HTML5、JavaScript、jQuery、Web移动端

A.代码生成器(开发利器) 生成Java各层次的类和JSP等文件,提高开发效率 B.阿里巴巴数据库连接池Druid 性能最好的数据库连接池,稳定.可扩展.高性能.高并发 C.安全权限框架Shiro 实现认证.授权.加密.缓存.并发.会话管理.单点登录等功能 D.Ehcache二级缓存和Spring MVC静态加载缓存 E.微信接口开发 详尽的单元测试代码,详尽的开发文档,每个模块都有详尽说明和代码示例 F.提供基于JBPM工作流的OA办公系统(后续加入Activiti 5.18工作流) ----

Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.其实它可以被看作是RPC的Java版本.但是传统RPC并不能很好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用. RMI目前使用Java远程消息交换协议JRMP(Java Remot

[Java][web]利用Spring随时随地获得Request和Session

利用Spring随时随地获得Request和Session 一.准备工作: 在web.xml中添加 <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> 二.使用方法: 1.方法一:通过代码实现 HttpServletRequest request = ((ServletR

Spring+Velocity模板发送邮件

Spring+Velocity模板发送邮件 1.在eclipse中新建一个Java Project, 命名为spring-velocity-mail 2.在项目下新建一个lib目录,导入需要的jar包 依赖包如下: commons-collections-3.2.1.jar commons-lang-2.6.jar commons-logging-1.2.jar mail.jar spring-beans-3.2.2.jar spring-context-3.2.2.jar spring-con

利用Spring Roo搭建spring/springMVC/jpa(hibernate)

之前看spring实战的时候,书中提到spring roo工具,一直没有来得及尝试. 这次十一,我和女友一致认为前两天人太挤出去是受罪,于是就窝在了家里,就有了点时间来研究一下技术. 好了,言归正传 ,我比较懒,所以一直在寻找最简单的办法去完成一些事情. 对于框架集成也是如此 ,已经尝试过各种方法了,就是为了寻找更简单,实用. 本次是利用Spring Roo进行搭建,认为是目前最简单的了,并且Roo的配置几乎都是最佳实践. -------------------------------PART1

轻量级的Java 开发框架 Spring

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin

【转帖】如何利用Spring Cloud构建起自我修复型分布式系统

http://zhidao.baidu.com/link?url=tSKwdn3wr8KUxWMteHmneFtY0KoNZBMK9Xy-RimsdISA4h2neAecgHqggBipz2w6nXrvD3MmcPbiP5Q6ketfpz03gDLZRoh86p_eVa8bRpe 利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战. 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们也能轻松举出由其带来的诸多比较优

(转)利用Spring AOP自定义注解解决日志和签名校验

一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: boolean isValid = accountService.validSignature(appid, signature, client_signature); if (!isValid) return ErrorUtil.buildError(ErrorUtil.ERR_CODE_COM

[Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用

转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之外,也支持 JSR 168 Portlet 的开发.Spring Portlet MVC 框架尽可能多地继承了 Spring Servlet MVC 框架技术,使用了相同的底层表现层抽象和整合技术.同时,由于 JSR 168 Portlet 独特的工作流程,Spring Portlet MVC 框架