首页 > 其他分享 >邮件发送兜底邮箱策略 - SMTPSendFailedException: 421 4.4.5 HL:ICC

邮件发送兜底邮箱策略 - SMTPSendFailedException: 421 4.4.5 HL:ICC

时间:2024-11-28 19:11:22浏览次数:8  
标签:4.4 String SMTPSendFailedException ICC SMTP 发送 MAIL 邮件 SOCKET

邮件发送兜底邮箱策略 - SMTPSendFailedException: 421 4.4.5 HL:ICC

项目测试和生产环境使用的都是163企业邮箱发送,如果测试和生产定时任务在同一时间会产生如上163的提示报错。
并且增加了重试机制,邮件发送失败后,重试2次,间隔30秒。
服务邮件发送服务优化-增加重试机制和减少并发,测试环境和生产环境的xxlJob执行错开时间,且将测试环境的定时任务暂停。

解决方案:
1.邮件发送失败,增加失败重试发送机制。
2.测试环境的定时任务邮件发送错开时间,暂停发送。减少对线上同一个邮件任务的并发发送的冲突
3.邮件地址不存在或错误的地址,更正。

1.针对邮件列表中邮箱地址不存在的情况(离职人员的邮箱地址不存在),增加了补充兜底的可确定的邮箱地址来接收,避免邮件发送失败而不可知。
javax.mail.SendFailedException: Invalid Addresses 邮件地址错误,兜底发送。
2.成员变量的赋值。 否则都是 list为空
3.邮件发送返回成功和失败标识 @Async 异步不能返回,捕获异常。需要接口的返回值,需要去掉@Async
4.设计思路:
1.两份邮件,邮件收件人的地址配置分开单独配置,为了后续的扩展。可以允许单独配置,比较灵活。
2.两份邮件,数据查询的实体类Entity分开创建,为了后续的扩展。
5.//使用465

final String SSLport="465";
final String sslFactory = "javax.net.ssl.SSLSocketFactory";
props.put("mail.smtp.port", SSLport);
props.put("mail.smtp.socketFactory.class", sslFactory);
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.socketFactory.port", SSLport);

//参考源码(commons-email:1.3.3):org.apache.commons.mail.Email.java
SimpleEmail.java

EmailConstants.java
public static final String MAIL_SMTP_SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback";
public static final String MAIL_SMTP_SOCKET_FACTORY_CLASS = "mail.smtp.socketFactory.class";
public static final String MAIL_SMTP_SOCKET_FACTORY_PORT = "mail.smtp.socketFactory.port";
public static final String MAIL_PORT = "mail.smtp.port";
                
Email.java
protected String sslSmtpPort = "465";
@Deprecated
public static final String MAIL_PORT = EmailConstants.MAIL_PORT;
@Deprecated
public static final String MAIL_SMTP_SOCKET_FACTORY_PORT = EmailConstants.MAIL_SMTP_SOCKET_FACTORY_PORT;
@Deprecated
public static final String MAIL_SMTP_SOCKET_FACTORY_CLASS = EmailConstants.MAIL_SMTP_SOCKET_FACTORY_CLASS;
@Deprecated
public static final String MAIL_SMTP_SOCKET_FACTORY_FALLBACK = EmailConstants.MAIL_SMTP_SOCKET_FACTORY_FALLBACK;
    
if (isSSLOnConnect())
{
    properties.setProperty(MAIL_PORT, this.sslSmtpPort);
    properties.setProperty(MAIL_SMTP_SOCKET_FACTORY_PORT, this.sslSmtpPort);
    properties.setProperty(MAIL_SMTP_SOCKET_FACTORY_CLASS, "javax.net.ssl.SSLSocketFactory");
    properties.setProperty(MAIL_SMTP_SOCKET_FACTORY_FALLBACK, "false");
}

6.发信频率过高的解决办法——降低频率
可以通过设置线程 或将邮件先存入数据库再设置定时JOB发送的方式实施

参考:Spring异常重试框架Spring Retry 重试机制应用
https://www.cnblogs.com/oktokeep/p/18279179

//伪代码
@Retryable(value = {RetrySendEmailException.class},maxAttempts = 3,backoff = @Backoff(delay=60000, multiplier = 2))
public boolean sendEmailLog(ReqEmail req,boolean isDelay) throws Exception{
        //将本次的请求对象转换为json,做md5,避免重复发送
        
        //如果是重试发送,则需要绕过 重复发送的拦截
        /**
         * 发送失败重试,则无需该拦截判断
         */
        if(req.isRetrySendFlag() == false && emailLogMapper.getEmailLogExists(md5) > 0){
            throw new CommonEmailException(ErrorCode.SEND_SAME_ERROR);
        }
        if(req.isRetrySendFlag()){
            //产生新的md5标识,继承上一次的标识。 重新赋值
            LocalDateTime ldt = LocalDateTime.now();
            String minute = String.valueOf(ldt.getMinute());
            String second = String.valueOf(ldt.getSecond());
            md5 = md5 +"-"+ minute+second;
            entity.setEmailContentMd5(md5);
        }
        
        //发送邮件
        sendFlag = sendEmail();
        
        if(sendFlag == false){
            logger.info("发送异常,重新发送>>>[],retryFlag=[{}]", req.getEmailSubject(),req.isRetrySendFlag());
            //重新赋值,表示需要重试发送邮件。在下一次的执行中,请求对象用应用该新值。
            req.setRetrySendFlag(true);
            throw new RetrySendEmailException("999999","发送异常,重新发送");
        }
}

