问题1:
当附件的名称为中文时,出现乱码,导致出错。
java.io.FileNotFoundException: c:\=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?= (文件名、目录名或卷标语法不正确。)问题2:
当邮件正文包含图片时,也会将正文中的图片当成附件保存,但是我只想保存真正的附件。请问有没比较好的代码,关于处理邮件接收这方面的,特殊是对附件的处理。我现在的代码如下

    /**   
     * 判断此邮件是否包含附件   
     */   
    public boolean isContainAttach(Part part) throws Exception {    
        boolean attachflag = false;    
        String contentType = part.getContentType();    
        if (part.isMimeType("multipart/*")) {    
            Multipart mp = (Multipart) part.getContent();    
            for (int i = 0; i < mp.getCount(); i++) {    
                BodyPart mpart = mp.getBodyPart(i);    
                String disposition = mpart.getDisposition();    
                if ((disposition != null)    
                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition    
                                .equals(Part.INLINE))))    
                    attachflag = true;    
                else if (mpart.isMimeType("multipart/*")) {    
                    attachflag = isContainAttach((Part) mpart);    
                } else {    
                    String contype = mpart.getContentType();    
                    if (contype.toLowerCase().indexOf("application") != -1)    
                        attachflag = true;    
                    if (contype.toLowerCase().indexOf("name") != -1)    
                        attachflag = true;    
                }    
            }    
        } else if (part.isMimeType("message/rfc822")) {    
            attachflag = isContainAttach((Part) part.getContent());    
        }    
        return attachflag;    
    }        /**    
     * 【保存附件】    
     */    
    public void saveAttachMent(Part part) throws Exception {    
        String fileName = "";    
        if (part.isMimeType("multipart/*")) {    
            Multipart mp = (Multipart) part.getContent();    
            for (int i = 0; i < mp.getCount(); i++) {    
                BodyPart mpart = mp.getBodyPart(i);    
                String disposition = mpart.getDisposition();    
                if ((disposition != null)    
                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition    
                                .equals(Part.INLINE)))) {    
                    fileName = mpart.getFileName();  
                    if (fileName.toLowerCase().indexOf("gb2312") != -1) {    
                        fileName = MimeUtility.decodeText(fileName);  
                    }    
                    saveFile(fileName, mpart.getInputStream());    
                } else if (mpart.isMimeType("multipart/*")) {    
                    saveAttachMent(mpart);    
                } else {    
                    fileName = mpart.getFileName();    
                    if ((fileName != null)    
                            && (fileName.toLowerCase().indexOf("gb2312") != -1)) {    
                        fileName = MimeUtility.decodeText(fileName);   
                        saveFile(fileName, mpart.getInputStream());    
                    }    
                }    
            }    
        } else if (part.isMimeType("message/rfc822")) {    
            saveAttachMent((Part) part.getContent());    
        }    
    }    

解决方案 »

  1.   

    http://blog.csdn.net/steven_05514/archive/2008/12/08/3478776.aspx
      

  2.   

    1、文件名=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?=这个应该是经过base64编码的了,吧中间这段5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==解一下码看看
    2、图片虽然都是以附件形式发送,但在MIME里有区别的,正文图片的src是以cid:[email protected]这样的形式,而图片的文见流那也有对应的Content-ID: <[email protected]> 这就说明是正文里引用的东西,普通的附件好像没这个Content-ID几年前做的邮件项目,记不太清了!
      

  3.   

    ((disposition.equals(Part.ATTACHMENT) || (disposition.equals(Part.INLINE)))改成(disposition.equals(Part.ATTACHMENT)Part.ATTACHMENT  // 附件
    Part.INLINE  // 内联文件,就是LZ不想保存的东西
      

  4.   

    MimeUtility.decodeText(String etext)用这个来解析,就可以有中文
    不过注意,有些服务器,会把太长的编码换成2行,那时,就要特别处理,不然解析出来的部分乱码,或者出错
      

  5.   

    MimeUtility.decodeText(String etext)用一下再说,而且你上面那个不是乱码,是根据mime协议的再编码,一般有base64和quoted-printable,这2个是常用,还有其他不多用了
      

  6.   

    我的程序中就用的MimeUtility.decodeText(String etext)。     /**    
         * 【保存附件】    
         */    
        public void saveAttachMent(Part part) throws Exception {    
            String fileName = "";    
            if (part.isMimeType("multipart/*")) {    
                Multipart mp = (Multipart) part.getContent();
                for (int i = 0; i < mp.getCount(); i++) {    
                    BodyPart mpart = mp.getBodyPart(i);    
                    String disposition = mpart.getDisposition();                     if ((disposition != null)    
                            && ((disposition.equals(Part.ATTACHMENT)))){
                          // || (disposition.equals(Part.INLINE)))) {    
                        fileName = mpart.getFileName();  
                        if (fileName.toLowerCase().indexOf("gb2312") != -1) {    
                            fileName = MimeUtility.decodeText(fileName);  
                        }    
                        saveFile(fileName, mpart.getInputStream());    
                    } else if (mpart.isMimeType("multipart/*")) {    
                        saveAttachMent(mpart);    
                    } else {    
                        fileName = mpart.getFileName();    
                        if ((fileName != null)    
                                && (fileName.toLowerCase().indexOf("gb2312") != -1)) {    
                            fileName = MimeUtility.decodeText(fileName);   
                            saveFile(fileName, mpart.getInputStream());    
                        }    
                    }    
                }    
            } else if (part.isMimeType("message/rfc822")) {    
                saveAttachMent((Part) part.getContent());    
            }    
        }  
      

  7.   

    if (fileName.toLowerCase().indexOf("gb2312") != -1)如果是utf8呢,你怎么办?
    =?   UTF-8   ?   B   ?   5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA   ==?=
    你可以看到这里已经是utf-8了,不过也可以看出,这里是有固定格式的,就是=?***?*?*******?=
    所以上面那个表达式,应该改改
      

  8.   

    (fileName.toLowerCase().indexOf("gb2312") != -1)这个判断有问题
    =?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?=
    =? ?= 说明文件名是编码了
    抛开?分隔符
    UTF-8是原来字符串的编码方式(好象是)
    B 是采用的base64转码 (还有其他的转码方式的)
    5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA== 就是转码后的文件名
      

  9.   

    为何前两个解码后还是乱码呢。(内联的图片)第三个解码是正确的。(真正的附件)用的是MimeUtility.decodeText
    -------
    转换前:=?UTF-8?B?w6XCruKAsMOkwr/CocOkwrrFksOmxZPFuMOkwrzLnMOlxZLigJPDqMKn?= =?UTF-8?B?4oCew6XLhuKAmS5wbmc=?=
    转换后:????‰????????????????????????????–è§??????’.png
    转换前:=?UTF-8?B?w6XCsCDDp8K74oCew6jCp+KAnsOly4bigJkgKDEpLnBuZw==?=
    转换后:??° ??????è§??????’ (1).png
    转换前:=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?=
    转换后:测试用.doc
    -------