Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录
问题出现情况
邮件发送时debug用F8逐步运行可以成功发送邮件,但是用F9或者直接运行程序却发送失败未开启mail的debug模式的报错日志是下面这个:
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: [EOF]at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:440)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)
开启了mail的debug日志,然后之前忘了添加超时设置,后续添加了下面超时设置
spring:#JavaMailSendermail:host: smtp.exmail.qq.comport: 587username: xxx@xxx.compassword: xxxdefault-encoding: UTF-8properties:mail.smtp.starttls.enable: truemail.smtp.timeout: 5000 # 设置连接超时(毫秒)后面加的mail.smtp.connectiontimeout: 5000 # 设置连接超时(毫秒)后面加的mail.smtp.writetimeout: 5000 # 设置写入超时(毫秒)后面加的
之后发现是卡在了权限验证AUTH LOGIN,然后无法进行下一步,直到超时,日志如下:
DEBUG SMTP: exception reading response, THROW:
java.net.SocketTimeoutException: Read timed outat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:171)at java.net.SocketInputStream.read(SocketInputStream.java:141)at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:475)at sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:469)at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:69)at sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1271)at sun.security.ssl.SSLSocketImpl.access$300(SSLSocketImpl.java:76)at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:948)at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:126)at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)at java.io.BufferedInputStream.read(BufferedInputStream.java:265)at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:106)at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2440)at com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:1699)at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:759)at javax.mail.Service.connect(Service.java:366)at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:518)at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:437)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)at com.example.demo.mail.MailServiceImpl.send(MailServiceImpl.java:95)at com.example.demo.mail.MailServiceImpl.send(MailServiceImpl.java:108)at com.example.demo.schedule.MyRunner.run(MyRunner.java:20)at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:781)at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:765)at org.springframework.boot.SpringApplication.run(SpringApplication.java:319)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
问题解决过程
在debug过程中发现是在TLS握手时超时导致的权限验证失败,在项目启动时添加:
-Djavax.net.debug=ssl:handshake
添加后查看日志,ServerHello返回的版本是TLSv1.2,但是指定通信的版本是TLSv1.3,成功的日志指定的也是1.3,我尝试配置指定TLS版本为v1.2后发现问题成功解决:
spring:mail:host: smtp.exmail.qq.comport: 587username: xxx@xxx.compassword: xxxdefault-encoding: UTF-8properties:mail.smtp.starttls.enable: truemail.smtp.starttls.required: truemail.smtp.ssl.protocols: TLSv1.2mail.smtp.auth: truemail.smtp.timeout: 5000 # 设置连接超时(毫秒)mail.smtp.connectiontimeout: 5000 # 设置连接超时(毫秒)mail.smtp.writetimeout: 5000 # 设置写入超时(毫秒)
后续我通过openssl命令行执行查看server的TLS版本发现是支持v1.3的:
admin@DESKTOP-0SP0F5T MINGW64 ~/Desktop
$ openssl s_client -starttls smtp -crlf -connect smtp.exmail.qq.com:587
Connecting to 119.147.6.199
CONNECTED(00000250)
depth=2 C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
verify return:1
depth=1 C=US, O=DigiCert Inc, CN=DigiCert Secure Site CN CA G3
verify return:1
depth=0 C=CN, ST=Guangdong Province, L=Shenzhen, O=Tencent Technology (Shenzhen) Company Limited, CN=*.exmail.qq.com
verify return:1
...省略
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3871 bytes and written 446 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
...省略
---
250 8BITMIME
---
Post-Handshake New Session Ticket arrived:
SSL-Session:Protocol : TLSv1.3Cipher : TLS_AES_256_GCM_SHA384
...省略
然而通过ssl-tool在线验证却发现不支持,可自行点击超链接查看
问了chatgpt发现也是:
所以最后解决方法是指定了TLS版本
补充
项目用的是JDK1.8,SpringBoot版本是2.1.8.RELEASE,后续使用了JDK17,SpringBoot版本3.3.4问题依旧,而且F8调试的不会报错,但是指定了TLS版本的方法虽然成功发送了邮件,但是socket已关闭然后报错。如下:
221 Bye
发送邮件完毕...
2024-10-12 14:04:16.696 INFO 30640 --- [ Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
javax.net.ssl|FINE|01|main|2024-10-12 14:04:16.690 GMT+08:00|SSLSocketImpl.java:497|duplex close of SSLSocket
javax.net.ssl|FINE|01|main|2024-10-12 14:04:16.692 GMT+08:00|SSLSocketImpl.java:1551|close the underlying socket
javax.net.ssl|FINE|01|main|2024-10-12 14:04:16.692 GMT+08:00|SSLSocketImpl.java:1570|close the SSL connection (initiative)
javax.net.ssl|FINE|01|main|2024-10-12 14:04:16.692 GMT+08:00|SSLSocketImpl.java:755|close inbound of SSLSocket
javax.net.ssl|WARNING|01|main|2024-10-12 14:04:16.693 GMT+08:00|SSLSocketImpl.java:515|SSLSocket duplex close failed (
"throwable" : {java.net.SocketException: Socket is closedat java.net.Socket.shutdownInput(Socket.java:1538)at com.sun.mail.util.WriteTimeoutSocket.shutdownInput(WriteTimeoutSocket.java:281)at sun.security.ssl.BaseSSLSocketImpl.shutdownInput(BaseSSLSocketImpl.java:218)at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:771)at sun.security.ssl.SSLSocketImpl.bruteForceCloseInput(SSLSocketImpl.java:720)at sun.security.ssl.SSLSocketImpl.duplexCloseOutput(SSLSocketImpl.java:580)at sun.security.ssl.SSLSocketImpl.close(SSLSocketImpl.java:504)at com.sun.mail.smtp.SMTPTransport.closeConnection(SMTPTransport.java:1425)at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1418)at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:476)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)at com.example.demo.mail.MailServiceImpl.send(MailServiceImpl.java:95)at com.example.demo.mail.MailServiceImpl.send(MailServiceImpl.java:105)at com.example.demo.schedule.MyRunner.run(MyRunner.java:20)at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:781)at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:765)at org.springframework.boot.SpringApplication.run(SpringApplication.java:319)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
最后
哪位大佬知道这是为什么吗,最终还是没明白问题出在了哪里,望指点
相关文章:

Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录
问题出现情况 邮件发送时debug用F8逐步运行可以成功发送邮件,但是用F9或者直接运行程序却发送失败未开启mail的debug模式的报错日志是下面这个:org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is java…...
【大数据】HBase集群断电文件坏块导致集群无法启动处理
hfile文件有坏块 Corrupt文件目录:/hbase/data/… HBase异常:region无法在正常上线,http://master:16010页面看region 一直处于transition状态 wal文件损坏 Corrupt文件目录:/hbase/oldWALs/…或/hbase/WALs/… HBase异常&…...
400行程序写一个实时操作系统(三):Sparrow的学习方法
千里之行始于足下,为了让大家的学习更加事半功倍,笔者将会介绍RTOS的学习方法。 可能很多人拿到一份源码,就想通过各种方式搞懂它,例如抄代码或者读代码。 笔者认为,单纯抄一个实时操作系统是没有任何用处的。比如对…...

