Enregistrer des pièces jointes à l’aide de la bibliothèque MailKit?

J’essaie d’apprendre à utiliser la bibliothèque MailKit, mais j’ai du mal à récupérer les pièces jointes. Jusqu’à présent, mon code va ouvrir une boîte aux lettres, parcourir chaque message et stocker des données telles que l’expéditeur, le sujet, le corps, la date, etc., mais je ne peux pas gérer les pièces jointes.

J’ai essayé d’utiliser d’autres solutions trouvées ici, sur github et sur d’autres sites, mais je ne comprends toujours pas exactement ce qu’elles font dans leur code. Lorsque je suis sur le point d’obtenir une solution efficace, cela cause plus de bugs, donc je suis stressé et supprimez tout le code. Je ne veux pas paraître paresseux, mais j’aimerais que quelqu’un puisse expliquer comment je peux y arriver. J’essaie essentiellement de créer un client de messagerie pour une application de formulaires Web.

Ci-dessous, mon code, alors comme vous pouvez le constater, je suis assez désemparé 🙂

// Open the Inbox folder client.Inbox.Open(FolderAccess.ReadOnly, cancel.Token); //get the full summary information to resortingeve 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 sortinged 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 sortinged 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; 

Je ne suis pas tout à fait clair sur ce que vous voulez accomplir, mais si vous souhaitez simplement télécharger les pièces jointes du message (sans télécharger l’intégralité du message) et enregistrer ces pièces jointes dans le système de fichiers, voici comment procéder:

 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 (ssortingng.IsNullOrEmpty (fileName)) fileName = ssortingng.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 (ssortingng.IsNullOrEmpty (fileName)) fileName = ssortingng.Format ("unnamed-{0}", ++unnamed); using (var stream = File.Create (fileName)) mime.ContentObject.DecodeTo (stream); } } 

Une autre alternative qui fonctionne pour moi, mais semble être un peu plus simple:

 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 (ssortingng.IsNullOrEmpty (fileName)) fileName = ssortingng.Format ("unnamed-{0}", ++unnamed); using (var stream = File.Create (fileName)) mime.ContentObject.DecodeTo (stream); } } 

Notez qu’il s’agit de demander le BODYSTRUCTURE au lieu du BODY dans l’instruction Fetch, ce qui semble résoudre le problème des pièces jointes non marquées comme telles.