一、问题分析

  • org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses

  • 分析:可能是收件人或抄送人列表存在无效的地址

坑:不能直接catch到SendFailedException

二、解决方案

遍历异常,提取无效地址后过滤原地址列表再次发送

具体代码如下:

1.发邮件方法代码

    /**
* 发送html邮件
*
* @param to
* @param cc
* @param subject
* @param content
*/
public void sendHtmlMail(String[] to, String[] cc, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
try {
//true表示需要创建一个multipart message
helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setCc(cc);
helper.setSubject(subject);
helper.setText(content, true); mailSender.send(message);
logger.info("sendHtmlMail success.from:" + from);
} catch (Throwable e) {
logger.error("sendHtmlMail fail.", e);
String[] invalid = getInvalidAddresses(e);
if (invalid != null) {
sendHtmlMail(filterByArray(to, invalid), filterByArray(cc, invalid), subject, content);
}
}
}

2.从异常获取无效地址的方法代码

    /**
* 从异常获取无效地址
* @param e
* @return
*/
private static String[] getInvalidAddresses(Throwable e) {
if (e == null) {
return null;
}
if (e instanceof MailSendException) {
System.out.println("e instanceof SendFailedException");
Exception[] exceptions = ((MailSendException) e).getMessageExceptions();
for (Exception exception : exceptions) {
if (exception instanceof SendFailedException) {
return getStringAddress(((SendFailedException) exception).getInvalidAddresses());
}
}
}
if (e instanceof SendFailedException) {
return getStringAddress(((SendFailedException) e).getInvalidAddresses());
}
return null;
} /**
* 将Address[]转成String[]
* @param address
* @return
*/
private static String[] getStringAddress(Address[] address) {
List<String> invalid = new ArrayList<>();
for (Address a : address) {
String aa = ((InternetAddress) a).getAddress();
if (!StringUtils.isEmpty(aa)) {
invalid.add(aa);
}
}
return invalid.stream().distinct().toArray(String[]::new);
}

3.过滤发件人中无效地址的方法代码

    /**
* 过滤数组source,规则为数组元素包含了数组filter中的元素则去除
*
* @param source
* @param filter
* @return
*/
private static String[] filterByArray(String[] source, String[] filter) {
List<String> result = new ArrayList<>();
for (String s : source) {
boolean contains = false;
for (String f : filter) {
if (s.contains(f)) {
contains = true;
break;
}
}
if (!contains) {
result.add(s);
}
}
return result.stream().toArray(String[]::new);
}

org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses的更多相关文章

  1. 使用 QQ 邮箱发送邮件报错:java.net.SocketTimeoutException: Read timed out. Failed messages: javax.mail.MessagingException: Exception reading response

    使用 QQ 邮箱发送邮件报错:java.net.SocketTimeoutException: Read timed out. Failed messages: javax.mail.Messagin ...

  2. 使用mail架包发送邮件javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec

    这个错误是因为连接不上邮箱服务器导致的,可能有以下几个原因(以网易邮箱为例) 1.当使用第三方登录邮箱时需要有邮箱的授权码,且要开启POP3/SMTP/IMAP:服务 2.在代码中要调用网易邮箱的密码 ...

  3. 利用springframework+javax.mail发邮件(普通邮件、带附件邮件、HTML格式邮件)

    Spring提供了发送电子邮件的支持,可以发送普通邮件.带附件邮件.HTML格式邮件,甚至还可以使用Velocity模板定制化邮件内容. 一.引入相关的库 1 2 3 4 5 6 7 8 9 10 1 ...

  4. 使用Javax.mail 发送邮件

    使用Javax.mail 发送邮件 详细说明都在代码中: 引入依赖  <!--sun定义的一套接收.发送电子邮件的API-->    <dependency>      < ...

  5. javax.mail用smtp服务器发送带附件的邮件

    jar包: javax.mail-1.5.5.jar maven配置: <dependency> <groupId>com.sun.mail</groupId> & ...

  6. Java使用javax.mail.jar发送邮件并同意发送附件

    因为Java在开发网页上占有绝大优势.所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必定,网络安全一再安全我们须要把账号的安全级别提到更高.因此这些对于开发者也就成了必须掌握的技能!我一 ...

  7. Android 开发 使用javax.mail发送邮件。

    简介 sun公司开源的邮件发送工具. 依赖 implementation 'com.sun.mail:android-mail:1.6.0' implementation 'com.sun.mail: ...

  8. java使用javax.mail进行免费的邮件发送

    1. 建议发送方使用阿里云邮箱https://mail.aliyun.com/,阿里云默认是开启个人邮箱pop3.smtp协议的,所以无需在阿里云邮箱里设置,pop3.smtp的密码默认邮箱登录密码, ...

  9. javax.mail 遇到501 mail from address must be same as authorization user 的問題

    使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user ...

随机推荐

  1. 使用CoreData [4]

    使用CoreData [4] 此片文章主要是分析如何对CoreData进行封装. 在开始之前,我们需要弄明白3个非常关键的类,以下翻译凑合着看看. NSManagedObjectContext An ...

  2. CSS学习摘要-引入样式

    CSS学习摘要-引入样式 注:主要是摘录自MDN 网络开发者这个网站的. CSS 实际上如何工作? 当浏览器显示文档时,它必须将文档的内容与其样式信息结合.它分两个阶段处理文档: 浏览器将 HTML和 ...

  3. 修改Linux SSH连接端口和禁用IP,安装DDoS deflate

    测试系统:centos7 修改连接端口 修改配置文件 vi /etc/ssh/sshd_config 去掉port 22的注释,添加新的端口配置 port your_port_num 自定义端口选择建 ...

  4. APP案例分析——嘀嗒番茄钟

    第一部分 调研, 评测 个人第一次上手体验 一直在用时间管理的软件,但是下载了卸载,来来去去也用了很多个.这个嘀嗒番茄钟也是最近比较喜欢的软件,界面简洁,功能简单,没有那么复杂非常容易上手. 功能性的 ...

  5. 华为18.9.5校招笔试题AK

    26进制加法(一) 'a'-'z'代表十进制的0-25,求26进制加法.例如 'z'+'bc'= 'cb' 博主思路: 首先将长度不同的字符串高位补'a' 从低位开始将字符转换为10进制相加 计算进位 ...

  6. js 获取后缀参数

    function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  7. Paxos算法简单陈述

    上文二段式和三段式提交协议是相对比较容易理解的.1990年Leslie Lamport 提出的Paxos算法是一种基于消息传递且具有高度容错特性的一致性算法.但是Paxos算法比较复杂,对于不能沉心学 ...

  8. php表单笔记

    PHP获取表单值: $_POST    //获取POST提交 $_GET      //  获取GET提交 <!DOCTYPE html> <html> <head> ...

  9. Python Flask高级编程

    第1章 课程导语介绍课程的内容1-1 开宗明义 试看1-2 课程维护与提问 第2章 Flask的基本原理与核心知识本章我们首先介绍Python官方推荐的最佳包与虚拟环境管理工具:Pipenv.接着我们 ...

  10. Vue2.5开发去哪儿网App 从零基础入门到实战项目

    第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...