Click or drag to resize
MimeKit

IMailFolderFetch Method (IListUniqueId, IFetchRequest, CancellationToken)

Fetch the message summaries for the specified message UIDs.

Namespace:  MailKit
Assembly:  MailKit (in MailKit.dll) Version: 3.0.0
Syntax
C#
IList<IMessageSummary> Fetch(
	IList<UniqueId> uids,
	IFetchRequest request,
	CancellationToken cancellationToken = default
)

Parameters

uids
Type: System.Collections.GenericIListUniqueId
The UIDs.
request
Type: MailKitIFetchRequest
The fetch request.
cancellationToken (Optional)
Type: System.ThreadingCancellationToken
The cancellation token.

Return Value

Type: IListIMessageSummary
An enumeration of summaries for the requested messages.
Remarks

Fetches the message summaries for the specified message UIDs.

It should be noted that if another client has modified any message in the folder, the mail service may choose to return information that was not explicitly requested. It is therefore important to be prepared to handle both additional fields on a IMessageSummary for messages that were requested as well as summaries for messages that were not requested at all.

Examples
C#
public static void DownloadBodyParts ()
{
    using (var client = new ImapClient ()) {
        client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);

        client.Authenticate ("username", "password");

        client.Inbox.Open (FolderAccess.ReadOnly);

        // search for messages where the Subject header contains either "MimeKit" or "MailKit"
        var query = SearchQuery.SubjectContains ("MimeKit").Or (SearchQuery.SubjectContains ("MailKit"));
        var uids = client.Inbox.Search (query);

        // fetch summary information for the search results (we will want the UID and the BODYSTRUCTURE
        // of each message so that we can extract the text body and the attachments)
        var items = client.Inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);

        foreach (var item in items) {
            // determine a directory to save stuff in
            var directory = Path.Combine (baseDirectory, item.UniqueId.ToString ());

            // create the directory
            Directory.CreateDirectory (directory);

            // IMessageSummary.TextBody is a convenience property that finds the 'text/plain' body part for us
            var bodyPart = item.TextBody;

            // download the 'text/plain' body part
            var body = (TextPart) client.Inbox.GetBodyPart (item.UniqueId, bodyPart);

            // TextPart.Text is a convenience property that decodes the content and converts the result to
            // a string for us
            var text = body.Text;

            File.WriteAllText (Path.Combine (directory, "body.txt"), text);

            // now iterate over all of the attachments and save them to disk
            foreach (var attachment in item.Attachments) {
                // download the attachment just like we did with the body
                var entity = client.Inbox.GetBodyPart (item.UniqueId, attachment);

                // attachments can be either message/rfc822 parts or regular MIME parts
                if (entity is MessagePart) {
                    var rfc822 = (MessagePart) entity;

                    var path = Path.Combine (directory, attachment.PartSpecifier + ".eml");

                    rfc822.Message.WriteTo (path);
                } else {
                    var part = (MimePart) entity;

                    // note: it's possible for this to be null, but most will specify a filename
                    var fileName = part.FileName;

                    var path = Path.Combine (directory, fileName);

                    // decode and save the content to a file
                    using (var stream = File.Create (path))
                        part.Content.DecodeTo (stream);
                }
            }
        }

        client.Disconnect (true);
    }
}
See Also