ImapX - unable to redownload letter with Message.Download()

376 Views Asked by At

I want to get headers of letters from mailbox and then redownload some letters completely:

static void Main(string[] args)
{
    using (ImapX.ImapClient imap = new ImapX.ImapClient("imap.gmail.com", 993, true))
    {
        if (imap.Connect())
        {
            imap.Login("***************", "***************");
            imap.Behavior.MessageFetchMode = ImapX.Enums.MessageFetchMode.Headers;

            foreach (ImapX.Folder folder in imap.Folders)
                refreshFolder(folder);

            ImapX.Message msg = imap.Folders["INBOX"].Messages[0];
            msg.Download(ImapX.Enums.MessageFetchMode.Full, true);
        }
    }
}

static void refreshFolder(ImapX.Folder folder)
{
    foreach (ImapX.Folder subfolder in folder.SubFolders)
        refreshFolder(subfolder);

    if (folder.Selectable)
        folder.Messages.Download();
}

The code above doesn't do what I need - msg still has no anything and even lost headers after msg.Download(ImapX.Enums.MessageFetchMode.Full, true). Now I realized it tried to get data from folder I've last downloaded and it was empty.

However I managed to get full letter when not downloading messages from other folders:

static void Main(string[] args)
{
    using (ImapX.ImapClient imap = new ImapX.ImapClient("imap.gmail.com", 993, true))
    {
        if (imap.Connect())
        {
            imap.Login("***************", "***************");
            imap.Behavior.MessageFetchMode = ImapX.Enums.MessageFetchMode.Headers;

            /*foreach (ImapX.Folder folder in imap.Folders)
                refreshFolder(folder);*/

            imap.Folders["INBOX"].Messages.Download();
            ImapX.Message msg = imap.Folders["INBOX"].Messages[0];
            msg.Download(ImapX.Enums.MessageFetchMode.Full, true);
        }
    }
}

I really see no reason to remember what folder contains specific letter because I just have Message object. How to get the rest of letter?

1

There are 1 best solutions below

3
On

It sounds like what you want is msg.DownloadRawMessage ();, however, it returns a string and does not populate the existing Message structure, so you'll have to do:

msg = Message.FromEml (msg.DownloadRawMessage ());