Javamail下载base64附件

问题描述:

我试图从我的电子邮件与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://*.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -to-AN-的OutputStream) – jmehrens

您不需要将base64作为特例处理。您已经使用的saveFile方法将对内容进行解码并保存。只要删除你的第一个“如果”的声明。

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

还要注意你的multipart循环只能处理最简单的消息。它将会失败,消息包含嵌套在多部分中的多部分。通常这只会是您可能不想处理的签名或加密邮件。并且它会失败,因为没有预期的Content-Disposition头文件或没有指定文件名的“附件”。 (希望这是罕见的,这些天,但有些人仍然使用旧的或损坏的邮件程序。)

最后,你应该永远使用包含在邮件“原样”的文件名。这个名字永远不会被信任。它可能被用来覆盖磁盘上的文件。