016_Spring中电子邮件

1. Spring提供了一个实用的发送电子邮件库, 它为使用者屏蔽了邮件系统的底层细节和客户端的底层资源处理。

2. 依赖库: 使用Spring框架的邮件功能需要将JavaMail的Jar包添加到依赖中。

3. Spring邮件相关功能在spring-context-support-4.2.4.RELEASE.jar下的org.springframework.mail包中

4. 其中MailSender是发送邮件的核心接口, JavaMailSenderImpl是核心接口的重要实现类

5. 其中MailMessage是邮件的核心接口, SimpleMailMessage类是对邮件属性(发件人、收件人以等)进行简单的封装。

6. 例子

6.1. 创建一个名为SpringJavaMail的Java项目, 添加相关jar包

6.2. 添加几个文件

6.3. 在src目录下创建mail.properties

6.4. 在src目录下创建applicationContext.xml

 6.5. 编辑SimpleMail.java

package com.zr.mail;

import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * 发送纯文本邮件
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SimpleMail {
	@Resource(name="javaMailSenderImpl")
	private JavaMailSenderImpl javaMailSenderImpl;

	@Test
	public void sendMail() {
		SimpleMailMessage templateMessage = new SimpleMailMessage();
		templateMessage.setFrom("xxxxxxxxxx@qq.com");
		templateMessage.setTo("ooooooooo@qq.com");
		templateMessage.setSubject("测试Spring中电子邮件");
		templateMessage.setText("SimpleMailMessage只能发送纯文字");
		
		javaMailSenderImpl.send(templateMessage);
	}
	
}

7. 使用MimeMessageHelper

7.1. org.springframework.mail.javamail.MimeMessageHelper是一个处理JavaMail消息的好工具, 它屏蔽了很多JavaMail API的细节, 所以使用MimeMessageHelper可以很简便的创建一个MimeMessage。

JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl();
MimeMessage message = javaMailSenderImpl.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
javaMailSenderImpl.send(message);

7.2. 邮件允许添加附件和内联资源。嵌入资源是你嵌入到邮件中的图片或样式,但又不希望显示为附件。

7.3. 嵌入资源需要使用contentId添加到MIME消息中。文本和嵌入资源添加是有顺序的, 需要按照先添加文本, 再添加嵌入资源的顺序。否则, 它将不会工作。邮件内容内嵌的图片addInline中的contentId要和邮件内容中的cid相对应。

MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setText("<html><body><img src='cid:ani_08' /><br />邮件包含文字、图片和文件</body></html>", true);
FileSystemResource res = new FileSystemResource(new File("config/ani_08.png"));
helper.addInline("ani_08", res);

7.4. 添加附件

MimeMessageHelper helper = new MimeMessageHelper(message, true);
MimeBodyPart file = new MimeBodyPart();
file.attachFile("config/ActiveMQ中文教程参考手册.pdf");
helper.getRootMimeMultipart().addBodyPart(file);

7.5. 编辑MailHelper.java

package com.zr.mail;

import java.io.File;
import java.io.IOException;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * 发送带图片和文件的邮件
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MailHelper {
	@Resource(name="javaMailSenderImpl")
	private JavaMailSenderImpl javaMailSenderImpl;
	
	@Test
	public void sendMail() {
		try {
			MimeMessage message = javaMailSenderImpl.createMimeMessage();
			// 发送带附件和内联元素的邮件需要将第二个参数设置为true
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
			// 发送方邮箱和配置文件中的mail.username要一致
			helper.setFrom("xxxxxxxxxxx@qq.com");
			// 接收方
			helper.setTo("oooooooooooo@qq.com");
			// 主题
			helper.setSubject("测试Spring中电子邮件");
			// 邮件内容
			helper.setText("<html><body><img src='cid:ani_08' /><br />发送文本、图片和文件</body></html>", true);
			// 邮件内容内嵌的图片addInline中的contentId要和邮件内容中的cid相对应
			FileSystemResource res = new FileSystemResource(new File("config/ani_08.png"));
			helper.addInline("ani_08", res);
			// 邮件附件, JavaMail 1.6,2版本使用MimeBodyPart的attachFile方法才不会有中文乱码
			MimeBodyPart file = new MimeBodyPart();
			file.attachFile("config/ActiveMQ中文教程参考手册.pdf");
			helper.getRootMimeMultipart().addBodyPart(file);
			
			javaMailSenderImpl.send(message);
		} catch (MailException | MessagingException | IOException e) {
			e.printStackTrace();
		}
	}
}

8. 使用模板库创建电子邮件内容

8.1. 在简单的情况下, 像前面例子那样使用API就可以满足我们的需要了。

8.2. 在典型的企业应用程序中, 下面的原因让你不定会使用上面的方法创建你的邮件内容。

8.2.1. 在Java代码中创建HTML的电子邮件内容冗长, 且容易出错。

8.2.2. 呈现逻辑和业务逻辑混杂。

8.2.3. 更改电子邮件内容的展示结构需要编写Java代码, 重新编译, 重新部署。

8.3. 通常解决方法是使用模板框架定义电子邮件的呈现逻辑, 如FreeMarker。分离呈现逻辑和业务逻辑使得你的代码更清晰。当你的邮件的内容变的复杂时, 这绝对是一个最佳实践, 而且Spring框架对FreeMarker有很好的支持。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值