7

現在、gmail アカウントから添付ファイルをダウンロードするアプリケーションを開発しています。現在、圧縮された添付ファイルをダウンロードするたびにエラーが発生しました。ただし、すべてではありませんが、エラーなしで取得できるものもあります。例外メッセージは次のとおりです。

Exception in thread "main" com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 1 before EOF, the 10 most recent characters were: "Q3w5ilxj2P"

参考までに: gmail の Web インターフェイス経由で添付ファイルをダウンロードできました。

スニペットは次のとおりです。

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

        for (int i = 0; i < multipart.getCount(); i++) {

            BodyPart bodyPart = multipart.getBodyPart(i);

            if (bodyPart.getFileName().toLowerCase().endsWith("zip") ||
                    bodyPart.getFileName().toLowerCase().endsWith("rar")) {
                InputStream is = bodyPart.getInputStream();
                File f = new File("/tmp/" + bodyPart.getFileName());
                FileOutputStream fos = new FileOutputStream(f);
                byte[] buf = new byte[bodyPart.getSize()];
                int bytesRead;
                while ((bytesRead = is.read(buf)) != -1) {
                    fos.write(buf, 0, bytesRead);
                }
                fos.close();
            }
        }
    }

この問題を回避する方法を知っている人はいますか?

4

2 に答える 2

11

JavaMailの既知の制限、バグ、問題のリストから:

一部の IMAP サーバーは、IMAP 部分 FETCH 機能を適切に実装していません。この問題は、通常、IMAP サーバーから大きなメッセージをダウンロードするときに、電子メールの添付ファイルが破損することで発生します。このサーバーのバグを回避するには、「mail.imap.partialfetch」プロパティを false に設定します。セッションに提供する Properties オブジェクトでこのプロパティを設定する必要があります。

そのため、imap セッションで部分フェッチをオフにする必要があります。例えば:

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.partialfetch", "false");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "<username>","<password>");

ソース: https://javaee.github.io/javamail/docs/api/com/sun/mail/imap/package-summary.html

于 2011-03-13T22:43:26.643 に答える
1

JavaメールAPIを使用している場合は、imapサーバーに接続しているときにこれらの行を追加してください......

Properties prop = new Properties();
prop.put("mail.imaps.partialfetch", false);
Session session = Session.getDefaultInstance(prop, null);

...........あなたのコード.......。

動作するはずです。

于 2011-10-21T12:30:17.770 に答える