2014-06-27 24 views
7

Próbuję nauczyć się korzystać z biblioteki MailKit, ale staram się odzyskać załączniki. Do tej pory mój kod otworzy skrzynkę pocztową, przejdzie przez każdą wiadomość i zapisze dane, takie jak nadawca, temat, treść, data itp., Ale nie będę mógł zajmować się załącznikami.Zapisywanie załączników za pomocą biblioteki MailKit?

Próbowałem użyć innych rozwiązań, które można znaleźć tutaj, na Github i innych stronach, ale nadal nie rozumiem dokładnie, co robią w swoim kodzie, a kiedy zbliżam się do rozwiązania działającego, powoduje to więcej błędów więc jestem zestresowany i usuwam cały kod. Nie chcę wydawać się leniwym, ale chciałbym, żeby ktoś mógł wyjaśnić, w jaki sposób mogę to osiągnąć. Zasadniczo próbuję zbudować klienta poczty dla aplikacji formularzy internetowych.

Poniżej jest mój kod, tak jak widać jestem dość pojęcia :)

 // 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

Co, dokładnie, chcesz zrobić? Czy chcesz tylko pobrać załączniki i zapisać je na dysku (lub w jakimś miejscu)? A co z głównym tekstem głównym? – jstedfast

Odpowiedz

13

nie jestem do końca jasne, co chcesz osiągnąć, ale jeśli po prostu chcesz, aby pobrać wiadomość załączniki (bez pobierania całego wiadomość) i zapisać te załączniki do systemu plików, oto jak można to osiągnąć:

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

Witam, przepraszam za opóźnioną odpowiedź, nie było mnie przez cały weekend. Odpowiedź, którą podałeś, jest ogromną pomocą i działam tak, jak chcę teraz :) Potrzebowałem wymyślić, jak sprawdzić wiadomości dla załączników, a następnie zrobić coś z nimi, na przykład napisać na dysk. Obecnie próbuję zbudować prostego klienta pocztowego, takiego jak Gmail, Outlook itp., Który można skonfigurować na dowolnym serwerze pocztowym, aby pobierał całą pocztę i przechowywał ją lokalnie w bazie danych, a następnie wyświetlał ją użytkownikowi wraz z kontrolą nad dołączonym akta. Przepraszamy za wszystkie pytania, ale twoja biblioteka jest zdecydowanie najlepsza :) Jeszcze raz dziękuję! – Supernatix

+0

@jstedfast Próbowałem twojego kodu powyżej, nie jestem w stanie uzyskać wiadomości w tekście, ponieważ mają właściwość isattachment false – coder771

+0

Nie musisz sprawdzać IsAttachment, jeśli nie chcesz – jstedfast

3

Inną alternatywną, która pracuje dla mnie, ale wydaje się być nieco prostsze:

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

Należy zwrócić uwagę, że to pytanie dotyczy BODYSTRUKTURY zamiast BODY w instrukcji pobierania, która wydaje się naprawiać problem z załącznikami, które nie są oznaczone jako takie.

+0

Ha, okrzyki za to, nie patrzyłem na w bibliotece, ale myślał o wypróbowaniu go ponownie w nowym projekcie. Nauczyłem się trochę od czasu, gdy ostatnio prosiłem o pomoc, ale dzięki za dodanie do niej :) – Supernatix