根据主题中的号码下载附件(MailKit库)

时间:2016-11-04 13:02:30

标签: c# pop3 mailkit

我使用以下代码从电子邮件下载附件:

int count = client.Count();
List<MimeMessage> allMessages = new List<MimeMessage>(count);
for (int i = 0; i < count; i++)
{
    allMessages.Add(client.GetMessage(i));
    foreach (var attachment in allMessages[i].Attachments)
    {
        using (var stream = File.Create(AppDomain.CurrentDomain.BaseDirectory + "/folderForSegments/" + attachment.ContentType.Name))
        {
            if (attachment is MessagePart)
            {
                var part = (MessagePart)attachment;
                part.Message.WriteTo(stream);
            }
            else
            {
                var part = (MimePart)attachment;
                part.ContentObject.DecodeTo(stream);
            }
        }
    }
}

它完美无缺,但我希望按照主题中的数字顺序下载附件。例如:如果我的收件箱看起来像这样

enter image description here 附件将按顺序保存在我的光盘上:6,8,7,3,2 ...我想按顺序保存附件:1,2,3,4,5 ...我该怎么做?

1 个答案:

答案 0 :(得分:2)

对于POP3,如果不提前知道邮件在服务器上的顺序,就无法按顺序下载邮件。

如果订单比浪费的带宽更重要,您可以先为每条消息使用client.GetHeader(i)下载标题,以便您可以使用Subject标题值来确定订单,但这很多浪费带宽,因为您只是在下载邮件时第二次下载邮件标题。

另一种选择是下载所有消息,将它们添加到List<T>,然后在迭代消息并保存附件之前根据Subject对它们进行排序,但这可能会占用太多RAM取决于你的消息有多大。

编辑:

对于IMAP,假设您的服务器支持SORT扩展,您可以执行以下操作:

if (client.Capabilities.HasFlag (ImapCapabilities.Sort)) {
    var query = SearchQuery.SubjectContains ("damian_mistrz_");
    var orderBy = new OrderBy[] { OrderBy.Subject };
    foreach (var uid in folder.Sort (query, orderBy) {
        var message = folder.GetMessage (uid);

        // save attachments...
    }
}

如果您的服务器支持SORT,那么您可能会执行以下操作:

var query = SearchQuery.SubjectContains ("damian_mistrz_");
var orderBy = new OrderBy[] { OrderBy.Subject };
var uids = folder.Search (query);
var items = folder.Fetch (uids, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId);

items.Sort (orderBy);

foreach (var item in items) {
    var message  = folder.GetMessage (item.UniqueId);

    // save the attachments...
}