一、简介
发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。SpringBoot实现邮件功能是非常的方便快捷的,因为SpringBoot默认有starter实现了Mail。
基本协议:
SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。
IMAP全称为Internet Message Access Protocol(互联网邮件访问协议),IMAP允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。
POP3全称为Post Office Protocol 3(邮局协议),POP3支持客户端远程管理服务器端的邮件。POP3常用于“离线”邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。
IMAP和POP3协议区别?
两者最大的区别在于,IMAP允许双向通信,即在客户端的操作会反馈到服务器上,例如在客户端收取邮件、标记已读等操作,服务器会跟着同步这些操作。而对于POP协议虽然也允许客户端下载服务器邮件,但是在客户端的操作并不会同步到服务器上面的,例如在客户端收取或标记已读邮件,服务器不会同步这些操作。
二、Maven依赖
<!--email-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
三、配置
# JavaMailSender 邮件发送的配置(qq邮箱的配置)
spring.mail.host=smtp.qq.com
spring.mail.username=用户qq邮箱
#QQ邮箱的授权码
spring.mail.password=授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
在QQ邮箱获取授权码,授权码不是密码。


四、简单邮件
@Autowired
private JavaMailSenderImpl mailSender;//注入邮件工具类
@Test
public void sendMail(){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮件发送人
simpleMailMessage.setFrom("xxx@qq.com");
//邮件接收人
simpleMailMessage.setTo("xxxx@163.com");
//邮件主题
simpleMailMessage.setSubject("测试");
//邮件内容
simpleMailMessage.setText("邮件发送测试");
mailSender.send(simpleMailMessage);
}

五、复杂邮件
1.MimeMessage:该类是个能理解MIME类型和头的电子邮件消息
2.MimeMultipart:该类定义了增加、删除以及获取邮件不同部分内容的方法
3.MimeBodyPart:该对象代表一个MimeMessage对象内容的一部分。每个MimeBodyPart被认为有两部分:MIME类型和匹配这个类型的内容。
附件目录:

- 发送测试
@Autowired
private JavaMailSenderImpl mailSender;//注入邮件工具类
@Test
public void sendMail(){
String path = this.getClass().getClassLoader().getResource("./").getPath();
// TODO 1. 创建Message
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
// TODO 2.设置收信人
mimeMessage.addRecipients(Message.RecipientType.TO, "houjianjun88@163.com");
// 抄送
// mimeMessage.addRecipients(Message.RecipientType.CC, "xxxxx@qq.com");
mimeMessage.setFrom("474177818@qq.com"); // 邮件发送人
mimeMessage.setSubject("测试邮件主题"); // 邮件主题
// TODO 3. 添加附件
// 设置整封邮件的MIME消息体为混合的组合关系
MimeMultipart mixed = new MimeMultipart("mixed");
mimeMessage.setContent(mixed);
MimeBodyPart attach1 = new MimeBodyPart(); // 创建附件1
MimeBodyPart attach2 = new MimeBodyPart(); // 创建附件2
MimeBodyPart content = new MimeBodyPart(); // 创建邮件正文
mixed.addBodyPart(attach1);// 将附件一添加到MIME消息体中
mixed.addBodyPart(attach2);// 将附件二添加到MIME消息体中
mixed.addBodyPart(content);// 将正文添加到消息体中
FileDataSource fds1 = new FileDataSource(new File(path+"/images/001.png"));//构造附件一的数据源
DataHandler dh1 = new DataHandler(fds1);// 数据处理
attach1.setDataHandler(dh1); // 设置附件一的数据源
attach1.setFileName("001.png");// 设置附件一的文件名
// 附件二的操作与附件一类似,这里就不一一注释了
FileDataSource fds2 = new FileDataSource(new File(path+"/images/项目测评表(1).xlsx"));
DataHandler dh2 = new DataHandler(fds2);
attach2.setDataHandler(dh2);
// 设置文件名时,如果有中文,可以通过MimeUtility类中的encodeText方法进行编码,避免乱码
attach2.setFileName(MimeUtility.encodeText("项目测评表.xlsx"));
// 设置正文的MIME类型
MimeMultipart bodyMimeMultipart = new MimeMultipart("related");
// 将bodyMimeMultipart添加到正文消息体中
content.setContent(bodyMimeMultipart);
// 正文的HTML部分
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("<h1>Hello大家好,这是一封测试邮件<img src='cid:002.jpeg'/></h1>","text/html;charset=utf-8");
MimeBodyPart picPart = new MimeBodyPart();//正文的图片部分
DataHandler dataHandler = new DataHandler(new FileDataSource(path+"/images/002.jpeg"));
picPart.setDataHandler(dataHandler);
picPart.setContentID("002.jpeg");
// 将正文的HTML和图片部分分别添加到bodyMimeMultipart中
bodyMimeMultipart.addBodyPart(bodyPart);
bodyMimeMultipart.addBodyPart(picPart);
// 保存消息
mimeMessage.saveChanges();
mailSender.send(mimeMessage);
} catch (MessagingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
-
测试结果
测试结果
