springboot邮件功能实现

Springboot spring-boot-starter-mail依赖实现发送邮件


情况一:发件人唯一,收件人自定义

使用包中 JavaMailSender 接口类

依赖导入

pom.xml

<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置文件

application.properties(application.yml)

这里以163邮箱为例,只要可以获取SMTP功能的邮箱都可以使用

.properties文件配置方式:
spring.mail.host=smtp.163.com(123.126.97.3)
//邮箱服务器地址或者IP地址,两者皆可,
//获取邮箱服务器地址的方法,直接通过搜索器搜索即可得到相应邮箱服务器地址,注意使用SMTP协议地址!
//获得邮箱服务器IP地址方法,在获得服务器地址之后,
//通过cmd命令: ping 邮箱服务器地址 可以获得
//IP地址和SMTP协议地址区别:IP地址更加直接。

//邮箱用户名 例如 talent_management@163.com
spring.mail.username=xxx@oo.com

//注意:这里不是邮箱密码,而是开启SMTP功能后获得的授权码,开启方法可自行搜索
spring.mail.password=xxxxxxx
//规定默认编码
spring.mail.default-encoding=UTF-8
//指定邮箱发送端口
spring.mail.port=465

//以下配置不知道有什么用
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=false
spring.mail.properties.mail.smtp.starttls.required=false
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false

//全局定义一个发送方邮箱地址,最好跟上方用户名相同
//通过@Value调用
mail.fromMail.addr=talent_management@163.com
#yml文件配置方式
spring:
mail:
host: 123.126.97.3 //邮箱服务器IP地址或地址,这里用的是163邮箱STMP地址对应IP

username: talent_management@163.com
password: xxxxx
default-encoding: UTF-8
port: 465
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
socketFactory:
port: 465
class: javax.net.ssl.SSLSocketFactory
fallback: false

#配置验证码邮件发送方
mail:
fromMail:
addr: talent_management@163.com

具体实现

MailService 接口和 MailServiceImpl实现

实现最简单的邮件发送

方法实现
@Service
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private JavaMailSender mailSender;

@Value("${mail.fromMail.addr}")
private String from;

//发送最基础邮件,只包含标题和内容
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);

try {
mailSender.send(message);
logger.info("简单邮件已经发送。");
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!", e);
}
}
}
测试发送简单邮件
@Test
void testSimpleMail() throws Exception {
String checkCode = String.valueOf(new Random().nextInt(899999) + 100000);
String message = " 【跨平台人才管理组织】验证码:" + checkCode + ",该验证码5分钟内有效,请勿泄露于他人!";
System.out.println(checkCode);
MailService.sendSimpleMail("1246426827@qq.com", "跨平台人才管理平台验证", message);
}

实现html页面发送(在上文件中加入该方法)

public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();

try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);

mailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
}
}
情况一:获取的数据直接是html文件的所有字符组成的字符串

可以直接使用上述方法

测试:
@Test
public void testHtmlMail() throws Exception {
String content = "<html>\n" +
"<body>\n" +
" <h3>这是一封Html邮件!</h3>\n" +
"</body>\n" +
"</html>";
MailService.sendHtmlMail("1246426827@qq.com", "test simple mail", content);
}
情况二,获取到的是html文件里的部分可自定义数据

需要将这些数据先填入html文件当中过后,再发送

案例:具有固定格式的验证码发送邮件实现

  • 需要添加的文件: 验证码邮件html页面:email_template.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8"/>
</head>

<body>
<div class="qmbox qm_con_body_content qqmail_webmail_only" id="mailContentContainer" style="">
<style type="text/css">
.qmbox body {
margin: 0;
padding: 0;
background: #fff;
font-family: "Verdana, Arial, Helvetica, sans-serif";
font-size: 14px;
line-height: 24px;
}

.qmbox div, .qmbox p, .qmbox span, .qmbox img {
margin: 0;
padding: 0;
}

.qmbox img {
border: none;
}

.qmbox .contaner {
margin: 0 auto;
}

.qmbox .title {
margin: 0 auto;
background: url() #CCC repeat-x;
height: 30px;
text-align: center;
font-weight: bold;
padding-top: 12px;
font-size: 16px;
}

.qmbox .content {
margin: 4px;
}

.qmbox .biaoti {
padding: 6px;
color: #000;
}

.qmbox .xtop, .qmbox .xbottom {
display: block;
font-size: 1px;
}

.qmbox .xb1, .qmbox .xb2, .qmbox .xb3, .qmbox .xb4 {
display: block;
overflow: hidden;
}

.qmbox .xb1, .qmbox .xb2, .qmbox .xb3 {
height: 1px;
}

.qmbox .xb2, .qmbox .xb3, .qmbox .xb4 {
border-left: 1px solid #BCBCBC;
border-right: 1px solid #BCBCBC;
}

.qmbox .xb1 {
margin: 0 5px;
background: #BCBCBC;
}

.qmbox .xb2 {
margin: 0 3px;
border-width: 0 2px;
}

.qmbox .xb3 {
margin: 0 2px;
}

.qmbox .xb4 {
height: 2px;
margin: 0 1px;
}

.qmbox .xboxcontent {
display: block;
border: 0 solid #BCBCBC;
border-width: 0 1px;
}

