2014-06-27 29 views
7

MailKit kitaplığını nasıl kullanacağımı öğrenmeye çalışıyorum ama ekleri almaya çalışıyorum. Şimdiye kadar, kodum bir posta kutusu açacak, her bir iletiden geçecek ve gönderen, konu, gövde, tarih vb. Gibi verileri depolayacaktır ancak eklerle ilgilenemiyorum.MailKit kitaplığını kullanarak ekleri kaydetme?

Burada bulunan diğer insanların çözümlerini github ve diğer siteler üzerinde kullanmaya çalıştım ama hala kodlarında ne yaptıklarını tam olarak anlamadım ve bir çözüm bulmak için yaklaştığımda daha fazla hataya neden oluyor Bu yüzden tüm kodları vurgulayıp sildim. Tembel görünmek istemem ama birisinin bunu nasıl başarabileceğimi açıklayabilmesini isterdim. Temel olarak bir web formu uygulaması için bir posta istemcisi oluşturmaya çalışıyorum. Aşağıda

Gördüğünüz gibi ben oldukça clueless değilim :)

 // Open the Inbox folder 
     client.Inbox.Open(FolderAccess.ReadOnly, cancel.Token); 

     //get the full summary information to retrieve all details 
     var summary = client.Inbox.Fetch(0, -1, MessageSummaryItems.Full, cancel.Token); 
     foreach (var msg in summary) 
     { 
      //this code originally downloaded just the text from the body 
      var text = msg.Body as BodyPartText; 
      //but I tried altering it so that it will get attachments here also 
      var attachments = msg.Body as BodyPartBasic; 

      if (text == null) 
      { 
       var multipart = msg.Body as BodyPartMultipart; 

       if (multipart != null) 
       { 
        text = multipart.BodyParts.OfType<BodyPartText>().FirstOrDefault(); 
       } 
      } 

      if (text == null) 
       continue; 

      //I hoped this would get the messages where the content dispositon was not null 
      //and let me do something like save the attachments somewhere but instead it throws exceptions 
      //about the object reference not set to an instance of the object so it's very wrong 
      if (attachments.ContentDisposition != null && attachments.ContentDisposition.IsAttachment) 
      { 
       //I tried to do the same as I did with the text here and grab the body part....... but no 
       var attachedpart = client.Inbox.GetBodyPart(msg.Index, attachments, cancel.Token); 
      } 

      else 
      { 
       //there is no plan b :(
      } 

      // this will download *just* the text 
      var part = client.Inbox.GetBodyPart(msg.Index, text, cancel.Token); 
      //cast main body text to Text Part 
      TextPart _body = (TextPart)part; 
+0

Tam olarak ne yapmak istersiniz? Ekleri indirmek ve diske (veya bir yere) kaydetmek mi istiyorsunuz? Ana gövde metni ne olacak? – jstedfast

cevap

13

Sana başarmak istediğiniz şeye tamamen açık değilim, ama sadece mesaj indirmek istiyorsanız, benim kodudur

var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId); 
int unnamed = 0; 

foreach (var message in messages) { 
    var multipart = message.Body as BodyPartMultipart; 
    var basic = message.Body as BodyPartBasic; 

    if (multipart != null) { 
     foreach (var attachment in multipart.BodyParts.OfType<BodyPartBasic>().Where (x => x.IsAttachment)) { 
      var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, attachment); 
      var fileName = mime.FileName; 

      if (string.IsNullOrEmpty (fileName)) 
       fileName = string.Format ("unnamed-{0}", ++unnamed); 

      using (var stream = File.Create (fileName)) 
       mime.ContentObject.DecodeTo (stream); 
     } 
    } else if (basic != null && basic.IsAttachment) { 
     var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, basic); 
     var fileName = mime.FileName; 

     if (string.IsNullOrEmpty (fileName)) 
      fileName = string.Format ("unnamed-{0}", ++unnamed); 

     using (var stream = File.Create (fileName)) 
      mime.ContentObject.DecodeTo (stream); 
    } 
} 
+0

Merhaba, gecikmeli cevap için özür dilerim, bütün hafta sonu uzaktaydım. Verdiğiniz cevap çok büyük bir yardımdır ve şimdi istediğim gibi çalışıyorum :) Ekler için iletileri nasıl kontrol edeceğimi ve sonra bunlarla bir şeyler yapmam gerektiğini, örneğin diske yazacağım. Şu anda Gmail, Outlook vb. Gibi basit bir posta istemcisi oluşturmaya çalışıyorum, herhangi bir posta sunucusuna tüm postanızı alıp veritabanında yerel olarak sakladığınızda, sonra ekte kontrol altındayken kullanıcıyla birlikte görüntüleyebilirsiniz. Dosyalar. Tüm sorular için özür dileriz, ancak kütüphaneniz en iyisi :) Tekrar teşekkürler! – Supernatix

+0

@jstedfast kodunuzu yukarıda denedim, imline mesaj alamıyorum, çünkü isattachment özelliği yanlış – coder771

+0

Bunun için – jstedfast

3

benim için çalışıyor, ama biraz daha basit gibi görünen diğer alternatif:

(iletinin tamamını indirmeden) ekleri ve dosya sistemine bu ekleri kaydetmek burada bunu başarmak için ne yapmanız
var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure | MessageSummaryItems.UniqueId); 
int unnamed = 0; 

foreach (var message in messages) { 
    foreach (var attachment in message.Attachments) { 
     var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, attachment); 
     var fileName = mime.FileName; 

     if (string.IsNullOrEmpty (fileName)) 
      fileName = string.Format ("unnamed-{0}", ++unnamed); 

     using (var stream = File.Create (fileName)) 
      mime.ContentObject.DecodeTo (stream); 
    } 
} 

Bunun, Fetch deyiminde BODY yerine BODYSTRUCTURE için sorduğunu unutmayın; bu, bu şekilde işaretlenmeyen eklerin sayısını düzeltmek gibi görünüyor.

+0

Ha tezahürat istemiyorsanız IsAttachment'i kontrol etmeniz gerekmiyor. kütüphane bir süre sonra yeni bir projede tekrar denemeyi düşünüyordu. Buraya yardım istediğimde biraz öğrendim ama buna eklediğin için teşekkürler :) – Supernatix