java STMP协议群发邮件时有无效地址导致发送邮件失败

   昨天高考结束,心里也是一番感慨,当初为了考一个好的学校,高三下学期的时候也是整天挑灯夜战,各种模拟试卷接连着做,结果也只是考了个普通的二本学校。想想当初也是一番血泪史呀。现在大学也毕业刚好三年了,做程序员也有3、4年了,现在也开始转战业务了,不怎么敲代码了,感觉经常ctrl+c,ctrl+v没什么意思,所以只有当有开发技术难点的时候才愿意专研一下。

     csdn伴随着我的成长,从刚一开始我就有打算记录自己开发道路上的点点滴滴,比如自己开发过程中碰到的技术难点,以及如何解决的,可是由于本人是有点懒惰,每次解决了一个技术难点都只是记录在自己的笔记文档中,因为在自己的笔记中只要记录关键的一些东西有时也随便截一个图,只要自己能看懂就行了。

    不知道今天怎地,可能因为这段时间很少开发了吧,觉得以后碰到个开发的问题还是记录一下比较好,刚好今天碰到个开发的问题。事情是这样的,刚到一个新公司,其中有个需求功能要用到群发邮件,话说这功能也简单,以前也做过,我就拿以前的代码过来直接用了,测试也没问题,项目上线后业务反映有个节点收不到邮件,好吧,有问题就解决呗,我debug了一下,发现确实发送失败了,看了thorw出的异常(javax.mail.SendFailedException: Invalid Addresses (com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 : Recipient address rejected: not found recipient account!),好家伙,错误显而易见是群发的邮件中有一个无效的邮箱(ps:这里的无效不是指不符合邮箱的格式),这个邮箱的格式没有问题,而是邮箱系统这个邮箱帐号不存在或者禁用了,那怎么办呢,我看了一下我的OA办公系统这个帐号是正常的,所以我也不能在这个系统将这个无效的帐号去掉,我也不可能为了这么个小功能在我的代码中连接邮箱系统判断这个邮箱地址是否被禁用或已经不存在了,因为我也不知道邮箱系统的数据库在哪,也不知道邮箱系统地址邮件存放在哪张表,更不知道邮箱系统怎么判断是否是有效邮箱地址。所以我就想能不能根源上在java这里就处理掉这个bug,所以我就想呀既然它抛出的异常输出的信息中有这个无效的邮箱地址,那说明这个异常类SendFailedException肯定包含了无效的邮箱地址,那是否也包含了有效的有效地址了,好家伙,利用eclipse自动补全的功能,我看了一下SendFailedException对象中的一些方法,找到了两个方法getInvalidAddresses()、getValidUnsentAddresses(),这两个方法分别为获取无效的地址和获取有效的未发送的邮箱,所以我获取到有效的邮箱地址之后再重新发送一次,问题完美解决。

代码如下:

catch (SendFailedException e) {//群发邮件时如果有无效的不存在或者禁用的地址邮件会发送失败,需要去除无用地址重新发送
   // TODO: handle exception
   result = false;
   Address[] invalid = e.getInvalidAddresses();
   if(invalid!=null){
    System.out.println("unsend mail: invalid address");
    for (int i = 0; i < invalid.length; i++) {
     System.out.println("invalid address:"+invalid[i]);
    }
   }
   Address[] validAddresses = e.getValidUnsentAddresses();
   if(validAddresses!=null){
    String[] toUsers = new String[validAddresses.length];
    for (int i = 0; i < validAddresses.length; i++) {
     toUsers[i] = validAddresses[i].toString().substring(0,
       validAddresses[i].toString().indexOf("@"));
    }
    sendFailEmail(fromUser, toUsers, title, content);
   }
   
  }
  catch (MessagingException e) {
   result = false;
   e.printStackTrace();
  }

纯手打,不喜勿喷,如果大家有更好的方法可以贴出来共享一下。

    





你可能感兴趣的:(java技术)