2009-08-20 2 views
8

Ich erstelle Emls und speichere sie in einem Verzeichnis unter Verwendung der oben genannten Prozedur über here. Ich möchte wissen, wie man diese eml-Dateien sendet? Ich habe versucht, das Objekt der SMTPClient-Klasse zu verwenden, aber das MailMessage-Objekt als Parameter verwendet und ich konnte kein Objekt vom Typ MailMessage mit diesen gespeicherten eml-Dateien finden und erstellen.Senden Sie die auf der Festplatte gespeicherten eml-Dateien

Antwort

6

Verwenden Sie EMLReader, um Daten aus der .eml-Datei abzurufen. Es enthält alle Daten, die Sie benötigen, um ein MailMessage Objekt wie From, To, Subject, Body & eine ganze Menge mehr zu erstellen.

FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite); 
EMLReader reader = new EMLReader(fs); 
fs.Close(); 

MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body); 
+2

Der angegebene Code verarbeitet keine alternativen Ansichten oder Anhänge. Der verknüpfte Artikel gibt an, dass er veraltet ist und verweist auf einen anderen (http://www.codeproject.com/KB/office/EML_ReaderEx.aspx), der die alternativen Ansichten und Anhänge besser behandelt, aber immer noch einige Probleme hat (der BCC sieht so aus) falsch restauriert als "Empfänger") – iammichael

+2

Ja, ich weiß. Ich habe nur versucht, anderen (wie mir) bei der Suche nach einer Lösung für das gleiche Problem zu helfen. Siehe auch verwandte Frage: http://stackoverflow.com/questions/936422/recommendations-on-parsing-eml-files-in-c – iammichael

7

Das Laden einer EML-Datei ist nicht so einfach wie es aussieht. Sie können eine Implementierung in 95% Fällen innerhalb weniger Tage schreiben. Verbleibende 5% würden mindestens einige Monate dauern ;-). Ich weiß, ob ich an der Entwicklung beteiligt bin.

Betrachten Sie folgenden dificulities:

  • Unicode-E-Mails
  • von rechts nach links Sprachen
  • Korrektur malformed EML-Dateien von bekannten Fehlern in der populären Mail-Clients und Servern
  • mit S verursacht Umgang/MIME (verschlüsselte und signierte E-Mail-Nachrichten)
  • Umgang mit mehreren Methoden zum Kodieren von Anhängen
  • mit Inline-Bildern und Stylesheets zu tun in HTML-E-Mails eingebettet
  • darauf achten, dass es, dass ungültige Nachricht nicht in Puffern führt overun oder eine andere Anwendung richtig ein MIME torture message von Mike Crispin (Co-Autor von Mime und IMAP RFCs)
  • sicherstellen parst Absturz
  • hierarchische Nachrichten (Nachricht mit angehängten Nachrichten)
  • dafür, dass Umgang mit, dass es richtig sehr große E-Mails behandelt

solchen Parser Maturing Jahre und kontinuierliches Feedback dauert es Benutzer sind . Derzeit ist kein solcher Parser im .NET Framework enthalten. Bis es sich ändert, würde ich einen MIME-Parser von einem etablierten Anbieter bekommen.

Der folgende Code verwendet unsere Rebex Secure Mail component, aber ich bin sicher, dass ähnliche Aufgabe leicht mit Komponenten von anderen Anbietern repliziert werden könnte. Der Code basiert auf Mail Message tutorial.

// create an instance of MailMessage 
MailMessage message = new MailMessage(); 

// load the message from a local disk file 
message.Load("c:\\message.eml"); 

// send message 
Smtp.Send(message, "smtp.example.org"); 
+1

Hallo Martin, haben Sie jemals versucht, diese Code-Nachricht.Load(). Es gibt keine solche Methode. Bitte versuchen Sie Ihren Code und dann posten Sie. –

+1

@Vikrant Der Code funktioniert gut. Es verwendet die Rebex.Mail.MailMessage-Klasse mit der Load-Methode seit Version 1.0. Es ist in der Post direkt über dem Code erwähnt. Vielleicht meinen Sie, dass System.Net.Mail.MailMessage keine Load-Methode hat? Ich weiß das - das ist der genaue Grund, warum meine Antwort eine andere Klasse verwendet. –

1

Tun Was ich getan habe ... aufgeben.

das Mailmessage Objekt Gebäude scheint der Fokus i eine ähnliche Fragen auch hier hervorragend sein müssen ... How do i send an email when i already have it as a string?

Von dem, was ich die einfachste Art und Weise gesehen habe, dies zu tun ist, eine Raw-Socket zu verwenden, um dump den gesamten Inhalt der .eml-Datei bis zum Mail-Server wie es ist und lassen Sie den Mail-Server die harten Sachen wie von, zu Thema, ect durch Parsen der E-Mail mit seiner Engine.

Das einzige Problem ...RFC 821 ... so ein Schmerz, ich versuche, einen sauberen Weg zu finden, dies zu tun und lesen Sie die E-Mails bereits in der Mailbox schnell zu.

EDIT:

fand ich eine saubere Lösung und bedeckt es in meinem Thread :)

How do i send an email when i already have it as a string?

0

Für die Datensätze:

In Nuget Packager Konsole schreiben:

Install-Package LumiSoft.Net.dll 

Dann in Ihrem Code:

using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read)) 
using (LumiSoft.Net.SMTP.Client.SMTP_Client client = 
    new LumiSoft.Net.SMTP.Client.SMTP_Client()) 
{ 
    client.SendMessage(fs); 
} 
1

Wenn Sie ein Microsoft-Shop und haben einen Exchange-Server sowieso sind, dann gibt es eine andere Lösung, die viel, viel einfacher als alles andere hier vorgeschlagen:

Jeder Exchange-Server ein Pickup-Verzeichnis konfiguriert geführt hat der Box.
Standardmäßig ist es %ExchangeInstallPath%TransportRoles\Pickup.

Sie kopieren einfach die .eml Dateien in dieses Verzeichnis, und Exchange wird automatisch die E-Mails senden.


diesen TechNet-Artikel für weitere Informationen lesen:
Pickup directory and Replay directory

0

Wie andere demonstrierten, EML zu serialize eine Mail-Nachricht nicht nur ein guter Weg ist. Sie könnten besser dran sein, indem Sie Ihre E-Mails in einem anderen Format speichern. Während es im .Net-Framework mehrere Serialisierungs-Engines gibt, um jedes Objekt zu serialisieren, könnten Sie auch in Betracht ziehen, die Komponenten Ihrer Mails, wie Adressen, Körper, Dateien, die in base64 angehängt werden, in einer Xml-Datei Ihres eigenen Designs zu speichern.

Unten ist ein Beispiel für den Einstieg:

<?xml version="1.0" encoding="utf-8"?> 
    <mail> 
     <to display="Thomas Edison" address="[email protected]" /> 
     <body> 
     Hi Thomas, 
     How are you doing? 
     Bye 
     </body> 
     <attachment name="MaryLamb.wav"> 
     cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll 
     ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg 
     c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty 
     ... 
     </attachment> 
    </mail> 

Vorteil wäre, dass, anders als bei EML Erstellen Sie nicht die SmtpClient Notwendigkeit, das Konzept Mail-Dateien zu erstellen.

Xml ist extrem einfach zu erstellen und in C# zu analysieren.

Sie haben nicht die Gründe für das Speichern von EML's angegeben. Wenn Langzeitarchivierung ein Ziel wäre, könnte XML einen Vorteil haben.

Verwandte Themen