2014-06-27 28 views
7

Tôi đang cố gắng tìm hiểu cách sử dụng thư viện MailKit nhưng tôi đang đấu tranh để lấy các tệp đính kèm. Cho đến nay mã của tôi sẽ mở một hộp thư, đi qua từng thư và lưu trữ dữ liệu như người gửi, chủ đề, nội dung, ngày vv nhưng tôi không thể xử lý các tệp đính kèm.Lưu tệp đính kèm bằng thư viện MailKit?

Tôi đã cố gắng sử dụng các giải pháp của người khác được tìm thấy ở đây, trên github và các trang web khác nhưng tôi vẫn không hiểu chính xác những gì họ đang làm trong mã của họ và khi tôi đến gần. vì vậy tôi bị căng thẳng và xóa tất cả mã. Tôi không có nghĩa là có vẻ lười biếng nhưng tôi rất thích nếu ai đó có thể giải thích làm thế nào tôi có thể đạt được điều này. Về cơ bản, tôi đang cố gắng xây dựng ứng dụng thư cho ứng dụng biểu mẫu web.

Dưới đây là mã của tôi, như vậy là bạn có thể nhìn thấy tôi khá tránh khỏi thất bại :)

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

Chính xác, bạn muốn làm gì? Bạn chỉ muốn tải xuống các tệp đính kèm và lưu chúng vào đĩa (hoặc một số địa điểm)? Điều gì về văn bản chính của cơ thể? – jstedfast

Trả lời

13

Tôi không hoàn toàn rõ ràng về những gì bạn muốn đạt được, nhưng nếu bạn chỉ muốn tải thông điệp file đính kèm (mà không cần tải toàn bộ thông điệp) và lưu những file đính kèm với hệ thống tập tin, dưới đây là cách bạn có thể thực hiện điều đó:

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

Xin chào, xin lỗi vì trả lời chậm trễ, tôi đã đi tất cả các ngày cuối tuần. Câu trả lời bạn đưa ra là một trợ giúp rất lớn và tôi có nó hoạt động như tôi muốn bây giờ :) Tôi cần tìm ra cách kiểm tra thư để đính kèm và sau đó làm gì đó với chúng chẳng hạn ghi vào đĩa. Tôi hiện đang cố gắng xây dựng một ứng dụng thư đơn giản như Gmail, Outlook, v.v. bạn có thể định cấu hình cho bất kỳ máy chủ thư nào, nó sẽ truy xuất tất cả thư của bạn và lưu trữ cục bộ trong cơ sở dữ liệu, sau đó hiển thị nó cho người dùng. các tập tin. Xin lỗi cho tất cả các câu hỏi nhưng thư viện của bạn là tốt nhất :) Cảm ơn một lần nữa! – Supernatix

+0

@jstedfast tôi đã thử mã của bạn ở trên, im không thể nhận được thông báo nội tuyến, vì chúng có thuộc tính isattachment false – coder771

+0

Bạn không cần phải kiểm tra IsAttachment nếu bạn không muốn – jstedfast

3

một cách khác mà làm việc cho tôi, nhưng dường như là đơn giản hơn một chút:

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

Lưu ý rằng đây là yêu cầu BODYSTRUCTURE thay vì BODY trong câu lệnh Fetch, có vẻ như khắc phục sự cố tệp đính kèm không bị gắn cờ như vậy.

+0

Ha cổ vũ cho điều này, tôi đã không xem xét thư viện trong một thời gian nhưng đã nghĩ đến việc thử lại nó trên một dự án mới. Đã học một chút kể từ lần cuối cùng tôi nhờ giúp đỡ ở đây nhưng cảm ơn vì đã thêm vào nó :) – Supernatix

Các vấn đề liên quan