java - JavaMail 连接超时不按属性工作
问题描述
使用的 Javax 邮件版本 1.6.2
手动设置 JavaMailSender
我用 mail.smtp.timeout 和 mail.smtps.timeout 尝试过的超时。
而且,我尝试了字符串和整数值 3000。
String timeOut = "3000";
Properties pros = new Properties();
pros.put("mail.smtp.timeout", timeOut);
pros.put("mail.smtp.connectiontimeout", timeOut);
pros.put("mail.smtp.writetimeout", timeOut);
pros.put("mail.smtp.auth", "true");
pros.put("mail.smtp.starttls.enable", "true");
jmailSender.setJavaMailProperties(pros);
return jmailSender;
大约需要 7 秒,没有任何失败。由于默认情况下是无限的,所以很可能它没有以某种方式设置
是否缺少任何属性或其他内容?
解决方案
属性mail.smtp.connectiontimeout
和 `mail.smtps.connectiontimeout仅在建立连接时适用。它与传输期间的任何超时无关。
属性mail.smtp.timeout
和mail.smtps.timeout
与阻塞等待读取的时间有关。这与读取 SMTP 响应代码有关。
属性mail.smtp.writetimeout
和mail.smtps.writetimeout
与写入大小不同的数据块有关。
这些超时都不代表发送 mime 消息的单个事务的最后期限。正在发生的事情是没有超过 3000 毫秒的单个操作(连接、读取、写入)。
例如,连接可能需要 1000 毫秒,然后是 30 个请求(写入)和响应解析(读取),需要 100 毫秒,以及一组说 3 次写入以发送消息,每个需要 1000 毫秒,因为网络速度和大小消息。即 1000 + (30 * 100) + (3 * 1000) = 7000 毫秒总时间,但没有单个操作超过超时。
在测试环境中
- 将所有超时设置为 3000。
- 设置
connectimeout
为 1 并测试。您应该看到连接失败。 - 通过将其设置回 3000 并设置
timeout
为 1 来重新启动测试。您应该会看到读取失败。 - 通过将其设置回 3000 并设置
writetimeout
为 1 重新启动测试。您应该会看到传输失败。
如果测试没有以这种方式运行,您要么没有正确设置属性(错字或 smtp 与 smtps)。或者你真的很幸运有这么低的延迟。
推荐阅读
- python - 如何从 Python 中添加和修改 QML QtCharts 中的数据?
- design-patterns - 避免使用带有其他方法的通用接口进行强制转换
- android - 辅助显示器 DisplayMetrics 依赖于主显示器?
- arrays - 使用可观察函数数组,每个项目输出是下一个项目输入
- angular - 以编程方式设置动态添加的子组件的属性
- list - Thymeleaf ,地图对象,其值为地区列表。?
- python - 将 Jupterlab ipynb 转换为可执行文件
- vagrant - Vagrant IP 地址冲突问题
- c# - 如何让 LookAt 对齐 transform.up 向量而不是 transform.forward?
- g++ - G++ 没有找到 CoInitializeEx(和其他几个函数)?