2015-06-12 51 views
0

我在SQL數據庫和郵件服務器之間編寫了一個適配器。我使用了POP3連接。 此後,我遇到了以下問題 - 當適配器收到俄文文件名時,會發生此錯誤。

示例輸入文件名:=?UTF-8?B?0KHQutGA0LjQv9C60LAg0JzQsNGA0LjRjy5kb2N4?=
編碼格式爲Base64。我試圖將Base64轉換爲UTF-8,但它沒有解決問題。

我的代碼:如何在使用Java郵件API時轉換文件名

if (contentType.contains("multipart")) 
      { 
       Multipart multiPart = (Multipart) message.getContent(); 
       int numberOfParts = multiPart.getCount(); 
       for (int partCount = 0; partCount<numberOfParts; partCount++) 
       { 
        MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount); 
        if (!Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) 
        { 
         //this part is attachment 
         continue; 

        } 

         //String fileName = part.getFileName(); 
         String fileName = part.getFileName().toString(); 
         if (fileName.contains("UTF-8")) 
         { 
          byte[] decoded = Base64.decodeBase64(fileName.getBytes()); 
          fileName = new String(decoded, "UTF-8"); 
         } 
         attachFiles += fileName + ", "; 
         part.saveFile("d:/" + File.separator + fileName); 
         //this part may be the message content 
         messageContent = part.getContent().toString(); 

       } 
       if (attachFiles.length() > 1) 
       { 
        attachFiles = attachFiles.substring(0, attachFiles.length()-2); 
       } 
      } 

沒有任何人有一個想法,我怎麼能解決這個問題呢?

+0

儘量只這部分'0KHQutGA0LjQv9C60LAg0JzQsNGA0LjRjy5kb2N4' – Jens

+0

轉換部分,它會工作。但是這段代碼不返回** String fileName = part.getFileName()。toString(); **這個值 –

回答

2

文件名不是base64編碼的字符串。它按照RFC 2047的定義進行編碼。

不要試圖手工解碼這些字符串。使用像Apache Mime4j這樣的固定庫來編碼/解碼MIME消息。

添加Mime4j到您的項目(這裏的Maven):

<dependency> 
    <groupId>org.apache.james</groupId> 
    <artifactId>apache-mime4j-core</artifactId> 
    <version>0.7.2</version> 
</dependency> 

使用org.apache.james.mime4j.codec.DecoderUtil解碼引用可打印字符串:如果我tryed這

@Test 
public void test() { 
    String decoded = DecoderUtil.decodeEncodedWords("=?UTF-8?B?0KHQutGA0LjQv9C60LAg0JzQsNGA0LjRjy5kb2N4?=", null); 
    assertEquals("Скрипка Мария.docx", decoded); 
} 
相關問題