org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses
一、问题分析
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的更多相关文章
- 使用 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 ...
- 使用mail架包发送邮件javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec
这个错误是因为连接不上邮箱服务器导致的,可能有以下几个原因(以网易邮箱为例) 1.当使用第三方登录邮箱时需要有邮箱的授权码,且要开启POP3/SMTP/IMAP:服务 2.在代码中要调用网易邮箱的密码 ...
- 利用springframework+javax.mail发邮件(普通邮件、带附件邮件、HTML格式邮件)
Spring提供了发送电子邮件的支持,可以发送普通邮件.带附件邮件.HTML格式邮件,甚至还可以使用Velocity模板定制化邮件内容. 一.引入相关的库 1 2 3 4 5 6 7 8 9 10 1 ...
- 使用Javax.mail 发送邮件
使用Javax.mail 发送邮件 详细说明都在代码中: 引入依赖 <!--sun定义的一套接收.发送电子邮件的API--> <dependency> < ...
- javax.mail用smtp服务器发送带附件的邮件
jar包: javax.mail-1.5.5.jar maven配置: <dependency> <groupId>com.sun.mail</groupId> & ...
- Java使用javax.mail.jar发送邮件并同意发送附件
因为Java在开发网页上占有绝大优势.所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必定,网络安全一再安全我们须要把账号的安全级别提到更高.因此这些对于开发者也就成了必须掌握的技能!我一 ...
- Android 开发 使用javax.mail发送邮件。
简介 sun公司开源的邮件发送工具. 依赖 implementation 'com.sun.mail:android-mail:1.6.0' implementation 'com.sun.mail: ...
- java使用javax.mail进行免费的邮件发送
1. 建议发送方使用阿里云邮箱https://mail.aliyun.com/,阿里云默认是开启个人邮箱pop3.smtp协议的,所以无需在阿里云邮箱里设置,pop3.smtp的密码默认邮箱登录密码, ...
- javax.mail 遇到501 mail from address must be same as authorization user 的問題
使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user ...
随机推荐
- RedHat 7 安装PostgreSQL 10.5
系统环境 Redhat: Version: 7.4.1708 Architecture: x86_64 Address: 10.127.1.11 User: root Uassword: redhat ...
- php5 Array 数组函数
函数 描述 array() 创建数组. array_change_key_case() 把数组中所有键更改为小写或大写. array_chunk() 把一个数组分割为新的数组块. array_colu ...
- Centos7 apache2.4.29(httpd) 安装
重点参考文章:https://blog.csdn.net/MrDing991124/article/details/78829184 写的很详细了,自己按着改博文走了不遍,不错! 一.配置安装环境 ...
- PFC电源设计与电感设计计算学习笔记
PFC电源设计与电感设计计算 更新于2018-11-30 课程概览 常见PFC电路和特点1 常见PFC电路和特点1 CRM PFC电路设计计算 CCM PFC电路设计计算 CCM Interleave ...
- September 18th 2017 Week 38th Monday
The only person you should try to be better than is the person you were yesterday. 你唯一应该试着去超越的人,是昨天的 ...
- MongoDB 多实例安装成服务
转发自:https://www.cnblogs.com/GainLoss/p/6906937.html 1.在mongodb的官网上下载安装包 https://www.mongodb.com/down ...
- 来自苹果的编程语言——Swift简单介绍【整理】
2014年06月03日凌晨,Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS& ...
- 4514: [Sdoi2016]数字配对
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
- 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1582 Solved: 870 [Submit][S ...
- 课后实践之mybash20155314
课后实践之mybash 实践要求 加分题-mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接 ...