邮件是我们项目中经常会用到的功能,比如发送验证码或者发送通知等。springboot也提供了相应的springboot-starter方便开发者使用。
本文就是记录如何使用qq邮箱给指定用户发送邮件,其他邮箱类似。
准备工作
1. qq邮箱配置及授权码获取
-
登录qq邮箱,网页地址: qq邮箱登录
-
在页面头部找到设置,进入账号tab
-
找到POP3/IMAP/SMTP模块,如下所示
-
开启服务并记录授权码
-
2. springboot项目创建及spring-boot-starter-mail引入
新建springboot项目并加入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
开始CODING
1. 邮箱发送邮件的配置
application-mail.yml
spring:
mail:
protocol: smtp
host: smtp.qq.com
port: 587
username: 发件人的邮箱地址
password: 准备工作中得到的授权码
default-encoding: UTF-8
properties:
mail:
# 这里debug设置为true的话会打印出详细的发送邮件过程中的日志
debug: true
smtp:
auth: true
starttls:
enabled: true
required: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
fallback: false
2.发送邮件的方法
package com.zjtx.email.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
/**
* 邮件发送工具类
*
* @author wuxiaobing
* @date 2022年10月21日13:10
*/
@Component
public class EmailUtils {
// 发送邮件服务
@Autowired
private JavaMailSender javaMailSender;
// 发送者
@Value("${spring.mail.username}")
private String from;
/**
* 发送简单文本邮件
* @param subject 主题
* @param content 内容
* @param to 收件人列表
* @author BillDowney
* @date 2022年10月21日13:35
*/
public void sendSimpleMail(String subject, String content, String... to) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setSubject(subject);
message.setText(content);
message.setTo(to);
javaMailSender.send(message);
}
}
3.结果验证
编写测试接口,新建类EmailTestController
package com.zjtx.email.controller;
import com.zjtx.email.utils.EmailUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author wuxiaobing
* @date 2022年10月21日14:12
* @description:
*/
@RestController
@RequestMapping("email")
public class EmailTestController {
@Resource
private EmailUtils emailUtils;
@GetMapping("/sendMailTest")
public String sendMailTest() {
emailUtils.sendSimpleMail("测试邮件发送", "这是一封测试邮件的内容.......", "xxx@126.com");
return "mail send success";
}
}
启动项目,通过浏览器访问该接口,可以看到控制台打印日志如下:
同时浏览器显示"mail send success",表示邮件发送成功,当然也可以去收件邮箱查看。
关于收发邮件的那些事儿
简单的发送邮件操作中间涉及到如下角色:
- 邮件客户端
- 邮件发送服务端 发送操作 SMTP协议 SMTP服务器
- 邮件接收服务器 接收 POP3协议、POP3服务器、IMAP协议、IMAP服务器
发送邮件端遵循的是SMTP协议的服务器,也叫作SMTP服务器。
接收邮件的可以遵循POP3协议叫做POP3服务器,也可以遵循IMAP协议,叫做IMAP服务器。
我们再来了解下这三种协议以及它们之间的区别和联系吧:
POP(Post Office Protocol, 邮局通讯协定)是互联网上的一种通讯协议。
当我们发送邮件时,对方可能会不在线上,所以邮件服务器必须为对方保存数据,直档收信人收信的时候,必须通过POP通讯协定,才能取得邮件。
SMTP(Simple Mail Transfer Protocol, 简易邮件传输通讯协议) 也是互联网上的一种通讯协议。
它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP是一个“推”的协议,它不允许根据需要从远程服务器上“拉”来消息。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。其实简单的说,POP服务器是用来收信的,而且每个E_mail地址一般只有一个。如果你要同时收取多个邮箱的信件,就必须挨个设置每个邮箱的POP服务器地址,这个地址在邮箱网站上可以找到。至于SMTP服务器,可以理解为就是用来寄信的,而且大多数SMTP服务器也是免费的,也就是说,如果你只是发送邮件就只需要配置好一个SMTP服务器就可以了。
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理服务器上的电子邮件。,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
与POP3拥有同样功能的是IMAP协议,IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,是一个应用层协议(端口是143)。用来从本地邮件客户端(Outlook Express、Foxmail、Mozilla Thunderbird等)访问远程服务器上的邮件。它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
简单来说, SMTP服务器是发信的,POP3和IMAP服务器是接收邮件的,同时POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题, 整体上为用户带来更为便捷和可靠的体验
以上就是本文的所有内容,希望帮助到需要的同学,有任何疑问可以留言交流。