2011-04-20 98 views
7

我有与电子邮件附件的文件名解码的问题。目前我正在使用JavaMail 1.4.2。该文件被命名为“Żółw.rtf”(这是Turtle.rtf的波兰语)。邮件使用Mail.app发送(这似乎相当重要)。重要的标头是:????解码Mail.app电子邮件附件的文件名中的Java

--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,问Z = CC = 870 = CC = 81 = C5 =82瓦特= 2Ertf = “,在应用MimeUtility.decodeText之后,它是:”ZáoÃ≈Ç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”,可以通过两种方式进行编码:无论是作为一个单个字母或“Z” +以上的点。 MimeUtility.encodeText使用前者,后者使用Mail.app。

但是我想能够解码两者。使用JavaMail从Mail.app发送文件时,是否有解码文件名的方法?或者也许有其他一些图书馆?

谢谢! 亚当

+0

要回答我,你有正常化的字符串: 字符串解码= MimeUtility.decodeText(part.getFileName()); 返回Normalizer.normalize(解码,Normalizer.Form.NFC); 奇怪的,但工程! :) – adamw 2011-04-20 14:22:58

+1

伟大的,你找到了解决方案!你能把它作为答案吗?这将有助于同样的问题,未来的人(你可能会得到upvotes以及;-)) – 2011-04-20 14:56:37

回答

11

原来你有正常化的字符串:

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

怪异,但作品! :) 更详细地,如Mail.app编码“Z”为两个字符:“Z” +“的点上方”,这于是具有使用正规化复合。

亚当

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+"*******"); 
    } 

这里

希望你觉得它有用。

问候, 拉杰夫

+0

谢谢,但问题就出在part.getFileName():这可能例如返回=?utf-8?Q?Z = CC = 87o = CC = 81 = C5 = 82w = 2Ertf?=,如果文件名包含非ASCII字符。这必须解码:)。 – adamw 2011-04-20 12:38:40

+0

0票下来 \t 喜, 不知道如果此链接为您提供任何clues.The代码确实有一个文本properly.According解码他们的样品也有一些情况下,JavaMail的是无法撷取多编码的单词或由一些不符合MIME并提供样本来解码这些文本的邮件所引起的损坏。 http://www.szszi.hu/~pts/oxinstall/pts-ox-mimeutility-decodetext-helper.patch 我希望它适合你。 问候,拉杰夫 – user716775 2011-04-20 14:51:20