完美解决 javax.mail.SendFailedException: 与 com.sun.mail.smtp.SMTPAddressFailedException: 抛错

由于某个模块用到程序运行完后,自动收集结果发送邮件给相关人等。

邮件里有个地址貌似出问题,导致所有的收件人都发送不出去。

抛出的错误如下:

javax.mail.SendFailedException: Invalid Addresses;

nested exception is:

com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for [email protected]

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)

at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)

at javax.mail.Transport.send0(Transport.java:169)

at javax.mail.Transport.send(Transport.java:98)

at AtGroup.ServerBasicCheck.ServerCheck.sendMail(ServerCheck.java:1651)

at AtGroup.ServerBasicCheck.ServerCheck.callRun(ServerCheck.java:500)

at AtGroup.ServerBasicCheck.ServerCheck.main(ServerCheck.java:310)

Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for [email protected]

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)

... 6 more

图示: 抛错

这个是致使的错误呀,研究了半天。

改进代码如下:

图A: 首次发送邮件。

图B: 捕获并输出不可达邮件,组装新的可达邮件。

图C: 二次发送邮件。

部分代码如下

<span style="white-space:pre">	</span>try{
<span style="white-space:pre">			</span>Transport.send(msg);
			Out.println("the mail send successful First. "+Out.getNowDate());
		}catch(UnsupportedEncodingException e) { e.printStackTrace();
		}catch(SendFailedException  se) {
			 se.printStackTrace();
//			 Exception ex = me;
//			 if (ex instanceof SendFailedException) {}

				 Address[] unsend = se.getValidUnsentAddresses();
				 if(null!=unsend)
				 {
//					 Out.println(" ==valid Addresses");
					 String validAddress = "";
					 for(int i=0;i<unsend.length;i++){
					     validAddress += unsend[i] + ";";
//					     Out.println((i+1)+": " + unsend[i]);
					 }
					 validAddress = validAddress.substring(0,validAddress.length()-1);
//					 Out.println("All: "+validAddress);
//					 send the mail when mail address wrong.
<span style="white-space:pre">					</span> //调用再次发送代码
					 sendFailMail(new MimeMessage(mailSession), mailBody, mailFrom, validAddress);
				 }	 

		 }catch(MessagingException me) {me.printStackTrace();}

----------------------------------------------------------------------------

补调用代码:
    /**
     * email: [email protected]
     * site: www.aerchi.com
     * blog: http://blog.csdn.net/aerchi<span style="white-space:pre">	</span>
     */
    //send the mail when mail address wrong.
    public static void sendFailMail(Message msg, BodyPart mailBody, Address mailFrom, String mailTOAddress )
    {
    <span style="white-space:pre">	</span>try{   
    <span style="white-space:pre">		</span>Out.println("...Send the mail second time.");
    <span style="white-space:pre">		</span>msg.setSentDate(new Date());
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>msg.setFrom(mailFrom);<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>String[] mailTOArray=null;<span style="white-space:pre">		</span>
<span style="white-space:pre">			</span>mailTOArray=mailTOAddress.split(";");
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>InternetAddress[] mailTOAdd = null;
<span style="white-space:pre">			</span>mailTOAdd = new InternetAddress[mailTOArray.length];
<span style="white-space:pre">			</span>for(int a=0;a<mailTOArray.length;a++)<span style="white-space:pre">	</span>
<span style="white-space:pre">			</span>{
//<span style="white-space:pre">				</span>Out.println(mailTOArray[a]);
<span style="white-space:pre">				</span>mailTOAdd[a]= new InternetAddress(mailTOArray[a]);<span style="white-space:pre">				</span>
<span style="white-space:pre">			</span>}<span style="white-space:pre">	</span>
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>msg.setRecipients(Message.RecipientType.TO, mailTOAdd);<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>msg.setSubject(mailSubject);<span style="white-space:pre">						</span>

<span style="white-space:pre">			</span>Multipart mailMulti = new MimeMultipart(); <span style="white-space:pre">	</span>
//<span style="white-space:pre">			</span>mailBody.setContent(mainText, "text/html;charset=utf-8");<span style="white-space:pre">					</span>
<span style="white-space:pre">			</span>mailMulti.addBodyPart(mailBody);<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>msg.setContent(mailMulti);<span style="white-space:pre">			</span>
<span style="white-space:pre">		</span>
<span style="white-space:pre">			</span>Transport.send(msg);    
<span style="white-space:pre">			</span>Out.println("...the mail send successful Second. "+Out.getNowDate());
    <span style="white-space:pre">	</span>}catch(MessagingException me) {me.printStackTrace();}    <span style="white-space:pre">	</span>
    }

