2016-11-04 4 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の場合、メッセージがサーバー上のどのような順序になっているかを事前に知らなくても、その順序でメッセージをダウンロードすることはできません。注文が無駄な帯域幅よりも重要である場合

、あなたは順序を決定するためにSubjectヘッダー値を使用できるように、最初のメッセージごとにclient.GetHeader(i)を使用してヘッダーをダウンロードできますが、それは無駄に多くの帯域幅だから、あなただけの思いメッセージをダウンロードしたときにメッセージヘッダーをもう一度ダウンロードすることになります。

もう1つの方法は、すべてのメッセージをダウンロードして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... 
} 
+0

ありがとうございました。 POP3では不可能と書いてあります。 IMAPはどうですか? –

+0

はい、可能です。私は私の答えを更新しました。 – jstedfast

関連する問題