使用SpringBoot发送邮件
文章目录
- 使用SpringBoot发送邮件
- 1. 获取网易邮箱服务的授权码
- 2. 初始化项目
- maven部分
- web部分
- 3. 发送邮件
- 填写配置
- EmailSendService
- [已解决]部署时连接超时
- 附:Docker脚本
- Dockerfile
- 创建镜像
- 启动容器
1. 获取网易邮箱服务的授权码
温馨提示:找个地方保管好授权码。
2. 初始化项目
maven部分
这次用到的其实主要是Spring Boot Starter Mail
,别的都是为了方便测试才加的。
拿着这个pom文件新建一个demo,然后把资料里的src粘进来。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>email-service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.3.4</version>
</dependency>
<!-- Spring Boot Starter Mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Spring Boot Configuration Processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>3.0.0</version>
<optional>true</optional>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.3.4</version>
</plugin>
</plugins>
</build>
</project>
web部分
http://localhost:8080/api/email/sendVerificationCode
在浏览器上尝试访问这个地址,如果看到Send email successfully!
,就证明初始化好了,可以继续往后实现发邮件的代码。
3. 发送邮件
填写配置
在application.yaml
里填写上发送邮件必不可少的配置:
spring:
mail:
default-encoding: UTF-8
host: smtp.163.com
username: 你的邮箱(网易给你授权码乃个邮箱)
password: 你的授权码
port: 25
protocol: smtp
EmailSendService
这里用的是发送验证码这个场景,需要实现的主要是sendEmail
,
- 要成功发送一个邮件必须写明↓,所以封装了一个
EmailDTO
——方便传数据。- to:发给谁
- from:谁发的
- subject:主题
- text:内容
- 其余创建邮件消息对象并发送的代码,因为简单用了每次都这么写,所以先就这样了。
- 另外提一下,发邮件的时候,是支持发HTML格式的内容的,直接写在text里就行了,你可以试试。
java">package com.example.email;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
/**
* @author urfread
* @date 2025-02-02 14:02
*/
@Service
public class EmailSendService {
@Value("${spring.mail.username}")
private String fromEmail;
@Autowired
private JavaMailSender mailSender;
public boolean sendVerificationCode(String to){
return sendEmail(EmailDTO.builder()
.from(fromEmail)
.to(to)
.subject("注册认证")
.text("Your verification code is 123456.")
.build());
}
private boolean sendEmail(EmailDTO emailDTO) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
helper.setFrom(emailDTO.getFrom());
helper.setTo(emailDTO.getTo());
helper.setSubject(emailDTO.getSubject());
helper.setText(emailDTO.getText(), true); // 第二个参数为 true 表示发送 HTML 格式的内容
System.out.println("Sending email from: " + emailDTO.getFrom());
System.out.println("Sending email to: " + emailDTO.getTo());
System.out.println("Email subject: " + emailDTO.getSubject());
mailSender.send(mimeMessage);
System.out.println("Email sent successfully.");
} catch (MessagingException e) {
System.err.println("Failed to send email: " + e.getMessage());
return false;
}
return true;
}
}
[已解决]部署时连接超时
把邮件服务器的端口改成465,再用上SSL
spring:
mail:
default-encoding: UTF-8
host: smtp.163.com
username: 你的邮箱
password: 你的授权码
port: 465
protocol: smtp
properties:
mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory # 启用 SSL
mail.smtp.connectiontimeout: 5000 # 设置连接超时(单位:毫秒)
mail.smtp.timeout: 5000 # 设置读取超时(单位:毫秒)
mail.smtp.writetimeout: 5000 # 设置写入超时(单位:毫秒)
logging:
level:
root: INFO
附:Docker脚本
Dockerfile
获取jar包,点mvn里的install即可。
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY 你的包名.jar app.jar
EXPOSE 9000
ENTRYPOINT ["java", "-jar", "app.jar"]
创建镜像
docker build -t 镜像名:版本号 .
启动容器
docker run -d -p 9000:8080 --name 容器名 镜像名