2016-11-04 9 views
0

Я загружаю вложения из электронной почты с этим кодом:Загрузка вложений в соответствии с номером в теме (библиотека 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 ... Как я могу это сделать?

ответ

2

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

Если заказ важнее потраченного впустую пропускной способности, вы можете загрузить заголовки первых, используя client.GetHeader(i) для каждого сообщения, так что вы можете использовать значение Subject заголовка, чтобы определить порядок, но это много неиспользуемого пропускной способности, потому что вы бы просто в конечном итоге загрузите заголовки сообщений во второй раз, когда вы загрузили сообщения.

Другой вариант, чтобы загрузить все сообщения, добавьте их к List<T>, а затем отсортировать их на основе Subject перед тем итерация сообщений и сохранение вложений, но это может использовать слишком много памяти в зависимости от того, насколько большой Ваши сообщения ,

Edit:

Для IMAP, предполагается, что ваш сервер поддерживает расширение СНП, вы можете сделать что-то вроде этого:

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... 
    } 
} 

Если ваш сервер не не поддержки СНП, то вы, вероятно, может сделать что-то вроде этого:

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... 
} 
+0

Благодарим вас за ответ. Вы писали, что это невозможно в POP3. Как насчет IMAP? –

+0

Да, это возможно. Я обновил свой ответ. – jstedfast

 Смежные вопросы

  • Нет связанных вопросов^_^