簡體   English   中英

用Java解碼Mail.app電子郵件附件文件名

[英]Decoding a Mail.app e-mail attachment filename in Java

我在解碼電子郵件附件的文件名方面遇到了問題。 目前我正在使用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Ãá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”+以上點。 MimeUtility.encodeText使用前者,Mail.app使用后者。

但是我希望能夠解碼兩者。 有沒有辦法解碼使用JavaMail從Mail.app發送的文件名? 或者也許還有其他一些圖書館?

謝謝! 亞當

事實證明你必須規范化字符串:

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

很奇怪,但有效! :)更詳細地說,由於Mail.app將“Ż”編碼為兩個字符:“Z”+“dot-above”,然后必須使用Normalizer重新組合。

亞當

我不知道它是否有用我有一部分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+"*******");
    }

這里

希望你覺得它有用。

此致,拉傑夫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM