使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件

文章目录

1. 获取网易邮箱服务的授权码


温馨提示:找个地方保管好授权码。

2. 初始化项目

maven部分

这次用到的其实主要是Spring Boot Starter Mail,别的都是为了方便测试才加的。

拿着这个pom文件新建一个demo,然后把资料里的src粘进来。

xml 复制代码
<?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里填写上发送邮件必不可少的配置:

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

yaml 复制代码
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即可。

dockerfile 复制代码
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY 你的包名.jar app.jar
EXPOSE 9000
ENTRYPOINT ["java", "-jar", "app.jar"]

创建镜像

bash 复制代码
docker build -t 镜像名:版本号 .

启动容器

bash 复制代码
docker run -d -p 9000:8080 --name 容器名 镜像名
相关推荐
KiddoStone5 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧26 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao30 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
KellenKellenHao2 小时前
MySQL数据库主从复制
数据库·mysql
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github