用 spring 的 JavaMailSender 连续发送2封邮件的问题分析

在编写demo代码时,用 spring 的JavaMailSender连续发送2封邮件,在发送第2封时,会出现 “Could not connect to SMTP host” 的问题,以下是分步排查和解决方案:


1. 核心问题分析

该错误通常由以下原因导致:

  • SMTP 服务器连接限制:部分邮件服务商限制短时间内的连接频率(如QQ邮箱、Gmail)
  • 连接未正确关闭:首次发送后连接未释放,导致后续连接被拒绝
  • 资源泄漏:未使用连接池时,频繁创建新连接导致资源耗尽

2. 解决方案

方案一:启用 SMTP 连接池

application.properties 中添加连接池配置:

# 连接池配置
spring.mail.properties.mail.smtp.connectionpool=true
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.writetimeout=5000
spring.mail.properties.mail.smtp.maxconnects=5  # 最大连接数
方案二:强制关闭连接

在每次发送后手动关闭传输通道:

public void sendEmailWithClose() throws MessagingException {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);// 设置邮件内容...Transport transport = mailSender.getSession().getTransport();try {transport.connect();transport.sendMessage(message, message.getAllRecipients());} finally {transport.close();  // 关键:强制关闭连接}
}
方案三:增加发送间隔

在连续发送间添加延迟(不推荐,但可临时验证问题):

public void sendMultipleEmails() {sendEmail();Thread.sleep(3000);  // 间隔3秒sendEmail();
}

3. 邮件服务器特殊配置

邮件服务商特殊要求建议配置
QQ邮箱单IP每分钟最多5次连接使用连接池 + 间隔至少12秒
Gmail每日发送限制(免费版500封/天)启用OAuth2认证 + 连接池
阿里云新账户需手动解除发信频率限制提交工单申请调整配额

4. 调试步骤

  1. 开启详细日志
# application.properties
logging.level.org.springframework.mail=DEBUG
logging.level.com.sun.mail=DEBUG
  1. 观察日志特征
    正常日志应显示连接复用:
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 587, isSSL false
DEBUG SMTP: connected to host "smtp.qq.com", port: 587
DEBUG SMTP: connection reused

异常日志会显示连接中断:

DEBUG SMTP: could not connect to host "smtp.qq.com", port: 587
java.net.SocketException: Connection reset

5. 高级优化

自定义连接工厂
@Configuration
public class MailConfig {@Beanpublic JavaMailSenderImpl mailSender() {JavaMailSenderImpl sender = new JavaMailSenderImpl();sender.setHost("smtp.qq.com");sender.setPort(587);Properties props = sender.getJavaMailProperties();props.put("mail.smtp.ssl.trust", "*");props.put("mail.smtp.connectiontimeout", 10000);props.put("mail.smtp.ssl.socketFactory.class", "javax.net.ssl.SSLSocketFactory");return sender;}
}
异步发送 + 重试机制
@Async
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 2000))
public void sendEmailWithRetry(String to, String subject, String text) {// 发送逻辑
}

6. 企业级解决方案

场景方案工具推荐
高并发批量发送消息队列 + 消费者限流RabbitMQ + Spring Batch
跨国邮件服务多SMTP服务商自动切换Apache Camel
合规审计要求邮件网关代理Postfix + OpenSMTPD

7. 验证工具

使用 Telnet 测试 SMTP 连接稳定性:

# 第一次连接
telnet smtp.qq.com 587
EHLO test
QUIT# 立即第二次连接(观察是否被拒绝)
telnet smtp.qq.com 587

如果第二次连接失败,说明服务器端有限制,需调整发送策略。


通过上述方案,可有效解决连续发送邮件时的连接中断问题。建议优先采用 连接池 + 强制关闭连接 的组合方案,兼顾性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装和部署Tomcat并在idea创建web文件

一、背景 实验任务为安装Tomcat并创建web文件 为提高安装效率并且通俗易懂,免得大量文字浪费时间,这里我们采用图片加文字的方式来给大家讲解这个安装教程。 二、安装过程 首先第一步一定要注意你是否下载了JDK,如果你是像我一样下载一个…

一站式电脑工具箱,功能全面且实用

小明工具箱是一款集成了系统设置、维护工具、实用工具、图像处理等四大类工具的电脑工具箱,涵盖了上百种实用工具,能够满足用户在文件管理、文本处理、系统优化、图像处理等多方面的需求。 初次使用,需双击软件,便会自动将工具解压…

NO.55十六届蓝桥杯备战|排序|插入|选择|冒泡|堆|快速|归并(C++)

插⼊排序 插⼊排序(Insertion Sort)类似于玩扑克牌插牌过程&#xff0c;每次将⼀个待排序的元素按照其关键字⼤⼩插⼊到前⾯已排好序的序列中&#xff0c;按照该种⽅式将所有元素全部插⼊完成即可 #include <iostream> using namespace std; const int N 1e5 10; …

OpenGL入门

一、环境搭建 ‌库依赖安装‌ 需要安装GLFW&#xff08;窗口管理&#xff09;和GLAD&#xff08;函数指针加载库&#xff09;。在Windows下推荐使用Visual Studio的vcpkg包管理工具进行安装&#xff0c;Linux下通过apt-get安装相关依赖‌。 ‌窗口初始化‌ 使用GLFW创建窗口并…

JVM(基础篇)

