用Java解码Mail.app电子邮件附件文件名

时间:2011-04-20 11:53:24

标签: java macos mime javamail

我在解码电子邮件附件的文件名方面遇到了问题。目前我正在使用JavaMail 1.4.2。该文件名为“Żółw.rtf”(这是Turtle.rtf的润色)。邮件是使用Mail.app发送的(这看起来非常重要)。重要的标题是:

--Apple-Mail-19-721116558
Content-Disposition: attachment;
   filename*=utf-8''Z%CC%87o%CC%81%C5%82w.rtf
Content-Type: text/rtf;
   x-unix-mode=0644;
   name="=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?="
Content-Transfer-Encoding: 7bit

相应的javax.mail.Part.getFileName()返回“=?utf-8?Q?Z = CC = 87o = CC = 81 = C5 = 82w = 2Ertf?=”,应用MimeUtility.decodeText后,是:“ZááÃÅ≈Çw.rtf”。显然不是原来的:)。

为了比较,MimeUtility.encodeText返回:

=?UTF-8?Q?=C5=BB=C3=B3=C5=82w.rtf?=

与之相反:

=?utf-8?Q?Z=CC=87o=CC=81=C5=82w=2Ertf?=

来自电子邮件。

根据我的研究,字母“Ż”可以用两种方式编码:单个字母或“Z”+上方点。 MimeUtility.encodeText使用前者,Mail.app是后者。

但是我希望能够解码两者。有没有办法解码使用JavaMail从Mail.app发送的文件名?或者也许还有其他一些图书馆?

谢谢! 亚当

2 个答案:

答案 0 :(得分:12)

原来你必须规范化字符串:

String decoded = MimeUtility.decodeText(part.getFileName()); 
return Normalizer.normalize(decoded, Normalizer.Form.NFC); 

很奇怪,但是有效! :) 更详细地说,由于Mail.app将“Ż”编码为两个字符:“Z”+“dot-above”,然后必须使用Normalizer重新组合。

亚当

答案 1 :(得分:0)

我不知道它是否有用我有一部分java编码检查邮件文件附件如果存在然后将其保存在指定的文件路径中,并指定名称和扩展名,如果文件名已经存在于路径下,则它会增加文件名末尾的值。所以这是代码片段:

enter

Multipart mp =(Multipart)messages [i] .getContent();

 for (int j=0, n=mp.getCount(); j<n; j++) {

     Part part = mp.getBodyPart(j);

       String disposition = part.getDisposition();

        if ((disposition != null) && 
                                  ((disposition.equals(Part.ATTACHMENT) || 
                                   (disposition.equals(Part.INLINE))))){                                      

       String path = "c:\\Temp;

                                    saveFile(part.getFileName(), part.getInputStream(),path);

       }
  }

  public static void saveFile(String filename,InputStream input, String path) throws IOException {
    if (filename == null) {
    filename = File.createTempFile("xx", ".out").getName();
    }

     try{
    boolean success = (new File(path)).mkdirs();
    if (success) {
      System.out.println("Directories: " + path + " created");
    }

    }catch (Exception e){//Catch exception if any
      System.err.println("Error: " + e.getMessage());
    }

    String filenamepath = path + "//"+filename;
    File file = new File(filenamepath);
    for (int i=0; file.exists(); i++) {     

         String fname="";
            String ext="";
            int mid= filenamepath.lastIndexOf(".");
            fname=filenamepath.substring(0,mid);
             ext=filenamepath.substring(mid+1,filenamepath.length());               


    file = new File(newpath);
    }
    FileOutputStream fos = new FileOutputStream(file);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    BufferedInputStream bis = new BufferedInputStream(input);
    int aByte;
    while ((aByte = bis.read()) != -1) {
    bos.write(aByte);
    }
    bos.flush();
    bos.close();
    bis.close();
    System.out.println("File saved to :"+file+"*******");
    }

这里

希望你觉得它很有用。

此致 拉杰夫