使用MailKit库保存附件?

我正在尝试学习如何使用MailKit库,但我正在努力检索附件。 到目前为止,我的代码将打开一个邮箱,浏览每个邮件并存储数据,如发件人,主题,正文,日期等,但我无法处理附件。

我试图在github和其他网站上使用其他人解决方案,但我仍然不明白他们在代码中做了什么,当我接近获得解决方案时,它会导致更多错误,所以我会感到压力并删除所有代码。 我并不是说看起来很懒,但如果有人能解释我是如何做到的,我会很高兴。 我基本上是在为Web表单应用程序构建一个邮件客户端。

下面是我的代码,所以你可以看到我相当无能:)

// 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().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; 

我并不完全清楚你想要完成什么,但如果你只是想下载消息附件(不下载整个消息)并将这些附件保存到文件系统,那么你可以通过以下方式实现这一点:

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

另一个对我有用的替代方案,但看起来有点简单:

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

请注意,这是在Fetch语句中要求BODYSTRUCTURE而不是BODY,这似乎解决了附件没有被标记的问题。