在Spring Boot中发送邮件是一个常见的需求,通常使用JavaMail API结合Spring的邮件抽象来实现。Spring Boot提供了一个简单的配置和使用邮件发送的方法。
简单使用
添加依赖
首先,你需要在你的pom.xml文件中添加Spring Boot Starter Mail依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
如果你使用的是Gradle,请添加相应的依赖。
implementation 'org.springframework.boot:spring-boot-starter-mail'
配置邮件属性
在application.properties或application.yml文件中配置你的邮件服务器属性。
spring:
mail:
host: smtp.example.com
port: 587
username: your-email@example.com
password: your-email-password
properties:
mail:
smtp:
auth: true
starttls:
enable: true
163邮箱配置如下:
spring:
mail:
host: smtp.163.com
port: 465
username: morris131@163.com
password: xxxxxxxx
# 注意开启smtps
protocol: smtps
properties:
mail:
smtp:
auth: true
starttls:
enable: true
配置文件中需要配置protocol: smtps
,否则会抛出如下异常:
javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2198) ~[jakarta.mail-1.6.7.jar:1.6.7]
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722) ~[jakarta.mail-1.6.7.jar:1.6.7]
创建一个类来发送邮件
创建一个类来封装邮件发送的逻辑。你可以使用JavaMailSender接口来发送邮件。
package com.morris.spring.boot.module.email;
import lombok.extern.slf4j.Slf4j;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* 发送邮件测试
*/
@Slf4j
@RestController
@RequestMapping("/email")
public class EmailController {
@Resource
private JavaMailSender javaMailSender;
/**
* 发送简单的邮件
*
* @return "sendSingle"
*/
@GetMapping("sendSingle")
public String sendSingle() {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("1508787838@qq.com"); // 收件人
message.setSubject("sendSingle"); // 主题
message.setText("sendSingle Text"); // 内容
message.setFrom("morris131@163.com"); // 发件人 Optional, if not set, it will use the username configured in application.properties
javaMailSender.send(message);
return "sendSingle";
}
}
运行应用并测试
启动Spring Boot应用,然后访问http://localhost:8888/email/sendSingle
来发送一封简单的邮件。
可以在收件人邮箱收到如下格式的邮件:
注意事项:
- 安全性:不要在application.properties或application.yml中硬编码密码。考虑使用Spring Cloud Config或环境变量来管理敏感信息。
- 异常处理:在生产环境中,你应该添加适当的异常处理逻辑来捕获和处理邮件发送过程中可能发生的错误。
- 邮件内容:对于复杂的邮件内容(如带有附件或HTML格式),你可以使用MimeMessageHelper来构建邮件。
名词解释
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)
SMTP是一种提供可靠且有效的电子邮件传输的协议。它的主要作用是在系统之间传递邮件信息,并提供有关来信的通知。SMTP协议建立在FTP文件传输服务上,它独立于特定的传输子系统,只需要可靠有序的数据流信道支持。使用SMTP协议,可以实现相同网络处理进程之间的邮件传输,也可以通过中继器或网关实现某处理进程与其他网络之间的邮件传输。SMTP使用TCP端口25,通过一系列的命令和响应来建立连接、发送邮件和关闭连接。
POP3(Post Office Protocol 3,邮局协议第三版)
POP3是一种从邮件服务器下载邮件的协议。它属于TCP/IP协议族中的一员,默认端口是110。POP3协议主要用于支持使用客户端远程管理在服务器上的电子邮件。当邮件发送到服务器上后,电子邮件客户端会调用邮件客户端程序,连接服务器并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上(如PC机或MAC)。不过,很多POP3服务器都支持“下载邮件后服务器并不删除邮件”的功能,这是POP3协议的一个改进。但需要注意的是,使用POP3协议时,一旦邮件被下载到本地设备,服务器上的邮件副本通常会被删除(除非服务器设置了不删除副本的选项)。因此,POP3更适合在单一设备上管理邮件的用户。
IMAP(Internet Mail Access Protocol,互联网邮件访问协议)
IMAP是一种电子邮件协议,它允许用户从邮件服务器上读取邮件,并在多个设备之间同步邮件状态。IMAP协议运行在TCP/IP协议之上,使用的端口是143。与POP3不同,IMAP采用的是同步模式。使用IMAP协议时,用户可以在多个设备(如电脑、手机等)上访问和管理邮件,且这些设备上的邮件状态会保持同步。这意味着当你在一个设备上阅读或删除邮件时,这些更改会自动反映到其他设备上。IMAP的这种同步性使得它成为那些需要在多个设备上管理邮件的用户的理想选择。此外,IMAP还支持有选择地从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能等。
POP3、SMTP和IMAP的协同工作
在实际应用中,POP3、SMTP和IMAP通常协同工作,为用户提供完整的邮件服务。例如:
- 一个用户可能使用IMAP协议在多个设备上同步管理邮件,同时使用SMTP协议发送邮件。
- 一个用户可能主要使用POP3协议在单一设备上接收邮件,但也需要使用SMTP协议发送邮件。
简单来说,POP3和IMAP是用来从服务器上下载邮件的。SMTP适用于发送或中转信件时找到下一个目的地。所以我们发送邮件应该使用SMTP协议。
邮箱客户端授权码
授权码是邮箱推出的,用于登录第三方客户端的专用密码。
适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
QQ邮箱获取授权码
在设置->账号->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中开启服务并获取授权码:
网易邮箱获取授权码
在设置->POP3/SMTP/IMAP菜单下开启服务并获取授权码: