2017-09-26 154 views
0

我試圖從我的電子郵件與javamail和通過imap下載所有新的電子郵件附件。這一切工作正常,怎麼過一些附件是PDF和base64解碼,這我的發言Javamail下載base64附件

if (msg.getContent() instanceof Multipart) 

不抓,因爲它的[email protected]

如何獲取此附件並將其下載到我的硬盤?

迄今嘗試過,第一條IF語句通過Base64解碼捕獲附件。

for (Message msg : messages) { 
     Address[] fromAddress = msg.getFrom(); 
     String from = fromAddress[0].toString(); 
     String subject = msg.getSubject(); 
     String sentDate = msg.getSentDate().toString(); 

     String messageContent = ""; 
     String attachFiles = ""; 

     System.out.println(msg.getContent()); 


     if (msg.getContent() instanceof BASE64DecoderStream) 
     { 
      BASE64DecoderStream base64DecoderStream = (BASE64DecoderStream) msg.getContent(); 
      byte[] byteArray = IOUtils.toByteArray(base64DecoderStream); 
     } 
     if (msg.getContent() instanceof Multipart) { 


      Multipart multipart = (Multipart) msg.getContent(); 

      for (int i = 0; i < multipart.getCount(); i++) { 
       Part part = multipart.getBodyPart(i); 
       String disposition = part.getDisposition(); 

       if ((disposition != null) && 
         ((disposition.equalsIgnoreCase(Part.ATTACHMENT) || 
           (disposition.equalsIgnoreCase(Part.INLINE))))) { 
        MimeBodyPart mimeBodyPart = (MimeBodyPart) part; 
        String fileName = mimeBodyPart.getFileName(); 
        attachFiles += fileName; 
        File fileToSave = new File(fileName); 
        mimeBodyPart.saveFile(saveDirectory + File.separator + fileToSave); 
        System.out.println("saved attachment: " + fileName + " to disk at: " + saveDirectory); 
       } 
      } 
     } 
     System.out.println("\t From: " + from); 
     System.out.println("\t Subject: " + subject); 
     System.out.println("\t Sent Date: " + sentDate); 
     System.out.println("\t Attachments: " + attachFiles); 
     System.out.println(""); 
    } 
} 

如果有簡單方便的方法將附件下載到我的磁盤上,也可以使用NodeJS。嘗試node-imap,但我得到了同樣的錯誤。

+0

[將Java InputStream的內容寫入OutputStream的簡單方法]的可能重複(https://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -to-AN-的OutputStream) – jmehrens

回答

1

您不需要將base64作爲特例處理。您已經使用的saveFile方法將對內容進行解碼並保存。只要刪除你的第一個「如果」的聲明。

而且您不想使用instanceof檢查multipart,因爲如果它不是多部分,它可能非常昂貴。相反,請使用if (msg.isMimeType("multipart/*"))

還要注意你的multipart循環只能處理最簡單的消息。它將會失敗,消息包含嵌套在多部分中的多部分。通常這隻會是您可能不想處理的簽名或加密郵件。並且它會失敗,因爲沒有預期的Content-Disposition頭文件或沒有指定文件名的「附件」。 (希望這是罕見的,這些天,但有些人仍然使用舊的或損壞的郵件程序。)

最後,你應該永遠使用包含在郵件「原樣」的文件名。這個名字永遠不會被信任。它可能被用來覆蓋磁盤上的文件。