0

メールの遅延ダウンロードをしようとしています。基本的に問題は、メールが重いことです。そのため、件名とメッセージ ID のみをダウンロードし、必要な場合にのみ残りのメールをダウンロードしています。

最初のステップは、件名とメッセージ ID をダウンロードすることです。

public void downloadInBackground(EmailAccount emailAccount, String folderName) {
    List<Email> emails = new ArrayList<Email>();
    Message[] message = null;

    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps");
    Session session = Session.getDefaultInstance(props, null);

    Store store = null;
    Folder folder = null;
    try {
        Log.getInstance().d("xxx", "starting dowanloading");
        store = session.getStore("imaps");
        store.connect(emailAccount.getImapServer(), emailAccount.getUsername(),
                emailAccount.getPassword());

        folder = store.getFolder(folderName);
        folder.open(Folder.READ_ONLY);

        message = folder.getMessages();
        FetchProfile fp = new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        fp.add("Subject"); fp.add("From"); fp.add("To"); fp.add("Cc"); fp.add("Bcc"); fp.add("ReplyTo"); fp.add("Date");
        folder.fetch(message, fp);

        for (int i = 0; i < message.length; i++) {
            Message m = message[i];

            String emailId = null;

            m.getHeader("Message-Id");
            Enumeration<Header> headers = m.getAllHeaders();
            while (headers.hasMoreElements()) {
                Header h = headers.nextElement();
                String mID = h.getName();
                if (StringUtils.containsIgnoreCase(mID, "Message-ID")) {
                    emailId = h.getValue();
                }
            }

            if (emailId != null) {
                Email newMail = new LazyEmail(m, emailAccount, folderName, emailId);
                emails.add(newMail);
            }
        }
    } catch (MessagingException e) {
        ...
    } finally {
        if (folder != null) {
                folder.close(false);
        }
        if (store != null) {
                store.close();
        }
    }

    update(emails);
}

必要に応じて、LazyEmail で次へ。残りのメールをダウンロードしています:

public void updateContentText() {
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps");
    Session session = Session.getDefaultInstance(props, null);

    Store store = null;
    Folder folder = null;
    try {
        store = session.getStore("imaps");
        store.connect(mEmailAccount.getImapServer(), mEmailAccount.getUsername(),
                mEmailAccount.getPassword());

        folder = store.getFolder(mFolderName);
        folder.open(Folder.READ_ONLY);

        // finding email
        SearchTerm searchTerm = new MessageIDTerm(mEmailId);
        Message[] messages = folder.search(searchTerm);
        assert messages.length == 1;

        // setting context text
        Part mail = messages[0];
        if (mail.getContent() instanceof Multipart) {
            setContentText((Multipart) mail.getContent());
        } else {
            setContentText((String) mail.getContent());
        }

        updateState = UpdateState.CONTENT_TEXT_DOWNLOADED;
    } catch (IOException e) {
        ...
    } finally {
        if (folder != null) {
                folder.close(false);
        }
        if (store != null) {
                store.close();
        }
    }
}

コードは問題ないようです。しかし、Android アプリケーションを実行しているときに、行 Message[] messages = folder.search(searchTerm); でエラーが発生します。

 javax.mail.MessagingException: A4 BAD Execute(): Error in command received;
4

1 に答える 1

0

使用しているサーバーは何ですか? JavaMail プロトコル トレースは何を示していますか?

また、エンベロープに加えてこれらすべてのヘッダーをフェッチすることは、ほとんど無駄であることに注意してください。生のヘッダーに直接アクセスしない限り、JavaMail はすべての情報をエンベロープから取得します。

最後に、あなたの使い方では、「mail.store.protocol」プロパティを設定する理由はありません。また、JavaMail でよくあるこれらの間違いを参照してください。

于 2013-07-11T03:36:32.947 に答える