当前位置: 首页 > article >正文

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

使用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里就行了,你可以试试。
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 容器名 镜像名

http://www.kler.cn/a/532972.html

相关文章:

  • 49【服务器介绍】
  • 【生成模型之十三】SmartEraser
  • Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
  • kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记
  • pytorch实现变分自编码器
  • Rust中使用ORM框架diesel报错问题
  • Verilog基础(一):基础元素
  • 用C语言实现一个Shell:Tutorial - Write a Shell in C
  • C语言:深入了解指针2(超详细)
  • LLMs瞬间获得视觉与听觉感知,无需专门训练:Meta的创新——在图像、音频和视频任务上实现最优性能。
  • 基于 Java 开发的 MongoDB 企业级应用全解析
  • ZOMI - AISystem AI Infra 分享
  • 【Rust自学】20.1. 最后的项目:单线程Web服务器
  • 基于python热门歌曲采集分析系统
  • 【力扣】53.最大子数组和
  • open-webui启动报错:OSError: [WinError 1314] 客户端没有所需的特权。
  • AI Block Blast Solver:提升游戏体验的智能助手
  • Innodb为何能干掉MyISAM
  • 编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama
  • Leetcode - 周赛434
  • 《深度洞察ICA:人工智能信号处理降维的独特利器》
  • DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索
  • 猫眼前端开发面试题及参考答案
  • Redis真的是单线程的吗?
  • Spring Bean 的生命周期介绍
  • SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定