отправленная папка пуста с помощью mailkit - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь отобразить отправленные папки, но это показывает, что в папке нет дочерних элементов.Все папки пусты, кроме входящих.Я использую следующий код.

using (var client = new ImapClient())
{
   client.Connect(credentials.incoming_host, (int)credentials.incoming_port, credentials.incoming_ssl); //for SSL
   client.Authenticate(credentials.email, credentials.password);
   client.Inbox.Open(FolderAccess.ReadOnly);

   var sentFolder= client.GetFolder(MailKit.SpecialFolder.Sent);
   var Folders = client.GetFolders(client.PersonalNamespaces[0]);

   client.Disconnect(true);
}

Я попытался отправить электронное письмо с использованием той же папки, а затем добавить его следующим образом:

var sentFolder = imapclient.GetFolder(SpecialFolder.Sent);
sentFolder.Append(message);

Мой Outlook обнаружил его и добавил вотправленная папка.

1 Ответ

0 голосов
/ 25 сентября 2019

Из MailKit README:

Если IMAP-сервер поддерживает расширение SPECIAL-USE или XLIST (GMail), вы можете получить доступ к предварительно определенному All, Drafts, Flagged (aka Important),Папки «Нежелательная почта», «Отправленные», «Корзина» и т. Д., Например:

if ((client.Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) != 0) {
    var drafts = client.GetFolder (SpecialFolder.Drafts);
} else {
    // maybe check the user's preferences for the Drafts folder?
}

В тех случаях, когда сервер IMAP не поддерживает расширения SPECIAL-USE или XLIST, для полученияпапки «Отправленные», «Черновики», «Корзина» и т. д.Например, вы могли бы использовать логику, подобную этой:

static string[] CommonSentFolderNames = { "Sent Items", "Sent Mail", "Sent Messages", /* maybe add some translated names */ };

static IFolder GetSentFolder (ImapClient client, CancellationToken cancellationToken)
{
    var personal = client.GetFolder (client.PersonalNamespaces[0]);

    foreach (var folder in personal.GetSubfolders (false, cancellationToken)) {
        foreach (var name in CommonSentFolderNames) {
            if (folder.Name == name)
                return folder;
        }
    }

    return null;
}

Используя LINQ, вы могли бы упростить это до чего-то более похожего на:

static string[] CommonSentFolderNames = { "Sent Items", "Sent Mail", "Sent Messages", /* maybe add some translated names */ };

static IFolder GetSentFolder (ImapClient client, CancellationToken cancellationToken)
{
    var personal = client.GetFolder (client.PersonalNamespaces[0]);

    return personal.GetSubfolders (false, cancellationToken).FirstOrDefault (x => CommonSentFolderNames.Contains (x.Name));
}

Другой вариант - разрешитьпользователь вашего приложения, чтобы настроить, какую папку он или она хочет использовать в качестве своей папки «Отправленные», «Черновики», «Корзина» и т. д.

Как вы справляетесь с этим, зависит от вас.

...