来进行一个SpringBoot项目的实战,发送一下邮件,这里我们先了解一下邮件的协议

邮件协议

  1. SMTP协议:简单邮件传输协议 (Simple Mail Transfer Protocol),邮件从一台服务器传送到另一台服务器
  2. POP3协议:邮局协议版本3(Post Office Protocol - Version 3),将邮件从服务器下载下来,服务器端邮件删除
  3. IMAP协议:邮件访问协议(Internet Mail Access Protocol),将邮件从服务器下载下来,服务器端邮件保留,并且和客户端状态保持一致
  4. Mime协议:多用途互联网邮件扩展类型(Multipurpose Internet Mail Extensions),使二进制传输变简单

引入邮件包

使用Maven引入mail包

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

创建邮件类和测试类,写yml文件

创建一个邮件类:MailService,在类上右键,Go To Test就可以创建测试类了。内容待会慢慢讲,我们先来配置一下配置文件,默认的是application.properties,我比较喜欢yml,所以改为yml,如下:

spring:
mail:
host: smtp.qq.com
username: shuyunquan@qq.com
password: *******************
default-encoding: utf-8

host就是啥邮箱,如果是网易的话就自己改为smtp.163.com,其他的就自己改

username就是你的邮箱账号

password是授权码,不是你邮箱的密码,是授权码,在邮箱里面可以获取到,我打码了

最后的编码格式没啥讲的

文本邮件,HTML邮件,附件邮件,图片邮件

package com.vae.springboot.study.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service; import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File; @Service
public class MailService { @Value("${spring.mail.username}")
private String form; @Autowired
private JavaMailSender mailSender; //文本邮件
public void sendSimpleMail(String to,String subject,String content){
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
simpleMailMessage.setTo(to);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(form);
mailSender.send(simpleMailMessage);
} //HTML邮件
public void sendHTMLMail(String to,String subject,String content) throws MessagingException {
MimeMessage mimeMessage=mailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
helper.setFrom(form);
mailSender.send(mimeMessage);
} //附件邮件
public void sendAttachmentMail(String to,String subject,String content,String filePath) throws MessagingException {
MimeMessage mimeMessage=mailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
helper.setFrom(form);
FileSystemResource file=new FileSystemResource(new File(filePath));
String fileName=file.getFilename();
helper.addAttachment(fileName,file);
//helper.addAttachment(fileName+"02",file); 如果是多个附件的话,可以这样写。但是开发中一般都是把filepath做成一个数组,这样在这里遍历就可以了
//helper.addAttachment(fileName+"03",file); mailSender.send(mimeMessage);
} //图片邮件
public void sendInlineResourceMail(String to,String subject,String content,String rscPath,String rscId) throws MessagingException {
MimeMessage mimeMessage=mailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
helper.setFrom(form);
FileSystemResource file=new FileSystemResource(new File(rscPath));
helper.addInline(rscId,file); mailSender.send(mimeMessage);
}
}

都写在这里了,没什么好讲的,测试类也很简单

package com.vae.springboot.study.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.context.Context; import javax.annotation.Resource;
import javax.mail.MessagingException; @RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest { @Resource
MailService mailService; @Test
public void MailTest(){
mailService.sendSimpleMail("发给别人@qq.com","文本","这是文本邮件");
} @Test
public void HtmlMailTest() throws MessagingException {
String content="<html><body><h3>我是html邮件</h3></body></html>";
mailService.sendHTMLMail("发给别人@qq.com","HTML",content);
} @Test
public void AttachmentsMailTest() throws MessagingException {
String filePath="D:\\error.2019-02-10.log";
mailService.sendAttachmentMail("发给别人@qq.com","附件","这个是附件邮件",filePath);
} @Test
public void InlineResourceMailTest() throws MessagingException {
String imagePath="D:\\Vae.JPG";
String rscId="Vae";
String content="<html><body>这是图片邮件<img src=\'cid:"+rscId+"\'></img></body></html>";
mailService.sendInlineResourceMail("发给别人@qq.com","图片",content,imagePath,rscId);
} }

模板邮件

邮件模板这里使用到了thymeleaf技术,上次学的技术终于有一个用处用到了,我们在templates文件夹下面新建一个名为EmailTemplate.html的文件,内容如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件模板</title>
</head>
<body>
您好,感谢您的注册,这是一封验证邮件,请点击下方链接进行激活,感谢您的支持<br>
<a href="#" th:href="@{https://www.cnblogs.com/yunquan/?id={id}(id=${id})}">激活账户</a>
</body>
</html>

