2011-04-20 56 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

相關問題