JavaMail 发送邮件阻塞问题解决——设置 smtp 超时时间

一. 起因

最近发现项目中有关发送邮件的模块偶尔会阻塞住,导致整个线程阻塞。诡异的是没有捕获到任何异常日志,程序莫名其妙就卡在了 sendMail 上。

后来想到发送邮件的内容过大,可能由于这个原因导致,所以找了一下有关 JavaMail 超时设置的资料。现做整理,顺便聊聊一些小坑。

二. JavaMail smtp 超时参数

参数类型描述
mail.smtp.connectiontimeoutintSocket connection timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout.
mail.smtp.timeoutintSocket read timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout.
mail.smtp.writetimeoutintSocket write timeout value in milliseconds. This timeout is implemented by using a java.util.concurrent.ScheduledExecutorService per connection that schedules a thread to close the socket if the timeout expires. Thus, the overhead of using this timeout is one thread per connection. Default is infinite timeout.

源自 JavaMail API,文末有链接。

三. 参数简介

  • mail.smtp.connectiontimeout:连接时间限制,单位毫秒。是关于与邮件服务器建立连接的时间长短的。默认是无限制。
  • mail.smtp.timeout:邮件接收时间限制,单位毫秒。这个是有关邮件接收时间长短。默认是无限制。
  • mail.smtp.writetimeout:邮件发送时间限制,单位毫秒。有关发送邮件时内容上传的时间长短。默认同样是无限制。

大部分博客、资料都提到了前两个属性,而容易忽略最后一个。因为我是用来发送邮件的,所以上传邮件的内容过大是导致发送模块阻塞的原因。而设置 writetimeout 时间后,再超时时就会报异常,捕获处理下就可以了。

四. 在 SpringBoot 中的配置

我所用的是 SpringBoot 工程,之前也发表过一篇有关 SpringBoot 配置邮件的博客:SpringBoot 配置邮件服务

只需要在原有配置的基础上,加上如下设置即可。

spring:
  mail:
	properties:
      mail:
        smtp:
          timeout: 10000
          connectiontimeout: 10000
          writetimeout: 10000

站在前人的肩膀上前行,感谢以下资料的支持。


原文作者: 一只因特马
原文链接: https://www.interhorse.cn/a/2959154794/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
设置JavaMail发送邮件,你需要按照以下步骤进行操作: 1. 导入相关的类库:首先,确保你的项目中已经导入了JavaMailJava Activation Framework(JAF)的相关类库。你可以从官方网站(https://javaee.github.io/javamail/)下载并添加这些类库到你的项目中。 2. 配置SMTP服务器信息:你需要指定SMTP服务器的地址和端口号。通常,SMTP服务器的地址是根据你使用的邮件服务提供商而不同。例如,对于Gmail来说,SMTP服务器地址是"smtp.gmail.com",端口号是587。 3. 创建Session对象:使用javax.mail.Session类创建一个Session对象。你可以通过使用Properties对象来设置Session的一些属性,例如SMTP服务器信息、是否需要身份验证等。 ```java Properties properties = new Properties(); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your-email@gmail.com", "your-password"); } }); ``` 在这里,你需要替换`your-email@gmail.com`和`your-password`为你自己的邮箱地址和密码。 4. 创建Message对象:使用javax.mail.Message类创建一个Message对象,并设置邮件发送者、接收者、主题和正文等信息。 ```java Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your-email@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient-email@example.com")); message.setSubject("Hello, World!"); message.setText("This is the content of the email."); ``` 在这里,你需要将`your-email@gmail.com`替换为你自己的邮箱地址,将`recipient-email@example.com`替换为邮件接收者的邮箱地址。 5. 发送邮件:使用Transport类的静态方法send()发送邮件。 ```java Transport.send(message); ``` 完整的示例代码如下: ```java import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class EmailSender { public static void main(String[] args) { Properties properties = new Properties(); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your-email@gmail.com", "your-password"); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your-email@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient-email@example.com")); message.setSubject("Hello, World!"); message.setText("This is the content of the email.");
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值