最后,大功靠成。如有地址不到到达,再也不用担心导致其它收件人不能收到邮件啦。

本文版本所 有,转载请注明原文地址。

本文地址:http://blog.csdn.net/aerchi/article/details/41692913

时间: 2024-10-12 21:00:56

完美解决 javax.mail.SendFailedException: 与 com.sun.mail.smtp.SMTPAddressFailedException: 抛错的相关文章

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

问题 org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses 分析:可能是收件人或抄送人列表存在无效的地址 坑:不能直接cach到SendFailedException 解决方案 遍历异常,提起无效地址后过滤原地址列表再次发送 具体代码如下: 1.发邮件方法代码 /** * 发送html邮件 * * @param to * @par

javax.imageio.IIOException: Can&#39;t read input file!完美解决

今天遇到一个问题,上图 这段代码主要是给图片添加水印 后来百度发现可能是图片的路径出了问题,因为是动态获取的图片地址,然后我把地址打印出来了 之后通过终端查看,果然没有 之后我在classes目录找到了文件 这时焕然大悟 因为我的图片文件一开始是放在main文件夹的resources文件夹中的,在文件编译时,会被放在classes文件夹中.. 然而我的测试代码是运行在test文件夹的,test文件夹中的resources文件夹中的内容会被放在test-classes文件夹. 代码中动态获取路径时

com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user

1.错误描写叙述 553 Mail from must equal authorized user com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333) at com.sun.mail.smtp.SMTPTransport.mail

Eclipse下Maven新建Web项目index.jsp报错完美解决(war包)

Eclipse下Maven新建Web项目步骤 1. 2. 3. 4. 5. 问题描述 最近用eclipse新建了一个maven项目,结果刚新建完成index.jsp页面就报错了,先把错误信息贴出来看看! 解决方法 第一种:直接在pom.xml文件中添加jar包支持 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <

javaMail异常 NoClassDefFoundError: com/sun/mail/util/LineInputStream

本博客部分参考: http://blog.csdn.net/5iasp/article/details/5935428 中的解决方案. 但是个人认为到jdk中去删除重复的jar包是不合适的,在eclipse中带有多个版本的jre,如果说jdk1.5版本中存在mail.jar那么可以考虑降低jdk版本. 参考方式:重建工程,在工程中选择 选择完成后,导入相关的jar包,以及demo即可.貌似只需要导入mail.jar即可发送邮件. 发送邮件案例参考:http://www.yiibai.com/ja

Springboot admin 发送邮件失败:com.sun.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user

发邮件已经是老生常谈了,今天又遇到了,而且又出了各种问题.我晕哦. 我的配置是: spring.mail.host=smtp.163.com spring.mail.username=klxxxx spring.mail.password=qwer1234 spring.boot.admin.notify.mail.to=[email protected] 出现了553: 2019-02-13 11:29:21.022 WARN 18964 --- [ctor-http-nio-3] d.c.b

谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!

谷歌.火狐浏览器下实现JS跨域iframe高度自适应的解决方法 导读:今天开发的时候遇到个iframe自适应高度的问题,相信大家对这个不陌生,但是一般我们都是在同一个项目使用iframe嵌套页面,这个ifame高度自适应网上一搜一大把,今天要讲的如何在不同的网站下进行相互的调用跟在同一个网站下是一个效果:例如我在自己的项目里面Iframe  了第一博客的页面  http://www.diyibk.com/   当第一博客的页面高度变化了怎么通知父页面呢? 这个时候在谷歌下肯定是拿不到 ifram

完美解决office2013 错误1402

遇到1402问题  按照网络上的帖子都无法解决,老提示无权限更改,原来只是少了一个步骤而已!经本人多次试验,已经完美解决,现在上图! 步骤  肯定是得先出现错误,找到注册表所在项! 这个就不赘述,通过运行,regedit,按着找就行了啦~  就是这个,无权限~~只要右击该项,点权限,点确定  这里点添加  输入:administrator  确定 勾选完全控制,然后点高级~ 最关键的一步!!在所有者这里点击一下administrators  然后再点击一下应用,然后确定返回~!  快要完成了~

完美解决IE8有两个进程的问题

完美解决IE8有两个进程的问题,照以下方法设置后就只有一个进程了,没有什么负影响哦! 方法: 1.win+R,在运行框里输入:gpedit.msc,回车进入组策略设置. 2.依次展开:计算机配置——管理模板——windows组件——Internet Explorer. 3.在Internet Explorer选项下面,找到“设置选项卡进程增长”,配置值为0. 提示:1是IE8的默认值,使用这种默认设置后会使你产生相当混乱的感觉,虽然说采用了颜色来标识页面的相关性,但至少我是很不喜欢,当上面的进程