一.初识JVM 1.什么是JVM JVM全称Java Virtyal Machine&#xff0c;中文译名 Java虚拟机 。JVM本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件(将字节码解释成机器码)。 2.JVM的功能 解释和运行&#xff1a;对字节码文件中的指令号&#xff0c;实时…

VMware安装ubuntu22.04.5 server

下载Ubuntu镜像 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.5/ 安装系统 打开vmware 点击创建新的虚拟机 选择自定义 点击下一步 选择稍后安装操作系统&#xff0c;点击下一步 选择Linux系统&#xff0c;选择ubuntu64&#xff0c;点击下一步 选择安装位置&…

Docker容器之Dockerfile

用来构建镜像的文件。是指就是命令&#xff0c;参数&#xff0c;脚本。 指令合集以及说明 构建镜像图解: 实战测试&#xff1a; 构建自己的ubuntu&#xff1a; FROM ubuntu MAINTAINER liux ENV MYPATH /usr/local WORKDIR $MYPATH RUN apt-get update RUN apt install net-…

STM32G030移植RT-Thread

移植流程 移植前需要安装Keil.STM32G0xx_DFP.1.2.0.pack组件&#xff0c;大致的移植过程&#xff1a; CubeMX配置RT-Thread组件配置工程模板配置 参考例程配置&#xff1a;拷贝仓库原有的stm32g070-st-nucleo工程&#xff0c;然后另起一个名字&#xff0c;目录结构如下 完整…

【网络】网关

【网络】网关 网关 是计算机网络中用于连接两个不同网络的设备或服务器&#xff0c;它充当着“翻译器”和“转发器”的角色&#xff0c;将数据包从一个网络传递到另一个网络&#xff0c;并在必要时进行协议转换和数据重包装。 主要功能 数据转发&#xff1a;当本地网络设备发…

用JS+Promise实现简单消息队列

一、什么是消息队列 消息队列是一种用于在软件系统之间传递消息的技术。它常被用于解耦不同组件或模块之间的通信&#xff0c;减少系统中各个部分之间的直接依赖关系。消息队列可以实现异步通信&#xff0c;发送方将消息发送到队列中&#xff0c;接收方从队列中获取消息并进行处…

【Python爬虫】使用python脚本拉取汽车网站品牌数据

示例代码说明&#xff1a; 在汽车之家网站拉取当月排行榜中汽车品牌、销量和价格信息&#xff0c;存为csv文档输出&#xff0c;使用正则表达式获取网页内容 import re import pandas as pd import requests# 汽车之家车型列表页URL url https://cars.app.autohome.com.cn/ca…

批量修改 PPT 文档中主题、编辑时长、来源等元数据信息

每一个 PPT 文档被创建之后&#xff0c;都会包含一些元数据信息。这些元数据信息记录着文件的作者、创建时间、修改时间、打印时间等信息。这些信息默认都是自动生成的&#xff0c;如果我们想要对这些元数据进行修改&#xff0c;当然也是可以的。今天就给大家介绍一下如何批量修…

丐版插入selectdb模拟

为了模拟不断插入数据到库里&#xff0c;写个简单的循环脚本 #!/bin/bash #计算时差 function getTiming(){start$1end$2start_secho $start | cut -d . -f 1start_nsecho $start | cut -d . -f 2end_secho $end | cut -d . -f 1end_nsecho $end | cut -d . -f 2time_micro$((…

Off-Road-Freespace-Detection配置pytorch2.0.0

一、概述 在github上进行开源代码搜索&#xff0c;发现了Off-Road-Freespace-Detection&#xff08;链接如下所示&#xff09;。这是对越野环境可通行区域的检测&#xff0c;在经过测试之后&#xff0c;发现对自己有益。 GitHub - chaytonmin/Off-Road-Freespace-Detection: O…

常见中间件漏洞之四:Apache

1. CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录<Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击…

Pytorch中Tensorboard的学习

1、Tensorboard介绍 TensorBoard 是 TensorFlow 开发的一个可视化工具&#xff0c;用于帮助用户理解和调试机器学习模型的训练过程。尽管它最初是为 TensorFlow 设计的&#xff0c;但通过 PyTorch 的 torch.utils.tensorboard 模块&#xff0c;PyTorch 用户也可以方便地使用 Te…

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

哪吒汽车:一边熬夜蹦迪,一边找药投医

两年前&#xff0c;威马CEO沈晖发了个短视频&#xff0c;内容是“活下去&#xff0c;像牲口一样活下去”。 如今最能体会沈晖当时心情的&#xff0c;估计就是方运舟了。 作为哪吒汽车创始人兼董事长&#xff0c;他连续多次被限高&#xff0c;为了让哪吒汽车活下去&#xff0c…

2025 cs144 Lab Checkpoint 1小白超详细版

cs144官网&#xff1a;https://cs144.github.io/ 我的github&#xff1a;https://github.com/Albert-tru/cs144-2025 文章目录 1 手动发送internet数据报协议号5、7&#xff1f;思路&#xff1f; 2 实现一个Reassembler类2.1 几个帮助理解代码的Q&AQ1&#xff1a;insert的参…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用&#xff0c;而 OpenCV 作为一个强大的图像处理库&#xff0c;提供了丰富的函数来实现各类图像处理任务。形态学操作&#xff08;Morphological Operations&#xff09;是其中常用的技术&#xff0c;尤其适用于二值图像的处理。常见的…