介绍
邮件发送功能原理主要基于客户端和服务器之间的通信,涉及多个步骤和协议的支持,以确保邮件能够安全、可靠地传送。
邮箱服务器:邮件服务器是一种用来负责电子邮件收发管理的设备。
协议
- SMTP:简单邮件传输协议,是一种提供可靠且有效的电子邮件传输的协议。是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知,端口号为25。
- POP3:Post Office Protocol - Version 3(邮局协议版本3),是TCP/IP协议族中的一员。主要用于支持使用客户端远程管理在服务器上的电子邮件,提供了SSL加密的POP3协议称为POP3S。
- IMAP:因特网信息访问协议,是一个应用层协议,用来从本地邮件客户端(如Microsoft Outlook、Outlook Express、Foxmail、Mozilla Thunderbird)访问远程服务器上的邮件。
流程
Java发送邮件的原理主要包括如下流程:创建Session对象,创建Message对象,设置邮件内容,设置收件人地址,创建Transport对象,连接邮箱服务器,发送邮件,关闭连接。
授权码
一般用代码实现发送邮件的时候,登录邮箱服务器用的不是邮箱的密码,而是到对应的邮箱服务器获取一个授权码,代码实现时密码栏填的是授权码。
网易邮箱
点击【设置】,点击设置里面的【POP3/SMTP/IMAP】选项,点击开启【IMAP/SMTP服务】,此时会弹出一个窗口,用手机扫码发送短信即可,成功后会弹出一个显示授权码的对话框,此时需要保存该授权码,这个授权码只会显示一次。
QQ邮箱
点击【设置】,再点击邮箱设置中的【账号】,往下拉会显示一个【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】,点击【管理服务】,跳到安全设置里面,点击【生成授权码】,手机扫码发送短信,成功后就获取到了授权码,只显示一次,记得保存好。
代码实现
依赖
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
邮箱服务器地址
网易邮箱
服务器地址:
POP3服务器: pop.163.com
SMTP服务器: smtp.163.com
IMAP服务器: imap.163.com
安全支持:POP3/SMTP/IMAP服务全部支持SSL连接
QQ邮箱
接收邮件服务器: imap.qq.com,使用SSL,端口号993
发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
网易邮箱
配置
application.yml
spring:
application:
name: system
mail:
host: smtp.163.com
port: 465 #587
username: xxx@163.com
password: xxx #授权码
default-encoding: UTF-8
properties:
mail:
debug: true
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
效果图
QQ邮箱
配置
application.yml
spring:
application:
name: system
mail:
# host: smtp.163.com
host: smtp.qq.com
port: 465 #587
# username: xxx@163.com
username: xxx@qq.com
password: xxx #授权码
default-encoding: UTF-8
properties:
mail:
debug: true
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
ssl:
enable: true
效果图
发送邮件工具类
MailUtil.java
package com.lm.system.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @Author: DuHaoLin
* @Date: 2024/8/9
*/
@Component
public class MailUtil {
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from; //发件人邮箱
public void send(String to, String cc, String subject, String text) {
SimpleMailMessage ssm = new SimpleMailMessage();
ssm.setFrom(from);//发送者
ssm.setTo(to);//收件人
if(cc != null) ssm.setCc(cc);//抄送人
ssm.setSubject(subject);//邮件主题
ssm.setText(text);//邮件内容
mailSender.send(ssm);//发送邮件
}
}
发送邮件访问控制器
MailController.java
package com.lm.system.controller;
import com.lm.system.util.MailUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: DuHaoLin
* @Date: 2024/8/9
*/
@RestController
@Api(tags = "邮件接口")
@RequestMapping("mail")
public class MailController {
@Resource
private MailUtil mailUtil;
@GetMapping("send")
@ApiOperation("发送邮件")
public String sendMail(@RequestParam("to") String to, @RequestParam(value = "cc", required = false) String cc,
@RequestParam("subject") String subject, @RequestParam("text") String text) {
mailUtil.send(to, cc, subject, text);
return "发送成功";
}
}