为什么人工智能用 Python?
人工智能领域倾向于使用Python,主要归因于Python的多个显著优势: 简洁性与可读性:Python的语法设计简洁明了,代码易于阅读和理解,这对于涉及复杂算法和逻辑的人工智能项目尤为重要。它降低了编程门槛,使得…...

【C++差分数组】P1672何时运输的饲料
本文涉及知识点 C差分数组 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 P1672何时运输的饲料 原文比较啰嗦,我简述一下: 第x天运来F1(1<F1<1e6)千克的饲料,第D(1<2e3)天还剩F2&…...

Go基础知识:切片
数组 Go 数组的大小是固定的,其长度是其类型的一部分([4]int并且[5]int是不同的、不兼容的类型) var a [10]intb : [2]string{"Penn", "Teller"} b : [...]string{"Penn", "Teller"}package maini…...

Redis配置篇 - 指定Redis配置的三种方式,以及Redis配置文件介绍
文章目录 1 指定Redis配置的三种方式1.1 通过命令行参数来指定Redis配置1.2 通过配置文件来指定Redis配置1.3 在服务器运行时更改 Redis 配置 2 关于Redis配置文件 1 指定Redis配置的三种方式 1.1 通过命令行参数来指定Redis配置 在redis启动时,可以直接通过命…...
探索scikit-learn的datasets模块:数据集的加载与使用
引言 在机器学习和数据分析领域,数据集的选择和准备是至关重要的一步。scikit-learn库的datasets模块为我们提供了多种内置的数据集,方便我们进行模型训练和测试。这些数据集既有大型的数据集,也有便于教学和初步探索的小型数据集。本文将重…...

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
有时候,您会被锁定在自己的 Android 设备之外,而且似乎不可能重新进入。 一个例子就是你买了一部二手手机,后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见,但确实会发生&…...
SSL 协议(HTTPS 协议的关键)
所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些是制定和完善协议的人去做的,我们只需要知道协议的一个大概 一、SSL 协议 1、…...
test_2_27(C指针)
test_2_27 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>使用指针数组来模拟实现二维数组int main() {int* arr[10];//指针数组int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,5,6,7 };int* arr[3] {arr1, arr2, arr3};int i 0;for …...

设计模式——门面模式 | 外观模式
哈喽,各位盆友们!我是你们亲爱的学徒小z,今天给大家分享的文章是设计模式的——门面模式。 文章目录 定义通用类图1.通用结构2.优点3.缺点 使用场景注意事项1.一个子系统可以有多个门面2.门面不参与子系统内的业务逻辑 定义 定义:…...
FPGA时序分析和约束学习笔记(1、FPGA基本原理)
FPGA时序分析和约束学习笔记-(1、FPGA基本原理) Field现场Programmable可编程Gate门Array阵列 1、FPGA基本资源组成 可编程逻辑功能块(logic elements ,缩写LE) 片内互联线(interconnect,缩写…...

VMware桥接模式无法连接网络
windows下打开控制面板,找到WLAN,记住下面的名称(带有VMware的都是虚拟机的网卡,要找到物理主机的网卡) 回到VMware,编辑——打开虚拟网络编辑器 桥接选择上面的WLAN下的网络名称,确定即可。&…...

YOLO11改进|卷积篇|引入空间通道重组卷积ScConv
目录 一、【SCConv】卷积1.1【SCConv】卷积介绍1.2【SCConv】核心代码 二、添加【SCConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SCConv】卷积 1.1【SCConv】卷积介绍 SCConv 模块提供了一种新的视角来看待CNNs的特征提取…...

Java:方法详解
目录 一.什么是方法(method) 二.方法定义 三.方法中实参和形参的关系 四.方法重载 五.递归 一.什么是方法(method) 方法就是一个代码片段,再C语言中我们曾经学过一个类似的方式——函数,他们都是将具有独立功能的代码组织成一个整体,形成…...
Python 三方库下载安装
Python 三方库下载安装 1、在线安装 pip install pandas # 直接安装 python -m pip install pandas # 使用指定Python中的pip进行安装 pip install pandas1.2.3 # 安装指定版本 pip install pandas -i http://pypi.douban.com/simple --trusted-host pypi.…...

使用npm i报错node-sass失败问题解决
node 版本:v14.15.4 解决方法: npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后,再npm i 就可以下载成功 亲测有效...
vite+vue3实现动态路径导入
最近在做一个项目有个需求: 项目图片分为英语,中文,德语 ,我将这些图片存放到/image/language/下面的每个语言的文件夹内,如en,zh-cn文件夹下面存放对应的语言的图片,如果在代码里面写路径的话,除了要写一堆路径还要判断不同的语言,非常麻烦,但是在vue3vite里面import导入的是加…...

JAVA——File类
目录 1.概述 2.构造方法 a.根据文件路径创建文件对象 b.根据父级路径和子级路径创建对象 c.根据File表示的路径和String表示路径进行拼接 3.常见方法 a.判断文件是否存在 b.判断文件是否为文件夹 c.判断是否为文件 d.获取文件大小 e.获取文件的绝对路径 f.获取定义…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...