java mail集成james判断邮件是否发送成功

项目场景:

        java mail集成james邮件服务器,发送邮件时需要判断邮件是否发送成功。我们会发现JavaMail给用户发送邮件,但是调用Transport类的sendMessage方法发送的邮件是没有返回值的,所以判断不了。

        但是我们可以用另一个解决方案,就是采用“系统退信”的方式来达到目的,我们会发现163、qq等邮件发送失败就会“系统退信”。


需求

什么情况下会系统退信

  1. 邮箱地址错误或访问不通;
  2. 邮箱地址正确,但是用户不存在;

解决方案:

修改james配置,windows文件路径:james\apps\james\SAR-INF\config.xml,搜索关键字:maxRetries

原内容:

<mailet match="All" class="RemoteDelivery"><outgoing>file://var/mail/outgoing/</outgoing><!-- Delivery Schedule based upon RFC 2821, 4.5.4.1 --><!-- 5 day retry period, with 4 attempts in the firsthour, two more within the first 6 hours, and thenevery 6 hours for the rest of the period. --><delayTime>  5 minutes </delayTime><delayTime> 10 minutes </delayTime><delayTime> 45 minutes </delayTime><delayTime>  2 hours </delayTime><delayTime>  3 hours </delayTime><delayTime>  6 hours </delayTime><maxRetries> 25 </maxRetries><!-- The number of threads that should be trying to deliver outgoing messages --><deliveryThreads> 50 </deliveryThreads><!-- If false the message will not be sent to given server if any recipients fail --><sendpartial>false</sendpartial><!-- By default we send bounces to the "bounce" processor --><!-- By removing this configuration James will fallback to hardcoded bounce --><!-- notifications --><bounceProcessor>bounces</bounceProcessor>
</mailet>

修改后的内容:

<mailet match="All" class="RemoteDelivery"><outgoing>file://var/mail/outgoing/</outgoing><!-- Delivery Schedule based upon RFC 2821, 4.5.4.1 --><!-- 5 day retry period, with 4 attempts in the firsthour, two more within the first 6 hours, and thenevery 6 hours for the rest of the period. --><delayTime>  1 minutes </delayTime><maxRetries> 1 </maxRetries><!-- The number of threads that should be trying to deliver outgoing messages --><deliveryThreads> 50 </deliveryThreads><!-- If false the message will not be sent to given server if any recipients fail --><sendpartial>true</sendpartial><!-- By default we send bounces to the "bounce" processor --><!-- By removing this configuration James will fallback to hardcoded bounce --><!-- notifications --><bounceProcessor>bounces</bounceProcessor>
</mailet>

其实就是改了delayTime、maxRetries、sendpartial这三个标签

......<delayTime>  1 minutes </delayTime>
<maxRetries> 1 </maxRetries><sendpartial>true</sendpartial>......

 

解析:

这段内容就是邮件发送失败,重试的机制,这个outgoing文件夹里面就是需要重试的邮件

delayTime:重试的时间

maxRetries:最大重试次数

sendpartial:如果为true,任何收件人失败,会将消息发送到给定的服务器

所以原来默认是:

5天重试期,第一次尝试4次小时,前6小时内再增加两次,然后在剩余时间内,每6小时一次。

需要重试5天,时间太长了

我们改为了1分钟后只重试1次

我测试这应该是最短的间隔了,试了0.5minutes和1second好像没效果。


结果:

接收退信,就平时接收邮件一样就行了,在inboxes文件夹

  • 邮箱地址错误或访问不通,测试的邮箱地址:test@test.com,系统退信的邮件内容
    Hi. This is the James mail server at XT-PC.
    I'm afraid I wasn't able to deliver your message to the following addresses.
    This is a permanent error; I've given up. Sorry it didn't work out.  Below
    I include the list of recipients and the reason why I was unable to deliver
    your message.Failed recipient(s):
    test@test.comError message:
    There are no DNS entries for the hostname test.com.  I cannot determine where to send this message.
  • 邮箱地址正确,但是用户不存在,测试的邮箱地址:test1111@163.com,系统退信的邮件内容
    Hi. This is the James mail server at XT-PC.
    I'm afraid I wasn't able to deliver your message to the following addresses.
    This is a permanent error; I've given up. Sorry it didn't work out.  Below
    I include the list of recipients and the reason why I was unable to deliver
    your message.Failed recipient(s):
    test1111@163.comError message:
    550 User not found: test1111@163.com

总结:

缺点:不能实时反馈发送的结果

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

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

相关文章

TDI网络过滤驱动应用(一)

文章目录 TDI网络过滤驱动应用1. 技术概览2. 数据包的抓取3. 应用实例3.1 TrafficShaper(限流)3.2 DnsRedirector(DNS重定向)3.3 TcpRedirector(TCP重定向) 4. 总结与参考 TDI网络过滤驱动应用 在前面的文章中&#xff0c;我们分析了TDI网络过滤驱动的基本开发框架以及TDI网络…

C/C++ 实现FTP文件上传下载

FTP&#xff08;文件传输协议&#xff09;是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一&#xff0c;为文件的上传、下载和文件管理提供了一种标准化的方法&#xff0c;在Windows系统中操作FTP上传下载可以使用WinINet库&#xff0c;WinINet&#xff…

微服务--07--Seata 分布式事务

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务1.认识Seata2.部署TC服务2.1.准备数据库表2.2.准备配置文件2.3.Docker部署 3.微服务集成Seata3.1.引入依赖3.2.改造配置3.3.添加数据库表3.4.测试 分布式…

什么是网络安全 ?