Nice啊,然后直接在测试类中开战吧,部分代码如下:

    @Resource
TemplateEngine templateEngine;
@Test
public void EmailTemplateTest() throws MessagingException {
Context context=new Context();
context.setVariable("id","001");
String emailContent=templateEngine.process("EmailTemplate",context);
mailService.sendHTMLMail("她的邮箱@qq.com","模板邮件",emailContent);
}

点击测试方法运行,结果Nice啊

异常处理

上面写的代码里面我都是把异常直接抛出去了,我之前讲过,异常的throw和return是一样的,都是抛给了上一级,我们的邮件异常不应该抛给上一级的,你错了不能影响我主要程序的运行,有啥错误自己处理就好了。这里我们可以使用try,catch然后错误的详细情况使用日志系统记录下来就可以了,这里不写代码了,很简单

SpringBoot实战一:发送邮件的更多相关文章

  1. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

  2. C蛮的全栈之路-node篇(二) 实战一:自动发博客

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  3. 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker

    Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  4. 机器学习实战一:kNN手写识别系统

    实战一:kNN手写识别系统 本文将一步步地构造使用K-近邻分类器的手写识别系统.由于能力有限,这里构造的系统只能识别0-9.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:32像素*3 ...

  5. zookeeper curator ( 实战一)

    目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...

  6. Netty聊天器(实战一):从0开始实战100w级流量应用

    Java 聊天程序(百万级流量实战一):系统介绍 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之14 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在前面 ...

  7. 【k8s实战一】Jenkins 部署应用到 Kubernetes

    [k8s实战一]Jenkins 部署应用到 Kubernetes 01 本文主旨 目标是演示整个Jenkins从源码构建镜像到部署镜像到Kubernetes集群过程. 为了简化流程与容易重现文中效果, ...

  8. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  9. SpringBoot入门 (十) 发送邮件

    本文记录学习在SpringBoot中发送邮件. 一 邮件发送过程 发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到.完整的一个邮件发送过程主要包含以下几个步骤: ...

随机推荐

  1. 洛谷P2320鬼谷子的钱袋.

    题目 这个题考察二进制分解. \(Code\) #include <bits/stdc++.h> #pragma GCC optimize(2) #pragma GCC optimize( ...

  2. 洛谷P1582 倒水题解

    题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明 ...

  3. 【XSY2707】snow 线段树 并查集

    题目描述 有\(n\)个人和一条长度为\(t\)的线段,每个人还有一个工作范围(是一个区间).最开始整条线段都是白的.定义每个人的工作长度是这个人的工作范围中白色部分的长度(会随着线段改变而改变).每 ...

  4. hdu 2191 (多重背包二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...

  5. ssh-keygen适用场景与rsync使用id_rsa技巧

    ssh-keygen工具可以实现免密码登录服务器可参考之前的blog:http://www.cnblogs.com/Mrhuangrui/p/4565333.html写的比较粗糙 原理说明使用ssh- ...

  6. hihoCoder #1646 : Rikka with String II(容斥原理)

    题意 给你 \(n\) 个 \(01\) 串 \(S\) ,其中有些位置可能为 \(?\) 表示能任意填 \(0/1\) .问对于所有填法,把所有串插入到 \(Trie\) 的节点数之和(空串看做根节 ...

  7. stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误

    @2019-01-24 [小记] 在学习 rt-thread BSP制作过程中,发现文件<stm32f1xx_hal.h>中 Env工具生成的原始顺序 1. #include " ...

  8. 解决SSH连接出现 Software caused connection abort 的问题

    修改服务器中/etc/ssh/sshd.config 文件,将LoginGraceTime的值设为0,默认为2m,TCPKeepAlive 设为yes, 然后使用service sshd restar ...

  9. cf1061E Politics (费用流)

    看到数据范围,考虑网络流..但考的时候完全不知道怎么建图 考虑流量表示选的点个数,费用表示选点的收益,跑最大费用最大流 那么我用一个点x表示某树中的询问点x,刨去它子孙询问点的子树后的子树 对于树1, ...

  10. luogu5019 [NOIp2018]铺设道路 (贪心)

    和NOIp2013 积木大赛一模一样 我在堆一格的时候,我把它尽量地往右去延伸 于是如果对于一个i,a[i-1]<a[i],那i在之前一定只堆过a[i-1]那么多,所以要再堆a[i]-a[i-1 ...