使用MailKit / MimeKit从电子邮件中删除附件

我正在使用MailKit库来处理电子邮件,这些电子邮件运行良好。 但是,我正在尝试将电子邮件拆分为其组成文件a)主电子邮件(无附件)b)单个附件文件,存储在文件系统上。

我可以单独保存附件,但似乎无法从电子邮件正文代码中删除它们。 即它们与主电子邮件一起被保存,因此重复数据。 :/

我试过了:

foreach (MimePart part in inMessage.BodyParts) { if (part.IsAttachment) { // Remove MimePart < This function isn't available on the collection. } } 

也尝试过:

 var builder = new BodyBuilder(); foreach (MimePart part in inMessage.BodyParts) { if (!part.IsAttachment) { // Add MimeParts to collection < This function isn't available on the collection. } } outMessage.Body = builder.ToMessageBody(); 

如果有人可以帮忙解决这个问题,我会非常感激。

解决方案实施FYI:

 private string GetMimeMessageOnly(string outDirPath) { MimeMessage message = (Master as fsEmail).GetMimeMessage(); if (message.Attachments.Any()) { var multipart = message.Body as Multipart; if (multipart != null) { while (message.Attachments.Count() > 0) { multipart.Remove(message.Attachments.ElementAt(0)); } } message.Body = multipart; } string filePath = outDirPath + Guid.NewGuid().ToString() + ".eml"; Directory.CreateDirectory(Path.GetDirectoryName(outDirPath)); using (var cancel = new System.Threading.CancellationTokenSource()) { using (var stream = File.Create(filePath)) { message.WriteTo(stream, cancel.Token); } } return filePath; } 

并且仅获取附件:

 private List GetAttachments(string outDirPath) { MimeMessage message = (Master as fsEmail).GetMimeMessage(); List list = new List(); foreach (MimePart attachment in message.Attachments) { using (var cancel = new System.Threading.CancellationTokenSource()) { string filePath = outDirPath + Guid.NewGuid().ToString() + Path.GetExtension(attachment.FileName); using (var stream = File.Create(filePath)) { attachment.ContentObject.DecodeTo(stream, cancel.Token); list.Add(filePath); } } } return list; } 

您可以检索作为附件的所有MimePart https://github.com/jstedfast/MimeKit/blob/master/MimeKit/MimeMessage.cs#L734 ,然后遍历所有Multipart并调用https://github.com/ jstedfast / MimeKit / blob / master / MimeKit / Multipart.cs#L468用于删除附件。

下面的示例对邮件做了一些假设,例如,只有一个Multipart一些电子邮件客户端(Outlook)非常具有创造性,如何制作邮件。

 static void Main(string[] args) { var mimeMessage = MimeMessage.Load(@"x:\sample.eml"); var attachments = mimeMessage.Attachments.ToList(); if (attachments.Any()) { // Only multipart mails can have attachments var multipart = mimeMessage.Body as Multipart; if (multipart != null) { foreach(var attachment in attachments) { multipart.Remove(attachment); } } mimeMessage.Body = multipart; } mimeMessage.WriteTo(new FileStream(@"x:\stripped.eml", FileMode.CreateNew)); } 

从MimeKit 0.38.0.0开始,您将能够使用MimeIterator遍历MIME树结构,以收集您要删除的附件列表(并删除它们)。 为此,您的代码看起来像这样:

 var attachments = new List (); var multiparts = new List (); var iter = new MimeIterator (message); // collect our list of attachments and their parent multiparts while (iter.MoveNext ()) { var multipart = iter.Parent as Multipart; var part = iter.Current as MimePart; if (multipart != null && part != null && part.IsAttachment) { // keep track of each attachment's parent multipart multiparts.Add (multipart); attachments.Add (part); } } // now remove each attachment from its parent multipart... for (int i = 0; i < attachments.Count; i++) multiparts[i].Remove (attachments[i]); 

我创建了一个应用程序,它使用Mailkit下载电子邮件和附件。 我遇到了一个问题:从iOS发送带有附加图片的电子邮件未正确处理。 MailKit未将图像添加到“附件”列表中。

我使用此方法只获取消息的文本:

 private static string GetPlainTextFromMessageBody(MimeMessage message) { //content type needs to match text/plain otherwise i would store html into DB var mimeParts = message.BodyParts.Where(bp => bp.IsAttachment == false && bp.ContentType.Matches("text", "plain")); foreach (var mimePart in mimeParts) { if (mimePart.GetType() == typeof(TextPart)) { var textPart = (TextPart)mimePart; return textPart.Text; } } return String.Empty; } 

这是我用来下载.jpg文件的方法:

 foreach (var attachment in message.BodyParts.Where(bp => !string.IsNullOrEmpty(bp.FileName))) { if (attachment.FileName.ToLowerInvariant().EndsWith(".jpg")) { //do something with the image here } }