.qmbox .line {
margin-top: 6px;
border-top: 1px dashed #B9B9B9;
padding: 4px;
}

.qmbox .neirong {
padding: 6px;
color: #666666;
}

.qmbox .foot {
padding: 6px;
color: #777;
}

.qmbox .font_darkblue {
color: #006699;
font-weight: bold;
}

.qmbox .font_lightblue {
color: #008BD1;
font-weight: bold;
}

.qmbox .font_gray {
color: #888;
font-size: 12px;
}
</style>
<div class="contaner">
<div class="title">$(title)</div>
<div class="content">
<p class="biaoti"><b>亲爱的用户,你好!</b></p>
<b class="xtop"><b class="xb1"></b><b class="xb2"></b><b class="xb3"></b><b class="xb4"></b></b>
<div class="xboxcontent">
<div class="neirong">
<p><b>请核对你的用户名:</b><span id="userName" class="font_darkblue">$(userName)</span></p>
<p><b>$(type)的验证码:</b><span class="font_lightblue"><span id="yzm" data="$(captcha)"
onclick="return false;" t="7"
style="border-bottom: 1px dashed rgb(204, 204, 204); z-index: 1; position: static;">$(captcha)</span></span><br><span
class="font_gray">(请输入该验证码完成$(type),验证码30分钟内有效!)</span></p>
<div class="line">如果你未申请$(type)服务,请忽略该邮件。</div>
</div>
</div>
<b class="xbottom"><b class="xb4"></b><b class="xb3"></b><b class="xb2"></b><b class="xb1"></b></b>
<p class="foot">如果仍有问题,请拨打我们的会员服务专线: <span data="800-820-5100" onclick="return false;" t="7"
style="border-bottom: 1px dashed rgb(204, 204, 204); z-index: 1; position: static;">021-51875288
</span></p>
</div>
</div>
<style type="text/css">
.qmbox style, .qmbox script, .qmbox head, .qmbox link, .qmbox meta {
display: none !important;
}
</style>
</div>
</body>
</html>

上述页面需要填入的信息:title、userName、type、captcha

  • 文件转string
@Component
public class EmailTemplate {
public void initEmailTemplate() {
StringBuilder sb = new StringBuilder();
try {
String encoding = "UTF-8";

//默认是在resources目录下
ClassPathResource classPathResource = new ClassPathResource("templates/emailTemplate.html");

InputStream resourceAsStream = classPathResource.getInputStream();

//考虑到编码格式
InputStreamReader read = new InputStreamReader(
resourceAsStream, encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while ((lineTxt = bufferedReader.readLine()) != null) {
sb.append(lineTxt);
}

//设置系统的全局变量
System.setProperty("emailTemplate", sb.toString());

System.out.println("注入文件:"+sb.toString());
resourceAsStream.close();
read.close();
System.out.println("注入完成");
} catch (IOException e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
}
  • 信息填入
public String setHtmlString(String title, String userName, String type, String captcha) {
String emailTemplet = System.getProperty("emailTemplate");

emailTemplet = emailTemplet.replace("$(title)", title);
emailTemplet = emailTemplet.replace("$(userName)", userName);
emailTemplet = emailTemplet.replace("$(type)", type);
emailTemplet = emailTemplet.replace("$(captcha)", captcha);
return emailTemplet;
}
  • 测试:
@Autowired
private EmailTemplate emailTemplate;
@Test
public void testHtmlFileSend(){
emailTemplate.initEmailTemplate();
String content = emailTemplate.setHtmlString("title", "userName", "邮箱绑定", "验证码");
MailService.sendHtmlMail("1246426827@qq.com", "跨组织人才管理系统验证码", content);
}

实现带附件的邮件发送

方法实现
public void sendAttachmentsMail(String to, String subject, String content, String filePath){
MimeMessage message = mailSender.createMimeMessage();

try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);

FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);

mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送带附件的邮件时发生异常!", e);
}
}

添加多个附件可以使用多条 helper.addAttachment(fileName, file)

测试带附件的邮件发送
@Test
public void sendAttachmentsMail() {
String filePath="e:\\tmp\\application.log";
mailService.sendAttachmentsMail("1246426827@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}

实现带静态资源的邮件发送

方法实现
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
MimeMessage message = mailSender.createMimeMessage();

try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);

FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);

mailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
}
测试带静态资源的邮件发送
@Test
public void sendInlineResourceMail() {
String rscId = "111";
String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
String imgPath = "C:\\Users\\summer\\Pictures\\favicon.png";

mailService.sendInlineResourceMail("1246426827@qq.com", "有图片的邮件", content, imgPath, rscId);
}

情况二:发件人自定义,收件人自定义

使用包中 JavaMailSenderImpl 类

上述情况,我们是通过在 application.properties(application.yml)中全局的配置 host,username,password等属性

然后通过 JavaMailSender类中的接口 send() 进行邮件发送

JavaMailSenderImpl是JavaMailSender的实现类,内部声明了host,username,password,port,default-encoding等属性

情况二是通过使用该实现类来进行实时的配置属性,即在发送邮件的时候来对properties配置

依赖导入

同样是导入 spring-boot-starter-mail 包