2015-09-11 3 views
4

J'ai récemment créé mon propre client de messagerie et ajouté une option de réception, j'ai utilisé mimekit et mailkit en tant que plugins et j'ai pu télécharger la plupart de mes mails avec un lecteur censé afficher du contenu. , à partir de, date)Mimekit/mailkit télécharger le corps du message?

La façon dont j'ai téléchargé le sujet, à, ... est msg.envelope.subject, msg.envelope.to Mais je ne peux pas télécharger le corps comme ceci :(en faisant soit msg.body , msg.textbody, msg.bodyparts, ... ils ont tous fait en rien, l'endroit où il devrait être est juste vide, je ne peux pas l'obtenir téléchargé :(

quelqu'un peut-il me aider?

Répondre

5

Il y a 2 façons d'obtenir le corps du message:

1. Téléchargez le message entier

Cette méthode est probablement la meilleure façon.

Pour ce faire, tout ce que vous devez faire est d'appeler:

var message = folder.GetMessage (uid); 

ou

var message = folder.GetMessage (index); 

Je vous recommande d'utiliser toujours le UniqueId du message. Puisque vous utilisez déjà la méthode Fetch, tout ce que vous devez faire pour vous assurer que vous avez le UniqueId du message est d'inclure le MessageSummaryItems.UniqueId dans votre demande de récupération:

var messages = folder.Fetch (0, -1, MessageSummaryItems.UniqueId | 
    MessageSummaryItems.Envelope | ...); 

Une fois que vous avez le message, vous pouvez fais ce que tu veux avec.

Pour le rendu du message, je vous recommande de jeter un oeil à l'échantillon MessageReader inclus dans le dépôt GitHub MimeKit. Il vous montrera comment rendre correctement un MimeMessage.

2. Téléchargez seulement ce que vous devez

Cette méthode est un peu plus difficile, mais peut être plus efficace dans la mesure où l'utilisation va de la bande passante réseau.

La première chose à faire est de vous assurer d'inclure l'indicateur de bit MessageSummaryItems.BodyStructure dans la méthode Fetch. Par exemple:

var messages = folder.Fetch (0, -1, MessageSummaryItems.Envelope | 
    MessageSummaryItems.BodyStructure); 

(Vous aurez probablement besoin d'autres domaines, mais c'est juste un exemple pour vous montrer comment ou drapeaux au niveau du bit ainsi que de demander des éléments de synthèse de messages multiples). En demandant le BodyStructure des messages, vous pourrez utiliser la propriété msg.Body.

Chaque msg.Body sera un objet BodyPart qui est une classe abstraite. Les 2 sous-classes principales sont BodyPartMultipart et BodyPartBasic.Vous pouvez utiliser la distribution as ou le mot-clé is pour savoir laquelle il est:

var multipart = msg.Body as BodyPartMultipart; 

if (multipart != null) { 
    // the top-level body part is a multi-part 
} else { 
    // the body is a basic singleton part 
} 

Voici comment vous itérer sur les sous-parties d'un BodyPartMultipart:

foreach (var part in multipart.BodyParts) { 
    // each part will either be a BodyPartMultipart 
    // or a BodyPartBasic, just like before... 
} 

Il y a aussi 2 sous-classes de BodyPartBasic qui sont: BodyPartText et BodyPartMessage. Un BodyPartText est une partie MIME textuelle (c'est-à-dire qu'elle a un type MIME de text/*) alors qu'un BodyPartMessage est un message incorporé (et aura un type MIME de message/rfc822).

Puisque MIME est récursif, vous devrez implémenter une fonction récursive pour parcourir l'arborescence MIME afin de trouver la partie MIME que vous recherchez.

Pour votre commodité, les TextBody et HtmlBody propriétés sur l'interface IMessageSummary localiseront et renvoyer les parties du corps text/plain et text/html, respectivement.

Il convient de noter, cependant, que ces propriétés fonctionnent uniquement dans les cas où la structure du message suit la convention standard (notez convention, il n'y a pas de norme formelle dictant l'emplacement du texte du message dans un Hiérarchie MIME).

Il convient également de noter que si votre client de messagerie sera le rendu le corps HTML, la partie du corps HTML peut faire partie d'un groupe de parties MIME connexes (c.-à-enfant d'un multipart/related), mais la propriété HtmlBody ne sera pas être en mesure de retourner cela et donc la mise en œuvre de votre propre logique récursive sera une meilleure option.

Pour un exemple de procédure, consultez l'exemple ImapClientDemo dans le référentiel MailKit GitHub. La logique réside actuellement dans le code MainWindow.cs.

+0

Merci, mais j'ai une question, sur la documentation de mimekit il continue de se référer à "flux" (par exemple var message = MimeMessage.Load (STREAM);) Je n'ai aucune idée d'où cela vient, j'ai essayé de créer un flux de mémoire mais il a jeté une exception: la valeur ne peut pas être nulle – user265889

+0

Eh bien, la méthode Load() analyse un flux ... donc si vous passez dans un flux vide, alors il ne peut pas l'analyser, n'est-ce pas? Si vous écrivez du contenu dans le flux avant de le transmettre à la méthode Load(), assurez-vous de revenir au début du flux. – jstedfast

+0

BTW, le flux peut être de 'File.OpenRead()' ou 'new FileStream()' et c'est généralement de quoi ils proviendront. – jstedfast