SpringBoot发送邮件附件(超详细讲解)
现在发送邮件是一个网站必备的功能,比如注册激活,或者忘记密码等等都需要发送邮件。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。也就是我们使用SpringBoot来发送邮件的话,代码就简单许多,毕竟SpringBoot是开箱即用的 ,它提供了什么,我们了解之后觉得可行,就使用它,自己没必要再写原生的。
发送邮件流程图
在这里插入图片描述现在的Java项目大多都是按照MVC架构模型来开发的,但是这里不使用Controller层,是直接在测试中发送邮件,假如测试中发送邮件成功,那么改为用户发送请求来发送邮件也会成功。发送邮件,也就是要有发送方和接收方,我们需要在系统中配置发送方的信息,而接受方的信息我们需要根据从客户端发来的请求决定。作为发送方的我们,需要被授权,被谁授权?
- 假如我使用QQ邮箱发送邮件,那么我就需要开启QQ邮箱授权码。
- 假如我使用网易邮箱发送邮件,那我就需要开启网易邮箱授权码。
我们接下来就一 一开启这两个邮箱的授权码
-
开启QQ邮箱授权码
在这里插入图片描述 -
开启网易邮箱授权码
在这里插入图片描述
上图的步骤都会生成授权码,我们需要记住它,可以选择保存在本地电脑上,因为我们接下来配置发送方信息需要授权码。
接下来我们就开始编写代码发送邮件,我们使用IDEA创建SpringBoot项目,下篇博客可以快速了解如何在IDEA中创建SpringBoot项目。
SpringBoot快速入门
导入依赖
spring-boot-starter-mail
:这个启动器内部封装了发送邮件的代码,必须引入的。
spring-boot-starter-web
:这个启动器整合了JavaWeb常用的功能,如果只是简单在测试中发送邮件,那么就不需要引入它。
spring-boot-starter-thymeleaf
:模板引擎依赖,如果需要将数据渲染到页面上,就需要引入它。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置发送方信息
我们需要在SpringBoot配置文件(application.yml)中配置发送方的信息,包括以下信息:
- 用户名:也就是我们的邮箱账号
- 密码:我们刚刚生成的授权码
- 邮箱主机:配置使用哪个邮箱服务器发送邮件
还有等等其他可选配置,在下面配置代码中,大家需要填写自己的用户名、密码、from(和用户名一样)。
QQ邮箱配置
spring:
mail:
host: smtp.qq.com #发送邮件服务器
username: #发送邮件的邮箱地址
password: #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
properties.mail.smtp.port: 465 #端口号465或587
from: # 发送邮件的地址,和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
网易邮箱配置
spring:
mail:
host: smtp.163.com #发送邮件服务器
username: #发送邮件的邮箱地址
password: #客户端授权码,不是邮箱密码,网易的是自己设置的
properties.mail.smtp.port: 994 #465或者994
from: # 发送邮件的地址,和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
EmailService
我们需要自己封装邮件服务,这个服务只是便于Controller层调用,也就是根据客户端发送的请求来调用,封装三种邮件服务
- 发送普通文本邮件
- 发送HTML邮件:一般在注册激活时使用
- 发送带附件的邮件:可以发送图片等等附件
public interface EmailService {
/**
* 发送文本邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
void sendSimpleMail(String to, String subject, String content);
/**
* 发送HTML邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
void sendHtmlMail(String to, String subject, String content);
/**
* 发送带附件的邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param filePath 附件
*/
public void sendAttachmentsMail(String to, String subject, String content, String filePath);
}
EmailServiceImpl
我们需要实现上面的邮件服务,在具体的实现里面,则是调用了SpringBoot提供的JavaMailSender(封装了发送邮件的代码)。
@Service
public class EmailServiceImpl implements EmailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender javaMailSender;
//注入配置文件中配置的信息——>from
@Value("${spring.mail.from}")
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);
//发送邮件
javaMailSender.send(message);
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(to);
message.setSubject(subject);
messageHelper.setText(content,true);
javaMailSender.send(message);
logger.info("邮件已经发送!");
} catch (MessagingException e) {
logger.error("发送邮件时发生异常:"+e);
}
}
@Override
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//携带附件
FileSystemResource file = new FileSystemResource(filePath);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
messageHelper.addAttachment(fileName,file);
javaMailSender.send(message);
logger.info("邮件加附件发送成功!");
} catch (MessagingException e) {
logger.error("发送失败:"+e);
}
}
}
EmailServiceTest
我们直接在测试中发送邮件,如果测试中发送邮件没问题,那么转为用户请求发送邮件也没有问题的。
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest{
@Autowired
private EmailService emailService;
@Test
public void sendSimpleEmail(){
String content = "你好,恭喜你...";
emailService.sendSimpleMail("XXX@qq.com","祝福邮件",content);
}
@Test
public void sendMimeEmail(){
String content = "<a href='https://blog.csdn.net/'>你好,欢迎注册网站,请点击链接激活</a>";
emailService.sendHtmlMail("XXX@163.com","激活邮件",content);
}
@Test
public void sendAttachment(){
emailService.sendAttachmentsMail("XX@qq.com","发送附件","这是Java体系图","F:/图片/爱旅行.jpg");
}
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样我们就实现了提供Java代码来发送邮件。发送附件功能其实就是读取我们本地电脑的文件,然后添加到发送流中即可。
发送邮件附件的源代码