[乐意黎原创] 完美解决 javax.mail.SendFailedException: Invalid Address 与 SMTPAddressFailedException 抛错

本文解决邮件发送中遇到的SendFailedException错误,通过跳过无效地址并重新发送邮件,确保所有有效地址都能接收到邮件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

       由于某个模块用到程序运行完后,自动收集结果发送邮件给相关人等。假如邮件收件人里某个地址貌似出问题,会导致所有的收件人地址都发送不出去。

抛出的错误如下:

javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
        com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for aerchi@gmail.com
        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 aerchi@gmail.com
        at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)
        ... 6 more

图示: 抛错

 

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

改进代码如下:(跳过错误或不可达的收件人地址

 

图A: 首次发送邮件。


 

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

 

图C: 二次发送邮件。

 

部分代码如下: 

try{
    Transport.send(msg);
//  Transport.sendMessage(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.
        sendFailMail(new MimeMessage(mailSession), mailBody, mailFrom, validAddress);
    }  
             
}catch(MessagingException me) {me.printStackTrace();}

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

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

 

最后,大功靠成。如有地址错误或不可到达(会自动跳过),保证能够对其它有效地址发送邮件,再也不用担心导致其它收件人不能收到邮件啦。

图示: 发送成功日志

 

文章版权归作者[Aerchi]所 有,请勿采集,转载务必请注明作者及原文地址。

 

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值