根据主题编号下载附件(MailKit库)

Download attachments according to number in subject (MailKit library)

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

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);
            }
        }
    }
}

效果很好,但我想根据主题中的编号顺序下载附件。例如:如果我的收件箱看起来像这样

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

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

如果顺序比浪费的带宽更重要,您可以先为每条消息使用 client.GetHeader(i) 下载 header,这样您就可以使用 Subject header值来确定顺序,但这会浪费大量带宽,因为当您下载邮件时,您将再次下载邮件 headers。

另一种选择是下载所有邮件,将它们添加到 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...
}