2011-10-15 21 views
0

Javamail APIを使用していますが、単語ファイルなどの添付ファイルをダウンロードしようとしています。 問題は、バイトを読み込んでファイルに保存しようとしているときに、base64のデコード例外が発生することです。 私はその目的のために次のコードを使用しています。Javamailを使用してGmailから単語のドキュメントをダウンロードする

スタック例外:

IOException:com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 2 before EOF, the 10 most recent characters were: "AG4AAAAAAA" 

のJavaMailコード:

private void getAttachments(Message temp) throws IOException, MessagingException { 
     List<File> attachments = new ArrayList<File>(); 

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

     System.out.println(multipart.getCount()); 

     for (int i = 0; i < multipart.getCount(); i++) { 
      BodyPart bodyPart = multipart.getBodyPart(i); 
      if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) { 
       continue; // dealing with attachments only 
      } 
      InputStream is = bodyPart.getInputStream(); 


      File f = new File("C:\\Attachments\\" + bodyPart.getFileName()); 

      // saveFile(bodyPart.getFileName(),is); 

      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

      while (br.ready()) { 
       System.out.println(br.readLine()); 
      } 



      saveFile(bodyPart.getFileName(),is); 

      attachments.add(f); 
     } 



public static void saveFile(String filename,InputStream input) 
    { 

     System.out.println(filename); 
     try { 
      if (filename == null) { 
       //filename = File.createTempFile("VSX", ".out").getName(); 
       return; 
      } 
      // Do no overwrite existing file 
      filename = "C:\\Attachments\\" + filename; 
      File file = new File(filename); 
      for (int i = 0; file.exists(); i++) { 
       file = new File(filename + i); 
      } 
      FileOutputStream fos = new FileOutputStream(file); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      BufferedInputStream bis = new BufferedInputStream(input); 


      int aByte; 
      while ((aByte = bis.read()) >=0) { 
       bos.write(aByte); 
      } 

      bos.flush(); 
      bos.close(); 
      bis.close(); 
     } // end of try() 
     catch (IOException exp) { 
      System.out.println("IOException:" + exp); 
     } 
    } //end of saveFile() 
+1

コードが正常に見えます。だからおそらくあなたの問題はJavaMail固有のコードにあります。そのコードと、例外のメッセージとスタックトレースを表示できますか? –

+0

@RolandIllig コードを再度編集しました –

+0

独自の保存ロジックをローリングするのではなく、MimeBodyPartからsaveFile()メソッドを直接呼び出すとどうなりますか? –

答えて

0

のMimeBodyPartからのセーブファイル()メソッドを使用します。そして、あなたが実際にsaveFileメソッドに渡す前に、入力ストリームから行を読んで停止する(!)行を本当にしたいのであれば。あなたはコンテンツの一部を消費しているため、問題の原因となる可能性があります。

1

この問題を解決するには、部分的なフェッチを無効にする必要があります。ここでは、IMAPSを使用して作業している場合は、

props.setProperty("mail.imap.partialfetch", "false"); 

または

props.setProperty("mail.imaps.partialfetch", "false"); 

ことを行うことができる方法です。ここで

は完全なリファレンスです:あなたが投稿 JavaMail BaseEncode64 Error

+0

それで修正できない場合はどうすればいいですか?私はproperties.setProperty( "mail.imaps.partialfetch"、 "false");をセットしました。 (私も "mail.imap.partialfetch"を設定しようとしましたが、どちらも助けにはなりませんでした)、まだ "BASE64Decoder:エンコードされたストリームのエラー:4つの有効なbase64文字が必要ですが、 EOF " – David

+0

コードベースとエラーの詳細を教えてください。 –

+0

私のコメントは無視されました。実際にはBASE64の不正な形式の内容の電子メールでした。 :) – David

関連する問題