2009-06-16 6 views
3

Ich schreibe ein C# -Programm, das E-Mail-Nachrichten verarbeitet und weiterleitet. Ich habe eine POP3-Bibliothek und einen MIME-Parser, und ich muss den MIME-Baum in eine System.Net.Mail.MailMessage kopieren.MIME-Struktur in MailMessage konvertieren

Was ist der beste Weg, verschiedene MIME-Teile zu AlternateView s, LinkedResource s und Attachment s zu mappen?

EDIT: Das wird mit alle Mail-Clients arbeiten (beide Senden und Empfangen)

Antwort

0

jetzt Richtig, ich bin zu kopieren alles mit einem Content-Disposition, die nicht inline ist, oder mit einer MIME-Kategorie etwas anderes als Text oder Bild, zu einem Attachment, irgendetwas inline, oder irgendetwas mit einer MIME-Kategorie von Image zu einem LinkedResource in der HTML-Ansicht oder der letzten Ansicht, und alles andere als AlternateView. (Ich habe dies noch nicht getestet)

0

Könnte nicht der beste Weg sein, aber ich würde versuchen, die ‚raw‘ E-Mail zu erhalten und ersetzen Sie einfach auf die zu mit dem neuen E-Mail-

+0

SmtpClient kann keine rohe MIME-Quelle senden – SLaks

+0

Wahr, es wäre ein netter kleiner Hack, damit es funktioniert (dh tcpclient mit dem smpt zu senden) oder etwas ähnliches –

2

Von einem 10.000ft Überblick, hier ist was ich tun würde.

Flachen Sie Ihre Mime-Teile in einen Baum. Stellen Sie sicher, dass jeder Teil 1 enthält, und nur 1 Teil (nicht ein Elternteil wie ein Multipart/verwandt, oder etwas ähnliches).

  1. die folgenden Bedingungen für den Körper prüfen:

    1. Wenn der erste Teil HTML ist, stellen Sie es auf den Körper der Nachricht

    2. Wenn der erste Teil Klartext ist, und der zweite Teil ist nicht html, legen Sie den Textteil im Text der Nachricht.

    3. Wenn der erste Teil einfach und der zweite Teil HTML ist, erstellen Sie 2 alternative Ansichten. *** Dies setzt voraus, dass keiner dieser Teile einen Content-Disposition: Attachment-Header hat.

  2. Schleife durch den Rest der Teile. Fügen Sie alles andere als eine Anlage, mit der Ausnahme

    1. Bilder, die eine Content-ID-Header gesetzt haben, oder

    2. Bilder, die einen Content-Location-Header gesetzt haben.

      Wenn einer dieser Header vorhanden ist, würde ich diese Bilder als LinkedResource hinzufügen (nur wenn es tatsächlich einen HTML-Körperteil gibt).

Das bekommen sollten Sie begonnen, und etwa 99% der normalen E-Mail gibt, abzudecken.

0

Hmmmm, müssen Sie unbedingt System.Net.Mail.MailMessage verwenden?

System.Net.Mail.MailMessage bietet nur eine sehr kleine Untermenge dessen, was MIME anbietet. Wenn also Ihr MIME-Parser alle/die meisten Standardfunktionen unterstützt, ist Ihr Ziel, eine MIME-Nachricht in MailMessage zu kopieren, im besten Fall schwierig und im schlimmsten Fall unmöglich. Bietet die Bibliothek, die den POP3-Zugriff bereitstellt, auch keinen SMTP-Zugriff? Wenn das der Fall wäre, würde ich System.Net.Mail.MailMessage in Ruhe lassen und mit der dritten Bibliothek fortfahren.

1

Ordnen Sie einen Textteil (Text/plain, text/html usw.), der in einem mehrteiligen/alternativen Teil enthalten ist, einem AlternateView zu. Ordnen Sie auch den ersten gefundenen Textteil einer AlternateView unabhängig von seinem übergeordneten Typ zu, um den Fall zu berücksichtigen, in dem die Nachricht nur aus einem einzelnen Textteil besteht.

Ordnen Sie die verbleibenden Teile einem Attachment oder einer LinkedResource zu, abhängig vom Content-Disposition-Header.

Ordnen Sie diese Teile mit einer Content-Disposition von Anhang zu einem Anhang zu.

Ordnen Sie diese Teile mit einer Content-Disposition von Inline- oder keinem Content-Disposition-Header einer LinkedResource zu. Dieser letzte Schritt könnte durch Prüfen, ob die Inhalts-ID mit einer Inhalts-ID übereinstimmt, auf die von einem bestimmten Textteil Bezug genommen wird, aber für praktische Zwecke könnte angenommen werden, dass alle auf diese Weise erstellten LinkedResources zu der ersten text/html AlternateView gehören (oder das letzte AlternateView erstellt, wenn es keine AlternateView vom Typ text/html gibt).