要在网络上实现邮件功能,必须要有专门的邮件服务器。它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 这些邮件服务器类似于现实生活中的邮局。
1、电子邮件协议 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,
-
SMTP(Simple Mail Transfer Protocol)协议 SMTP即简单邮件传输协议,发送邮件的协议,默认端口为25 通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
-
POP3(Post Office Protocol 3)协议 POP3即邮局协议,接收邮件的协议,默认端口为110, 通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
-
IMAP(Internet Mail Access Protocol)协议 IMAP即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。
参考网易邮箱:什么是POP3、SMTP和IMAP?
这里使用 网易邮箱作为发送者来给 QQ邮箱发送邮件。 发送邮件之前,我们需要先获取 网易邮箱的授权码
。 在设置中,开启开启服务,短信验证之后,就会获取到授权码(网易这边只显示一次,记得保存好)。
1、创建 SpringBoot项目引入依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-mail
org.springframework.boot
spring-boot-starter-thymeleaf
2、YML配置邮件信息
spring:
mail:
# 邮件服务地址
host: smtp.163.com
# 默认端口25,可不写
port: 25
# 编码格式
default-encoding: utf-8
# 发送者用户名
username: xxx@163.com
# 授权码,刚才获取的代码
password: xxx
# 其它参数
# properties:
# mail:
# smtp:
# # 如果是用 SSL 方式,需要配置如下属性
# ssl:
# enable: true
# required: true
# # 邮件接收时间的限制,单位毫秒
# timeout: 10000
# # 连接时间的限制,单位毫秒
# connectiontimeout: 10000
# # 邮件发送时间的限制,单位毫秒
# writetimeout: 10000
当我们进行好 yml 配置后,SpringBoot使用MailSenderAutoConfiguration
会帮助我们自动配置 JavaMailSender。
Spring框架中用于Java邮件支持的接口和类组织如下:
-
MailSender interface:发送简单基础电子邮件的顶级接口;
-
JavaMailSender interface:是MailSender的子接口。它支持MIME消息,并且主要与MimeMessageHelper类一起用于创建MimeMessage。
-
JavaMailSenderImpl class:实现了JavaMailSender 的接口,它支持MimeMessage和SimpleMailMessage;
-
MailMessage interface:创建邮件消息的顶级接口;
-
SimpleMailMessage class:用于创建简单的邮件消息,包括from,to,cc,subject,text和sentDate等字段;
-
MimeMailMessage class:用于创建支持MIME的邮件消息,主要与MimeMessageHelper类一起用于创建MimeMessage;
-
MimeMessageHelper class:用于创建MIME消息的帮助类。它为HTML布局中的图像,典型邮件附件和文本内容提供支持等。
-
MimeMessagePreparator interface:提供一个回调接口,用于编写MIME消息;
3、创建邮件发送类 当我们进行好 yml 配置后,SpringBoot会帮助我们自动配置 JavaMailSender
,然后我们调用JavaMailSender
接口就实现操作发送邮件了。 下面写几种发送邮件的方式。
@Service
public class MailService {
private static final String SENDER = "xxx@163.com";
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
/**
* 发送普通邮件
*
* @param to 收件人
* @param subject 主题(标题)
* @param content 内容
*/
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(SENDER);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
System.out.println("发送普通邮件时发生异常!" + e);
}
}
/**
* 发送带附件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param fileList 附件
*/
public void sendFileMail(String to, String subject, String content, List fileList) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
if (fileList != null && fileList.size() > 0) {
for (File file : fileList) {
FileSystemResource fileSystemResource = new FileSystemResource(file);
String fileName = fileSystemResource.getFilename();
helper.addAttachment(fileName, fileSystemResource);
}
}
mailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送带附件的邮件时发生异常!" + e);
}
}
/**
* 发送HTML静态文件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param srcIdMap 需要替换的静态文件(给html中标记id不赋值的话,可以发送,但静态文件不会显示),可为null表示纯HTML文件
*/
public void sendHtmlMail(String to, String subject, String content, Map srcIdMap) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
//true指的是html邮件
helper.setText(content, true);
if (srcIdMap != null) {
for (Map.Entry entry : srcIdMap.entrySet()) {
FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
helper.addInline(entry.getKey(), file);
}
}
mailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送HTML静态文件的邮件时发生异常!" + e);
}
}
/**
* 发送Html模板的邮件
*
* @param to 收件人
* @param subject 主题
* @param emailInfoMap 模板的数据信息
*/
public void sendHtmlTemplateMail(String to, String subject, Map emailInfoMap) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setSentDate(new Date());
// 设置参数, 也可以单独设置c ontext.setVariable("userName", "赵云");
org.thymeleaf.context.Context context = new Context();
context.setVariables(emailInfoMap);
//设置模板,emailTemplate为html文件的文件名,emailTemplate.html或emailTemplate都可以
helper.setText(templateEngine.process("emailTemplate", context), true);
mailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送Html模板的邮件!" + e);
}
}
}
4、在resources/templates目录中新建一个 emailTemplate.html模板文件,由于发送模板邮件
DOCTYPE html>
邮件模板
xx公司邀请你投递简历
姓 名
性 别
出生日期
职位
公司官网
期待你的加入
5、在测试类中测试
@SpringBootTest
class Email163ApplicationTests {
@Autowired
private MailService mailService;
private static final String TO = "110xxx@qq.com";
@Test
public void testSendSimpleMail(){
String subject = "测试普通邮件";
String content = "testSendSimpleMailMessge content";
mailService.sendSimpleMail(TO, subject, content);
}
@Test
public void testSendFileMail(){
String subject = "测试带附件的邮件";
String content = "testSendFileMailMessge content";
List fileList = new ArrayList();
fileList.add(new File("D:\\E\\电脑壁纸\\11.jpg"));
fileList.add(new File("D:\\E\\电脑壁纸\\JD导入.xlsx"));
mailService.sendFileMail(TO, subject, content, fileList);
}
@Test
public void testSendHtmlMail(){
String subject = "测试HTML静态文件的邮件";
String htmlContent = "testSendSimpleMailMessge contentn内容,图片1
图片2
";
Map srcIdMap = new HashMap(2);
srcIdMap.put("pic1", "D:\\E\\电脑壁纸\\11.jpg");
srcIdMap.put("pic2", "D:\\E\\电脑壁纸\\charge.jpg");
mailService.sendHtmlMail(TO, subject, htmlContent, null);
}
@Test
public void testSendHtmlTemplateMail(){
String subject = "发送Html模板的邮件";
Map map = new HashMap(4);
map.put("userName","赵云");
map.put("sex","男");
map.put("birthday", new Date());
map.put("office","打野");
mailService.sendHtmlTemplateMail(TO, subject, map);
}
}
参考文章: Spring Boot 官方文档之 Sending Email
—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。