2009-06-16 12 views
3

J'écris un programme en C# qui traite et transfère les messages électroniques. J'ai une bibliothèque POP3 et un analyseur MIME, et j'ai besoin de copier l'arbre MIME dans un System.Net.Mail.MailMessage. Quelle est la meilleure façon de mapper différentes parties MIME à AlternateView s, LinkedResource s et Attachment s?Convertir l'arbre MIME en MailMessage

EDIT: Cela fonctionne avec tous les clients de messagerie (à la fois envoyer et recevoir)

Répondre

0

En ce moment, je copier quoi que ce soit avec un Content-Disposition qui n'est pas inline, ou avec une catégorie MIME autre chose que le texte ou l'image, à Attachment, n'importe quoi inline, ou n'importe quoi avec une catégorie MIME de Image à un LinkedResource sur la vue HTML ou la dernière vue, et toute autre chose comme AlternateView. (Je n'ai pas testé encore)

0

peut-être pas la meilleure façon, mais je vais essayer d'obtenir l'e-mail « brut » et il suffit de remplacer le à la nouvelle e-mail

+0

SmtpClient ne peut pas envoyer source MIME brut – SLaks

+0

est vrai, ce serait un petit hack agréable pour le faire fonctionner (c.-à-tcpclient au SMPT d'envoyer) ou quelque chose de similaire –

2

D'un Aperçu de 10,000ft, voici ce que je ferais. Aplatissez vos parties de mime dans un arbre.

Assurez-vous que chaque partie contient 1, et seulement 1 partie (pas un parent comme un multipart/related, ou quelque chose comme ça).

  1. Vérifiez les conditions suivantes pour le corps:

    1. Si la 1ère partie est HTML, mettez-le au corps du message

    2. Si la 1ère partie est le texte brut, et la 2ème partie est pas html, définissez la partie de texte brut dans le corps du message.

    3. Si la première partie est claire et la deuxième partie est html, créez deux vues alternatives. *** Cela suppose qu'aucune de ces parties n'a un en-tête Content-Disposition: attachment.

  2. Parcourez le reste des pièces. Ajouter tout le reste comme une pièce jointe, à l'exception

    1. images qui ont un ensemble d'en-tête content-id, ou

    2. images qui ont un ensemble d'en-tête-emplacement de contenu.

      Si l'un de ces en-têtes existe, alors j'ajouterais ces images en tant que LinkedResource (seulement s'il y a réellement une partie du corps HTML).

Cela devrait vous aider à démarrer, et couvrir environ 99% de l'e-mail normale là-bas.

0

Hmmmm, avez-vous absolument besoin d'utiliser System.Net.Mail.MailMessage?

System.Net.Mail.MailMessage offre seulement un très petit sous-ensemble de ce que MIME offre. Donc, si votre analyseur MIME a pour but de prendre en charge toutes/toutes les fonctionnalités standard, votre objectif de copie d'un message MIME dans MailMessage sera difficile au mieux et impossible au pire. La bibliothèque fournissant l'accès POP3 ne fournit-elle pas également un accès SMTP? Si c'est le cas, je laisserais System.Net.Mail.MailMessage seul et irais avec ce que la bibliothèque tierce fournit.

1

Map une partie de texte (text/plain, text/html, etc.) qui est contenu dans une partie multipart/alternative à un AlternateView. Mappez également la première partie de texte rencontrée sur un objet AlternateView, quel que soit son type parent, afin de prendre en compte le cas du message constitué uniquement d'une seule partie de texte.

Mappez les pièces restantes à une pièce jointe ou à une sourceRessource, en fonction de l'en-tête Content-Disposition.

Mappez les pièces avec un contenu-Disposition de pièce jointe, à une pièce jointe.

Mappez ces parties avec un Content-Disposition de l'en-tête inline ou Content-Disposition à une LinkedResource. Cette dernière étape pourrait être finie en vérifiant que Content-ID correspondait à un Content-ID référencé à partir d'une partie de texte particulière, mais à des fins pratiques, on pourrait supposer que toutes les LinkedResources créées de cette manière appartiennent au premier texte/html AlternateView (ou le dernier AlternateView créé, s'il n'y a pas de AlternateView de type text/html).