Java实现Email发送

一、前言

最近将项目的登录密码从图形验证码改为了短信验证码,同时也将忘记密码时长度进行了修改,在修改时,想到了之前在一些国外的网站上,使用过邮箱接收验证码的情况,故想到何妨不自己尝试整合一下Java程序发送邮件信息呢,所以动手整合了Email的发送实例。

二、Email发送协议

想要在互联网上提供电子邮件功能,必须要有专门的电子邮件服务器来进行邮件的收发,互联网用户日常都是使用对外免费使用的电子邮件服务器,例如163,新浪,qq邮箱等等。他们主要使用的是两种协议来实现接收用户投递的邮件,并把邮件发送给指定的接收人,传输协议主要有两种

2.1 SMTP协议

用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

2.2 POP3协议

同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

三、整合邮件发送

通过简单介绍,想要进行邮件的发送,使用SMTP协议发送给邮件服务器,即可完成邮件的发送。Java 提供了javax.mail包,开发者可使用此包完成邮件的发送,Spring同样将javax.mail包整合到了spring-boot-starter-mail包中,开发者可通过maven依赖,更简单的完成邮件的发送配置及内容发送的开发,此次使用SpringBooot整合email工具。

整合框架:SpringBoot

所用邮箱:163邮箱

3.1 引入POM文件依赖

1
2
3
4
5
<!-- 邮件发送依赖添加  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

3.2 全局配置文件(application.properties)增加email配置

授权码为邮箱设置中心的客户端授权码,不是自己的登录密码,一定要确认

1
2
3
4
5
6
7
8
9
10
11
12
#服务器端口
server.port=8088
#指定server绑定的地址
server.address=0.0.0.0
#应用上下文
server.context-path=/emailSv
#邮箱的SMTP服务器
spring.mail.host=smtp.163.com
#密码是邮箱设置的授权密码.不是邮箱的登录密码
spring.mail.password=xxxxxx
#这个是你的邮箱
spring.mail.username=xxxxx@163.com

3.3 编写发送代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.yang.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.*;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;


@RestController
@RequestMapping("/sendEmail")
public class SendEmailController {
@Autowired
private JavaMailSender mailSender;

/**
* 发送文字邮件
* @param content
* @return
*/
@RequestMapping(value = "/send", method = RequestMethod.GET)
public String send(@RequestParam("content") String content) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("xxx@163.com");
helper.setSubject("Java程序发送邮件");
helper.setText(content);
//设置多个收件人地址 多个地址可以通过,隔开,详细参考new InternetAddress().parse方法
InternetAddress[] internetAddressTo = new InternetAddress().parse("xxx@qq.com,1234@163.com");
mimeMessage.setRecipients(MimeMessage.RecipientType.TO,internetAddressTo);
//设置多个抄送人地址 多个地址可以通过,隔开,详细参考new InternetAddress().parse方法
InternetAddress[] internetAddressCC = new InternetAddress().parse("xxxsss@126.com,sassa@163.com");
mimeMessage.setRecipients(MimeMessage.RecipientType.CC,internetAddressCC);
mimeMessage.saveChanges();
mailSender.send(mimeMessage);
return "发送成功";
}catch (Exception e){
e.printStackTrace();
return "发送失败";
}
}

/**
* 发送携带附件的邮件
* @return
* @throws MessagingException
*/
@RequestMapping("/sendFile")
public String sendFile() throws MessagingException{
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//自己的邮箱地址
helper.setFrom("xxx@163.com");
//收件人地址
helper.setTo("xxx@qq.com");
//主题
helper.setSubject("主题:发送附件邮件");
//附件地址
helper.setText("请查看附件。");
FileSystemResource file1 = new FileSystemResource(new File("d:\\a.txt"));
FileSystemResource file2 = new FileSystemResource(new File("d:\\b.txt"));
helper.addAttachment("省份SQL.txt", file1);
helper.addAttachment("市级SQL.txt", file2);
try {
mailSender.send(mimeMessage);
return "带附件的邮件已发送。";
} catch (Exception e) {
return "带附件的邮件发送失败。";
}
}
}

3.4 接口响应结果

3.5 邮箱接收结果

3.5 下载地址

点我下载