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;
}
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez récupérer tous les
MimePart
s qui sont des pièces jointes https://github.com/jstedfast/MimeKit/blob/master/MimeKit/MimeMessage.cs#L734 et puis itérer sur l'ensemble de laMultipart
s et appel https://github.com/jstedfast/MimeKit/blob/master/MimeKit/Multipart.cs#L468 pour les pièces jointes à supprimer.L'exemple ci-dessous, quelques hypothèses sur la messagerie, par exemple, il n'est qu'un
Multipart
certains client de messagerie (Outlook) sont très créatifs combien de mails sont fabriqués.OriginalL'auteur Andreas
De départ avec MimeKit 0.38.0.0, vous serez en mesure d'utiliser un MimeIterator pour traverser le MIME structure de l'arbre à recueillir une liste des pièces jointes que vous souhaitez supprimer (et supprimer). Pour ce faire, votre code devrait ressembler à quelque chose comme ceci:
OriginalL'auteur jstedfast
J'ai créé une application qui télécharge les e-mails et pièces jointes en tant que bien à l'aide de Mailkit.
J'ai fait face à un problème: les E-Mails envoyés à partir de iOS avec photos jointes n'ont pas été traitées correctement. MailKit ne pas ajouter les images à la liste des pièces Jointes.
J'ai utilisé cette méthode pour obtenir uniquement le texte du message:
C'est la méthode que j'ai utilisé pour télécharger uniquement les .les fichiers jpg:
ok, on dirait que je n'ai pas complète obtenez vos besoins au premier. Je n'ai pas de magasin de la .eml, mais j'ai stocké le texte dans une base de données et je voulais juste pour obtenir le texte en clair. Donc, Andreas Réponse semble être plus à ce que vous recherchez. Mais comme je l'ai mentionné: essayer d'envoyer des photos depuis un appareil iOS et de voir si il va être retiré de la .eml comme vous le souhaitez. Peut-être alors le deuxième extrait de code peut vous aider dans la suppression de ces images.
FWIW, MimeKit répertorie uniquement les pièces qui ont un Contenu en-tête de Disposition avec une valeur de "l'attachement" (+ toutes les params) dans le MimeMessage.Les pièces jointes de la propriété. C'est parce que les autres sémantique est non-standard. iOS n'a sans doute pas une-tête Content-Disposition ou définit la valeur "inline", ou quelque chose.
bonne explication pourquoi les pièces jointes ne sont pas dans la liste des pièces jointes.
OriginalL'auteur pastrami01