Bande pièces jointes à des e-mails à l'aide de MailKit / MimeKit

Je suis en utilisant MailKit bibliothèque pour gérer les e-mails, qui fonctionne bien. Cependant, je suis en train de séparer des e-mails dans leurs fichiers constitutifs a) les Principaux e-mail (sans pièces jointes) b) Les fichiers de pièce jointe, pour les enregistrer sur le système de fichiers.

Je peux enregistrer les pièces jointes individuellement, mais ne semble pas possible de les retirer du corps du message code. I. e. ils sont sauvés avec les principaux e-mail, afin de dupliquer des données. :/

J'ai essayé:

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

Avons également essayé:

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

Si quelqu'un peut aider avec cela, j'avais beaucoup apprécier.

Solution mise en œuvre pour info:

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

Et pour obtenir les pièces jointes uniquement:

private List<string> GetAttachments(string outDirPath)
        {
            MimeMessage message = (Master as fsEmail).GetMimeMessage();

            List<string> list = new List<string>();
            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;
        }
cela pourrait être utile limilabs.com/blog/download-email-attachments-net
Merci, mais ce lien est basé sur Mail.dll et je tiens à le bâton avec MailKit idéalement.
FWIW, vous n'avez pas besoin de créer un jeton d'annulation, sauf si vous prévoyez d'être en mesure d'annuler la sauvegarde de la pièce jointe sur le disque. Vous pouvez soit utiliser CancellationToken.Aucun ou tout simplement ne pas passer un jeton d'annulation.

OriginalL'auteur FrugalTPH | 2014-06-11