We have released a new feature for IMAP stores: get and fetch messages in a single operation. This will avoid one round-trip to the server.
Let’s say we want to get the flags for the messages UID 2 to 6. Until today, we used to write the following code:
vmime::shared_ptr <vmime::net::folder> f = /* ... */; vmime::net::messageSet mset(vmime::net::messageSet::byUID(2, 6)); vmime::net::fetchAttributes attribs; attribs.add(vmime::net::fetchAttributes::FLAGS); std::vector <vmime::shared_ptr <vmime::net::message> > msgs = f->getMessages(mset); f->fetchMessages(msgs, attribs); // ...do something with msg[n]->getFlags()...
This resulted into the following IMAP client-server dialog, with two FETCH commands in sequence:
C: a005 UID FETCH 2:6 UID <-- getMessages() S: * 1 FETCH (UID 2 MODSEQ (1268172)) S: * 2 FETCH (UID 3 MODSEQ (1268417)) S: * 3 FETCH (UID 4 MODSEQ (1268417)) S: * 4 FETCH (UID 5 MODSEQ (1268312)) S: * 5 FETCH (UID 6 MODSEQ (1268417)) S: a005 OK Success C: a006 FETCH 1:5 (FLAGS) <-- fetchMessages() S: * 1 FETCH (MODSEQ (1268172) FLAGS (NotJunk $NotJunk \Seen)) S: * 2 FETCH (MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: * 3 FETCH (MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: * 4 FETCH (MODSEQ (1268312) FLAGS (NotJunk $NotJunk \Seen)) S: * 5 FETCH (MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: a006 OK Success
With the new getAndFetchMessages() method, we can now write:
vmime::shared_ptr <vmime::net::folder> f = /* ... */; vmime::net::messageSet mset(vmime::net::messageSet::byUID(2, 6)); vmime::net::fetchAttributes attribs; attribs.add(vmime::net::fetchAttributes::FLAGS); std::vector <vmime::shared_ptr <vmime::net::message> > msgs = f->getAndFetchMessages(mset, attribs); // ...do something with msg[n]->getFlags()...
Here is now the dialog between the client and the server:
C: a006 UID FETCH 2:6 (FLAGS UID MODSEQ) S: * 1 FETCH (UID 2 MODSEQ (1268172) FLAGS (NotJunk $NotJunk \Seen)) S: * 2 FETCH (UID 3 MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: * 3 FETCH (UID 4 MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: * 4 FETCH (UID 5 MODSEQ (1268312) FLAGS (NotJunk $NotJunk \Seen)) S: * 5 FETCH (UID 6 MODSEQ (1268417) FLAGS (NotJunk $NotJunk \Seen)) S: a006 OK Success
That is, one round-trip to the server saved. Please note that this will work with any fetch attribute, and should also work with any IMAP-compliant server!