网络安全已成为我们生活的数字时代最重要的话题之一。随着连接设备数量的增加、互联网的普及和在线数据的指数级增长&#xff0c;网络攻击的风险呈指数级增长。 但网络安全是什么意思&#xff1f; 简而言之&#xff0c;网络安全是一组旨在保护网络、设备和数据免受网络攻击、…

Zabbix“专家坐诊”第213期问答汇总

问题一 Q&#xff1a;Zabbix报错&#xff1a;Zabbix server is not running :the information displayed may not be current&#xff0c;是什么问题呢&#xff1f; A&#xff1a; 1、数据库软件问题导致导入的zabbix数据库不完整2、zabbix Server配置问题3、zabbix-server没…

大数据基础设施搭建 - Maxwell

文章目录 一、上传压缩包二、解压压缩包三、启用MySQL Binlog3.1 修改MySQL配置文件3.2 重启MySQL服务3.3 测试 四、创建Maxwell所需数据库和用户4.1 创建数据库4.2 调整MySQL数据库密码级别4.3 创建Maxwell用户并赋予其必要权限4.4 测试 五、修改配置文件5.1 修改Maxwell配置文…

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统&#xff08;SOPC&#xff09;的设计 在进行系统设计时&#xff0c;倘若系统非常复杂&#xff0c;采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式&#xff0c;工作量无疑是巨大的&#xff0c;这时调用 MicroBlaze 软核…

laravel 重写批量添加,自动维护时间戳

laravel 自带的批量添加是不会自动维护时间戳的&#xff0c;意思是说&#xff0c;使用laravel的批量添加&#xff0c;时间戳字段不会插入&#xff0c;也不会在更新的时候进行更新。 使用继承或者trait来解决这个问题&#xff0c;在这里感谢Mr.wen <?php namespace App\Mo…

作 业

1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 mysql> SELECT d.deptno AS 部门编号, d.dname as 部门名称, d.loc as 部门位置, COUNT(e.empno) as 部门人数 FROM dept d JOIN employee e ON d.deptno e.deptno GROUP BY d.deptno, d.dname…

LeetCode 1657. 确定两个字符串是否接近:思维题

【LetMeFly】1657.确定两个字符串是否接近&#xff1a;思维题 力扣题目链接&#xff1a;https://leetcode.cn/problems/determine-if-two-strings-are-close/ 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&…

nvm 下载node时候下载不到npm包的解决方法

个人博客链接 公众号-nvm 下载node时候下载不到npm包的解决方法 求关注 可以跳过的背景 最近项目比较有空&#xff0c;所以就可以有时间写一些demo&#xff0c;主要测试下react的一些语法&#xff0c;毕竟自己上次写react已经是22年的7月份了,期间对于react-router等的hook…

Java中的Integer.bitCount浅析

文章目录 Java中的Integer.bitCount浅析问题思考Integer.bitCount解释拓展 Java中的Integer.bitCount浅析 原文链接 问题 有一个整数x,我们需要统计该整数的二进制表示中包含的1的个数。这个也被称为汉明重量&#xff08;Hamming weight&#xff09;。 例如&#xff0c;整数…

000 - 前言

目录 问题1&#xff1a;学Qt之前是不是得先把C基础打好才行&#xff1f;会一点点C可以学吗&#xff1f; 问题2&#xff1a;我已经会 PyQt 了&#xff0c;还有必要再学 Qt 吗&#xff1f; 问题3&#xff1a;Qt 和 QML 学哪个比较好呢&#xff1f; 大家好呀~ 我是角角。从今天…

创建JDK8版本的SpringBoot项目的方法

目录 一.通过阿里云下载 二.通过IDEA创建 1.下载安装JDK17 2.创建SpringBoot 3.X的项目 3.把JDK17改成JDK8 截止到2023.11.24&#xff0c;SpringBoot不再支持3.0X之前的版本&#xff0c;3.0X之后的版本所对应的JDK版本为JDK17&#xff0c;下面介绍如何在idea上继续使用JDK…

解析javascript数组方法 find 和 filter 有何区别

首先用一个案例可以很直观的看到 find 和 filter 的区别&#xff1b; 相同点&#xff1a; 两者分别可以接受三个参数&#xff1a;当前元素、当前索引、整个数组&#xff1b;两者都可以用来查找数组中符合条件的元素&#xff1b; 不同点&#xff1a; find&#xff1a; 用于查…

YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器

💡本篇内容:YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器 💡🚀🚀🚀本博客 YOLO系列 + 改进NanoDet模型的动态标签分配策略源代码改进 💡一篇博客集成多种创新点改进:VFL损失函数 + Nanodet…

C/C++不定参数的使用

文章目录 C语言的不定参C的不定参 C语言的不定参 C语言的不定参数最常见的应用示例就是printf函数&#xff0c;如下&#xff0c;参数列表中的...表示不定参数列表 #include <stdio.h> int printf(const char *format, ...);试着模拟实现C语言的printf函数 void myprin…

Android:BackStackRecord

BackStackRecord:fragment回退栈,继承自FragmentTransaction,并且实现了OpGenerator接口,OpGenerator接口用来添加或弹出事务的,后面会提到。 从《Android:从源码看FragmentManager如何工作》文章知道,每次beginTransaction会创建一个BackStackRecord对象,改对象持有f…

C++基础——文件操作

文章目录 1 概述2 文本文件2.1 写文件2.1.1 写文件流程2.1.2 文件打开方式 2.2 读文件 3 二进制文件3.1 写文件3.2 读文件 1 概述 程序最基本的操作之一就是文件操作&#xff0c;程序运行时的数据都是临时数据&#xff0c;当程序结束后就不复存在了。通常都是通过文件或其他持…

【vue实战项目】通用管理系统:信息列表,信息录入

本文为博主的vue实战小项目系列中的第六篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…