3

Java プロジェクトで、gmail サーバーからメールを受信できます。でも本体のパッケージ部分を受け取りたい。このコード サンプルでは、​​最後message(messages.length - 1)に multipart/mixed を使用しています。

デバッグはブロックに渡されifますが、キャッチ ブロックに分類され、次のメッセージが表示されます。

スレッド「メイン」の例外 java.lang.ClassCastException: com.sun.mail.imap.IMAPInputStream を javax.mail.Multipart にキャストできません

この問題をどのように処理できますか?

Message[] messages = folder.getMessages();
        ArrayList<String> attachments = new ArrayList<String>();
        for (int i = messages.length - 1; i >= 0; i--) {

            Part p = messages[i];
            if (messages[i].isMimeType("multipart/*")) 
            {           
                ***Multipart multipart = (Multipart) messages[i].getContent();***
                for (int j = 0, m = multipart.getCount(); j < m; j++) {

                    Part part = multipart.getBodyPart(j);
                    String disposition = part.getDisposition();
                    //
                    if (disposition != null
                            && (disposition.equals("ATTACHMENT"))) 
                    {
                        System.out.println(part.getFileName());
                        attachments.add(saveFile(MimeUtility.decodeText(part.getFileName()), part.getInputStream()));
                    }
                }
            }
        }

編集

Java Projectのみを使用している mail.jar、 additional.jar 、および activation.jar の使用に関する問題を修正しました。

(以前、Android プロジェクト用にこれらの jar をダウンロードしていました。それが問題の原因でした。)

4

3 に答える 3

12

Android JavaMail を使用してメッセージの添付ファイルを読んでいるときに、同様の問題に遭遇しました。次のコード行を追加して、このエラーを修正しました。MailCap に何か問題があります。javamail は multipart/mixed part のハンドラを見つけることができないため、このビットを追加する必要があります。これで私の問題は解決しました。それが誰かを助けることを願っています。

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);

乾杯!

于 2013-08-29T12:20:26.157 に答える
0

これは通常、JAF が MIME タイプをクラスにマップする構成ファイルを見つけられないために発生します。その失敗の最も一般的な理由は、実行している環境がスレッドのコンテキスト クラス ローダーを正しく設定していないことです。回避策については、この JavaMail フォーラム スレッドを参照してください。

この失敗の 2 番目に多い理由は、mail.jar ファイル内のクラスを独自の jar ファイルに再パッケージ化したが、設定ファイルを META-INF ディレクトリに含めるのを忘れたことです。

于 2012-04-24T18:26:19.977 に答える
0

興味深いことに、型アーキテクチャは、それらが異なるスーパークラスからのものであることを示しています。

public class IMAPInputStream extends java.io.InputStream {}

パブリック抽象クラス マルチパート {}

保護された同期 void Multipart::setMultipartDataSource(MultipartDataSource mp);

MultipartDataSource は javax.mail.MultipartDataSource として定義されます。

于 2013-12-09T20:38:08.877 に答える