javamail解决附件乱码

 Object out_content = message[i].getContent();
 if (!(out_content instanceof Multipart)){//不是复合邮件体,既是不带附件。
              partname = new String[0];
              return partname;
           }

如果是复合邮件体,那么就可以调用如下的方法取得中文文件名:
public  static  String  getISOFileName(Part  body){  
	    // 设置一个标志,判断文件名从Content-Disposition中获取还是从Content-Type中获取
	  boolean  flag=true;  
	 if(body==null){  
	      return  null;  
	  }  
	  String[]  cdis;  
	    try{  
	            cdis=body.getHeader("Content-Disposition");  
	    }  
	    catch(Exception  e){  
	            return  null;  
	    }  
	    if(cdis==null){  
	            flag=false;  
	    }  
	    if(!flag){  
        try{  
                cdis=body.getHeader("Content-Type");  
        }  
        catch(Exception  e){  
                return  null;  
        }  
	    }  
	    if(cdis==null){  
	            return  null;  
	    }  
	    if(cdis[0]==null){  
	            return  null;  
	    }  
	    // 从Content-Disposition中获取文件名
	    if(flag){  
        int  pos=cdis[0].indexOf("filename=");  
        if(pos<0){  
                return  null;  
        }  
        // 如果文件名带引号
        if(cdis[0].charAt(cdis[0].length()-1)=='"'){  
                return  cdis[0].substring(pos+10,cdis[0].length()-1);  
        }  
        return  cdis[0].substring(pos+9,cdis[0].length());  
	    }else{  
        int  pos=cdis[0].indexOf("name=");  
        if(pos<0){  
                return  null;  
        }  
        // 如果文件名带引号
        if(cdis[0].charAt(cdis[0].length()-1)=='"'){  
                return  cdis[0].substring(pos+6,cdis[0].length()-1);  
        }  
        return  cdis[0].substring(pos+5,cdis[0].length());  
	    }  
	}  

但是有一种情况下,取得的中文文件名也是乱码,原因有的邮件服务器在发送邮件时,对附件名进行了特殊的编码,解决如上问题的方法如下:
1)用如上的方法取得中文文件名:
String filename= new String(getISOFileName(part).getBytes("ISO-8859-1"),"gb2312");

2)然后创建文件,如果发生FileNotFoundException异常,说明取得的文件名是经过特殊编码的--我们取得到的未解码的,是乱吗,那么就要用javamail提供的函数decodeText进行解码。具体方法如下:
try{
        myFileoutputstream= new FileOutputStream(filename);
    }catch(FileNotFoundException fe){
        try{
              if (filepath.exists()){
                 filename = new File(filepath,MimeUtility.decodeText(getISOFileName(part)));
   }catch(Exception e){
    System.out.println("getpart(int i)重新生成文件:"+e.toString());
    }
   }catch(Exception e){
    System.out.println("getpart(int i)重新生成文件:"+e.toString());
    }
}

经过如上步骤,就能彻底解决javamail附件中文名乱码问题了。

你可能感兴趣的:(javamail)