备注:maxAttempts = 3,backoff = @Backoff(delay=60000, multiplier = 2)
测试下来:执行了2次重试,每次间隔30秒。而不是1分钟。

标签:4.4,String,SMTPSendFailedException,ICC,SMTP,发送,MAIL,邮件,SOCKET
From: https://www.cnblogs.com/oktokeep/p/18574996

相关文章

  • Windows下安装 和使用Memcached,附memcached-win64-1.4.4-14安装包
    前言大家好,我是小徐啊。memcached是我们在Java开发中常用到的一款软件,主要用作缓存来使用。但是windows下的安装包比较难找。我之前通过好多方法,终于找到了memcached的windows的安装包。今天就来介绍下如何在windows下安装和使用memcached。文末附获取方式。如何安装首先,需要将......
  • ABP aspnetzero power toole 最新 4.4.0 和谐记录
    参照之前的记录.netzeropowertoole破解日志在用工具创建模型后,点击生成的过程.会在代码目录生成AspNetZeroRadTool的文件夹.总是会覆盖.AspNetZeroRadTool的文件夹中生成当前模型的json文件执行dotnetAspNetZeroRadTool模型.json生成文件所以要处理的......
  • YOLOv10改进,YOLOv10添加DynamicConv(动态卷积),CVPR2024,二次创新C2f结构
    摘要大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低FLOPs模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用DynamicConv动态卷积将额外的参......
  • YOLOv11改进策略【Head】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进检测头, 优化
    一、本文介绍本文记录的是利用DynamicConv优化YOLOv11的目标检测网络模型。在大规模训练中,模型的参数量越多,FLOPs也越高,但在一些对计算资源有限制的场景下,需要低FLOPs的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOPs,因此Dynamic......
  • 第六届土木建筑与城市工程国际学术会议(ICCAUE 2024) 2024 6th International Conferenc
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍第六届土木建筑与城市工程国际学术会议(ICCAUE2024)将于2024年......
  • YOLOv11改进策略【卷积层】| ICCV-2023 SAFM 空间自适应特征调制模块 对C3k2进行二次
    一、本文介绍本文记录的是利用空间自适应特征调制模块SAFM优化YOLOv11的目标检测方法研究。SAFM通过更好地利用特征信息来实现模型性能和效率的平衡。本文通过二次创新C3k2,能够动态选择代表性特征,并结合局部上下文信息,提升模型的检测精度。专栏目录:YOLOv11改进目录一览......
  • Wireshark 4.4.1 震撼发布!修复了多个安全漏洞,带来了诸多性能改进和新特性
    你好,这里是网络技术联盟站,我是瑞哥。网络协议分析工具领域迎来了又一重磅更新——Wireshark4.4.1版本正式发布!作为全球最受欢迎的网络协议分析工具,Wireshark在网络分析、故障排除、开发和教育中扮演着不可替代的角色。此次更新不仅修复了多个安全漏洞和已知问题,还带来......
  • 常见的公共 DNS 服务器地址有:谷歌 DNS:8.8.8.8 和 8.8.4.4阿里云 DNS:223.5.5.5 和 223.
    常见的公共DNS服务器地址有:谷歌DNS:8.8.8.8和8.8.4.4阿里云DNS:223.5.5.5和223.6.6.6腾讯DNS:119.29.29.29和182.254.116.116阿里公共DNS:IPv4:223.5.5.5、223.6.6.6IPv6:2400:3200::1、2400:3200:baba::1腾讯公共DNS(DNSPod):IPv4:119.29.29.29IPv6:2402:4e00::百......
  • 【2024潇湘夜雨】WIN10_LTSC2021_21H2.19044.4957软件选装纯净特别版9.26
    【系统简介】=============================================================1.本次更新母盘来自WIN10_LTSC2021_21H2.19044.4957.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为19044.49......
  • ubuntu22.04编译安装R4.4.1
    1.卸载当前版本的R:为了确保之前安装的R版本不会干扰,先卸载它:sudorm-rf/opt/R/4.4.1sudorm/usr/local/bin/Rsudorm/usr/local/bin/Rscript2.安装所需依赖:确保编译R所需的依赖已经安装:sudoapt-getupdate&&\sudoapt-getinstall-ybuild-essentialli......