Prefetch preview text from JavaMail Message
Asked Answered
L

1

5

I'm using JavaMail 1.5.2 to read messages from IMAP accounts. To reduce the number of requests to the host I prefetch some message data, like From, Date, Message-ID etc.:

Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_ONLY);

FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.CONTENT_INFO);
fp.add("Message-ID");

Message msgs[] = folder.getMessages();
folder.fetch(msgs,fp);

However, I want to also prefetch some parts of the content to create a preview text for the mail without having to load the full message with all attachments. For example, I would like to prefetch all parts of the content that have the type "text/plain" and are no attachments. Is that possible?

PS: I'm not searching for a solution like fp.add(IMAPFolder.FetchProfileItem.MESSAGE) because this will prefetch the whole message with all attachments.

Lelia answered 27/1, 2015 at 8:36 Comment(0)
J
1

You have to retrieve the bodystructure first, then loop across the message structure, check the mime type of each part, and download the parts you want. IMAP lets you download all of the parts using one command, so if Javamail is a little smart, you should be able to do this with two IMAP commands, no matter how many bodyparts you end up wanting to download.

The IMAP commands, if you're the type who likes to look at wire traffic, should be something like a uid fetch 234789 bodystructure followed by b uid fetch 234789 (body.peek[1.1] body.peek[2]).

Joelynn answered 27/1, 2015 at 9:46 Comment(7)
Thanks for this very helpful answer. Forgive me for being bold, but could you add some Java code that shows how to build and send an IMAP command to fetch message data. I have never done this before and it would probably take me days to figure out how. As it seems that you have done something like this before, I'd really appreciate if you could share some code.Lelia
I have done that kind of thing before using IMAP, but I'm afraid the Javamail library is another story. I've only read and modified Javamail code, not written any from scratch, so although it might be just 10-20 lines it would take me at an hour or more, and that's more than I can spend on Stack Overflow. Sorry.Joelynn
Absolutely no reason to be sorry. I thought you might already have written some JavaMail related code for this kind of problem and could quickly copy-paste it here. I'm very sure that your answer will lead me to the proper solution for my problem. FYI: I won't accept your answer right away because I want to wait 1 or 2 days for further answers/solutions.Lelia
You might find some code to look at and/or copy if you search for variants of "javax.mail Message getContent()".Joelynn
Thanks, but I think I just found a solution for my problem here: https://mcmap.net/q/572055/-javamail-imap-over-ssl-quite-slow-bulk-fetching-multiple-messages . It uses the IMAPFolder to send a custom fetch command, just as you suggested.Lelia
It retrieves BODY[], which is the full content of the message, including all attachments.Joelynn
Yes, I know. That's why I asked the creator of the referenced answer about what syntax to use for fetching specific body parts of specific messages. Thanks again for your advice.Lelia

© 2022 - 2024 — McMap. All rights reserved.