mail::account::readMessageAttributes — Return message metadata


#include <libmail/mail.H>
#include <libmail/envelope.H>
#include <libmail/structure.H>

class myCallbackMessage : public mail::callback::message {
    void success(std::string msg);
    void fail(std::string msg);

    void messageEnvelopeCallback(size_t messageNumber,
                                 const mail::envelope &envelopeArg);

    void messageReferencesCallback(size_t messageNumber,
                                   const std::vector<std::string> &referencesArg);

    void messageArrivalDateCallback(size_t messageNumber,
                                    time_t datetime);

    void messageSizeCallback(size_t messageNumber,
                             unsigned long size);

    void messageStructureCallback(size_t messageNumber,
                                  const mail::mimestruct &messageStructure);
    void messageTextCallback(size_t messageNumber, std::string text);

std::cout << (float)myMessageCallback.messageTextCompleted /
             (float)myMessageCallback.messageTextEstimatedSize * 100
          << "% completed." << endl;

mail::account *account;

account->readMessageAttributes( const std::vector<size_t> msgList,
  mail::account::MessageAttributes attributes,
  myCallbackMessage &callback);


mail::account::readMessageAttributes requests metadata of messages in the currently open folder. msgList specifies a list of messages. Messages are numbered starting with message #0 and up to one less than mail::account::getFolderIndexSize(3x)() (when mail::account::getFolderIndexSize returns 6, the messages are numbered 0 through 5). Only the messages that appear in msgList are processed by this request. attributes is a logical-or of the following constants:


When the message was added to the folder (myCallback.messageArrivalDateCallback).


Estimated message size, in bytes (myCallback.messageSizeCallback).


Message's envelope headers (myCallback.messageEnvelopeCallback, and possibly myCallback.messageReferencesCallback). messageEnvelopeCallback receives a mail::envelope object that describes the "envelope", or a message summary (sender, recipients, subject, etc...). In some instances the messageReferencesCallback callback will also be invoked, with an an array of message IDs taken from the References header. In other instances the mail::envelope will already have the references populated with the same information.

messageReferencesCallback may be invoked before or after the messageEnvelopeCallback function, if at all. The application should be prepared to merge the information returned by these two callbacks. As noted below, multiple callback methods may be invoked in any order, and the application should not make any assumption as to the relative order in which these two methods will be invoked.

For example, it is perfectly feasible to have a request for envelopes of two messages result in two messageEnvelopeCallback callbacks, then two messageReferencesCallback callbacks; or two instances of messageEnvelopeCallback followed by a messageReferencesCallback that refers to the same message.


Returns a mail::mimestruct object that enumerates the message's MIME content (myCallback.messageStructureCallback). myCallback.messageStructureCallback receives a reference to a mail::mimestruct object that refers to the entire message. If the message contains attachments, the mail::mimestruct::getChild method returns pointers to mail::mimestruct objects which refer to the individual MIME attachments.

Metadata information requested by each one of these constants is returned by invoking the corresponding callback method in callback. When requesting two or more items at once the callback functions may be invoked in any order. When requesting metadata from more than one message the callback functions are invoked one for each requested message. Each callback function receives the requested metadata item together with messageNumber - which message this metadata item relates to. The callback functions may be invoked in any message order.

For example, when requesting both ENVELOPE and MIMESTRUCTURE, the possibilities are:

  • ENVELOPEs for all messages first, then all MIMESTRUCTUREs.

  • The ENVELOPE and the MIMESTRUCTURE for the first message, then the ENVELOPE and the MIMESTRUCTURE for the next message, and so on.


The mail::envelope and mail::mimestruct objects are destroyed immediately after their corresponding callback method terminates. The application should copy any objects it intends to use later.

Return Codes

The application must wait until callback's success or fail method is invoked. The success method is invoked when this request is succesfully processed. The fail method is invoked if this request cannot be processed. The application must not destroy callback until either the success or fail method is invoked.


callback's fail method may be invoked even after other callback methods were invoked. This indicates that the request was partially completed before the error was encountered.


Multiple applications may have the same account and folder opened at the same time. It is possible that a message referenced by this request was already deleted by another application. Depending on the underlying server implementation this will result in either a failed request, invoking, or the request completing (callback.success invoked) but without invoking any callback function that refer to the message.