Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录

news2024/10/12 13:45:42

问题出现情况

  邮件发送时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:
  #JavaMailSender
  mail:
    host: smtp.exmail.qq.com
    port: 587
    username: xxx@xxx.com
    password: xxx
    default-encoding: UTF-8
    properties:
      mail.smtp.starttls.enable: true
      mail.smtp.timeout: 5000 # 设置连接超时(毫秒)后面加的
      mail.smtp.connectiontimeout: 5000 # 设置连接超时(毫秒)后面加的
      mail.smtp.writetimeout: 5000 # 设置写入超时(毫秒)后面加的
  之后发现是卡在了权限验证AUTH LOGIN,然后无法进行下一步,直到超时,日志如下:
DEBUG SMTP: exception reading response, THROW: 
java.net.SocketTimeoutException: Read timed out
	at 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.com
    port: 587
    username: xxx@xxx.com
    password: xxx
    default-encoding: UTF-8
    properties:
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true
      mail.smtp.ssl.protocols: TLSv1.2
      mail.smtp.auth: true
      mail.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.3
    Cipher    : TLS_AES_256_GCM_SHA384
...省略

  然而通过ssl-tool在线验证却发现不支持,可自行点击超链接查看
  问了chatgpt发现也是:
在这里插入图片描述
  所以最后解决方法是指定了TLS版本

最后

  哪位大佬知道这是为什么吗,最终还是没明白问题出在了哪里,望指点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…

TXS0104 LSF0102 原理理解

具体参数请查看数据手册,在此不必赘述了。TXS0104 数据手册 现主要对TXS0104 结构原理进行解析: 电平转换电路结构可参考如下电路: 对于gate bias 部分电路具体细节有兴趣的可以了解下。 对于LSF0102 系列的电平转换芯片 LSF0102 数据手…

【人工智能学习之PaddleOCR训练教程】

具体的训练教程: 准备数据集 OCR数据集 (以下文字转载官方文档ocr_datasets) 1. 文本检测 1.1 PaddleOCR 文字检测数据格式1.2 公开数据集 1.2.1 ICDAR 2015 2. 文本识别 2.1 PaddleOCR 文字识别数据格式2.2 公开数据集 2.1 ICDAR 2015 …

使用Spring Security实现用户-角色-资源的权限控制

文章目录 一、基于角色的请求控制二、加载用户角色信息三、角色与资源的关联四、测试角色权限控制1. 未登录用户访问受保护资源2. 登录用户访问受保护资源3. 角色不足的用户访问受保护资源(把前面改成.roles("USER")) 五、自定义异常处理1. 自…

CANoe的数据回放功能

文章目录 CANoe简介1.Offline回放功能2.Replay Block回放模块3.两者的异同 CANoe简介 CANoe(CAN open environment): 用于汽车ECU网络仿真、数据分析、测试和诊断,还可以进行数据回放、程序刷写等。具有实时报文跟踪、数据解析及…

Android开发启动页跳过倒计时效果

Android开发启动页跳过倒计时效果 app启动页都会放些广告图,然后倒计时跳过。 一、思路: 不是很难,就用用个倒计时控制mHandler.sendEmptyMessageDelayed(WHAT_COUNT_DOWN, 100); 二、效果图: 三、关键代码: publ…

消息队列面试题——第二篇

1. rocketmq、rabbitmq、kafka的区别 架构设计和消息模型 特性rocketmqrabbitmqkafka消息模型基于主题和消费组,支持发布/订阅和点对点两种模型基于队列模型,支持发布/订阅和点对点两种模型基于分区的主题模型,主要用于日志流式处理和高吞吐…

基于SSM创城志愿者管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

RNN心脏病预测

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 前期准备 1.数据导入 import pandas as pd from keras.optimizers import Adam from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.p…

jenkins 插件Publish Over SSH

一、安装插件 二、配置sshserver http://192.168.31.156:8080/manage/configure 三、添加自由风格:PublishOverSSHDemo 我们将工作目录:/var/lib/jenkins/workspace/PublishOverSSHDemo下的图片m3.jpeg 同步到目标143服务器目录:/root/imag…

Mysql(七) --- 索引

文章目录 前言1.简介1.1.索引是什么?1.2.为什么使用索引? 2.索引应该使用什么数据结构?2.1.Hash2.2.二叉搜索树2.3.N叉树2.4.B树2.4.1. 简介2.4.2. B树的特点2.4.3. B树和B树的对比 3.Mysql中的页3.1.为什么要使用页3.2.页文件头和页文件尾3.3.页主体3.…

Python开源项目月排行 2024年9月

#2024年9月2024年9月29日1jax一个开源的高性能数值计算库,旨在为机器学习和科学计算提供灵活性和效率。该项目由 Google 研发,并在 GitHub 上进行维护。AX 主要用于以下几个方面: 自动微分:提供高效的自动微分功能,支持…

嵌入式面试——FreeRTOS篇(九) 内存管理

本篇为:FreeRTOS 内存管理篇 一、FreeRTOS内存管理简介 1、FreeRTOS内存管理介绍 答: 在使用 FreeRTOS 创建任务、队列、信号量等对象的时,一般都提供了两种方法: 动态方法创建:自动地从 FreeRTOS 管理的内存堆中申…

【AI绘画教程】StableDiffusion出图颜色偏白发灰?用好VAE立马解决!(附VAE模型下载)

大家好,我是画画的小强 之前已经给大家推荐过不少AI绘画中 Stable Diffusion WebUI 的大模型,今天为大家介绍一下 WebUI 中“外挂VAE”的相关内容,可以解决我们在用大模型出图过程中出现的图像颜色发灰、发白的问题,一起来看看吧…

话说你们维保到期通知都是谁通知的

离谱了,公司有个客户维保到期了 过了2个月才发现。 白干了两个月, 客户也不愿意给这两个月钱。 现在商务和运维在扯皮, 商务说运维部门应该到期给客户发通知, 运维说商务到期要续签, 就应该商务去通知。 然后老…

ppt怎么做出高级感?找对高级ppt模板,轻松一键替换

想问问大家国庆节后的工作忙吗?小编的大厂朋友们都忙疯了! 都在忙着做各种项目的执行总结PPT报告,和接下来的工作计划展望!做出来的PPT还会被领导嫌弃排版没创意、不高级...... 这不,还来找小编,问有没有什…

水库抽样算法(大数据算法作业)

时隔一个多月,终于想起来写大数据算法基础的实验报告,主要是快截止了,hh 这两天加急把这个报告写完了~ 接下来,写一写证明过程(参考书籍:高等教育出版社《数据科学与工程算法基础》)主要代码以…

MODBUS协议介绍,通过MODBUS协议控制伺服电机工作

1.前言 modbus协议本身的介绍,请大家自行查阅资料。本文简单介绍一下如何通过MODBUS协议组装控制指令。 最近搞了一个项目,要驱动伺服电机工作。通过下位机STM32 407 100封脚 给伺服电机发控制指令。电机和下位机之前的通信采用RS485串口通信&#xff…

seaCMS v12.9代码审计学习(下半)

文章目录 admin/admin_safe.php任意文件下载CSRF 添加管理员账户CSRF配合XSS弹cookie admin/admin_safe.php任意文件下载 在admin_safe.php文件下有着这么一段代码,他的作用时检查action的值是否为download,如果为download那么将你传入的文件直接打印给…

LeetCode题练习与总结:二叉树的序列化与反序列化--297

一、题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与…