2017-09-26 9 views
0

私はjavamailとimapを使って電子メールから新しい電子メールの添付ファイルをすべてダウンロードしようとしています。これは、すべてのいくつかの添付ファイルがPDFファイルであり、私の文Javamailダウンロードbase64添付

if (msg.getContent() instanceof Multipart) 

はその[email protected]以来、キャッチいけないBASE64、としてデコード方法をこれまでに、正常に動作します。

この添付ファイルを入手してハードドライブにダウンロードするにはどうすればよいですか?

これまで試みたことがあり、最初の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を使用することもできます。ノード-imapを試しましたが、同じエラーが発生しました。

+0

[OutputStreamにJava InputStreamの内容を簡単に書き込むことができます](https://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream)の可能な複製出力ストリームへの) – jmehrens

答えて

1

特殊なケースとしてbase64を処理する必要はありません。すでに使用しているsaveFileメソッドは、コンテンツをデコードして保存します。あなたの最初の "if"ステートメントを削除してください。

マルチパートでないと非常に高額になる可能性があるので、instanceofを使用してマルチパートをチェックしたくない場合は、代わりに、if (msg.isMimeType("multipart/*"))を使用してください。

マルチパートループは、最も簡単なメッセージのみを扱うことにも注意してください。マルチパートにネストされたマルチパートを含むメッセージでは失敗します。通常は、署名または暗号化されたメッセージのみが処理されます。これは処理したくない場合があります。 Content-Dispositionヘッダーがないか、ファイル名が指定されていない「添付ファイル」で失敗します。 (うまくいけば、これは、これらの日はまれであるが、一部の人々はまだ古いまたは壊れたメーラーを使用しています。)最後に

、あなたは決しては「そのまま」メールメッセージに含まれるファイル名を使用する必要があります。その名前は決して信用すべきではありません。これは、ディスク上のファイルを上書きするために使用される可能性があります。

関連する問題