Click or drag to resize
MimeKit

MessageSummaryAttachments Property

Gets the attachments.

Namespace:  MailKit
Assembly:  MailKit (in MailKit.dll) Version: 3.0.0
Syntax
C#
public IEnumerable<BodyPartBasic> Attachments { get; }

Property Value

Type: IEnumerableBodyPartBasic
The attachments.

Implements

IMessageSummaryAttachments
Remarks

Traverses over the Body, enumerating all of the BodyPartBasic objects that have a Content-Disposition header set to "attachment".

This property will only be usable if the BodyStructure flag is passed to one of the Fetch or FetchAsync methods.

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