Nachrichten mit minimalem Code konvertieren und transformieren
Eine E‑Mail zu konvertieren bedeutete früher, sie in ein MailMessage, die richtige wählen SaveOptions, Streams verbinden und merken, welches Format welche Schalter benötigt. Der Aspose.Email.LowCode Namespace fasst all das zu einem einzigen statischen Aufruf zusammen. Sie übergeben ihm einen Stream, den Dateinamen und das gewünschte Format — er ermittelt den Rest und schreibt das Ergebnis dorthin, wo Sie es ihm sagen.5899c1__](../src/LowCodeEmailConversion) Projekt, das zusammen damit ausgeliefert wird.
Warum ein „Low‑Code“-Namespace?
Aspose.Email.LowCode ist eine dünne, aufgabenorientierte Oberfläche über der vollständigen E‑Mail‑API. Sie existiert für den 80 %-Fall — „Ich muss diese Nachricht einfach in dieses Format umwandeln“ — bei dem Sie nicht über Nachrichtenmodelle, MIME oder Persistenzoptionen nachdenken wollen.
Es ist um drei Typen herum aufgebaut:
| Typ | Rolle | | — | — | | Converter | Statische Methoden, die die Konvertierung durchführen. | |94b97d5590014b04_IOutputHandler) ist die zentrale Designidee: Die gleiche einzeilige Konvertierung kann Ziel Festplatte, Speicher, Datenbank, Cloud‑Bucket oder HTTP‑Antwort sein, indem einfach der Handler ausgetauscht wird.
Die Converter‑API auf einen Blick
Jede Methode ist static, gibt ein Task, und folgt derselben Form:
Task Converter.ConvertToEml (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMsg (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToHtml (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMht (Stream input, string nameWithExtension, IOutputHandler handler);
Task Converter.ConvertToMhtml(Stream input, string nameWithExtension, IOutputHandler handler);
// Format chosen at run time via the outputType string ("eml", "msg", "html", ...):
Task Converter.Convert (Stream input, string nameWithExtension, IOutputHandler handler, string outputType);
Task Converter.ConvertEmlOrMsg(Stream input, string nameWithExtension, IOutputHandler handler, string outputType);
| Parameter | Bedeutung | | — | — | | input | Die Quellnachricht als ein Stream (eine Datei, ein Upload, ein Speicherpuffer…). | | nameWithExtension | Der ursprüngliche Dateiname, z. B. "message.msg". Die Erweiterung sagt dem Converter das Quellformat, also muss sie korrekt sein. | | handler | Der IOutputHandler die den konvertierten Ausgabestream empfängt. | | outputType | (Nur zur Laufzeit überladene) das Zielformat als Zeichenkette. |
Unterstützte Quellformate sind EML und MSG; unterstützte Ziele sind EML, MSG, HTML, MHT und MHTML.
Hinweis: Diese Methoden sind asynchron — immer
awaitSie. Der Converter > schreibt an den Handler als Teil dieser Aufgabe, sodass die Ausgabe nicht garantiert ist, bis der zurückgegebeneTaskschließt ab.
Automatisches Erkennen der Konvertierung
Convert liest die Erweiterung von nameWithExtension, erkennt das Quellformat und erzeugt alles, was outputType Sie anfordern. Das ist der flexibelste Einstiegspunkt, wenn das Zielformat zur Laufzeit entschieden wird (z. B. aus Benutzereingaben oder Konfiguration).
using Aspose.Email.LowCode;
using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\auto");
await Converter.Convert(input, "message.msg", handler, "eml");
MSG → EML
Wenn das Ziel fest und zur Kompilierzeit bekannt ist, bevorzugen Sie die explizite, absichts‑offenbare Methode. ConvertToEml wandelt ein Outlook‑ .msg in ein standard‑RFC‑822 .eml:
using FileStream input = File.OpenRead("message.msg");
var handler = new FolderOutputHandler(@"C:\output\eml");
await Converter.ConvertToEml(input, "message.msg", handler);
EML → MSG
Die Gegenrichtung. Verwenden Sie ConvertToMsg wenn eine Anwendung oder ein Empfänger native Outlook‑Elemente erwartet:
using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\msg");
await Converter.ConvertToMsg(input, "message.eml", handler);
E‑Mail → HTML
ConvertToHtml rendert eine Nachricht als eigenständiges HTML‑Dokument — ideal, um E‑Mails im Browser vorzuschauen oder in einer Webseite einzubetten. Es akzeptiert entweder
.eml oder .msg Eingabe:
using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\html");
await Converter.ConvertToHtml(input, "message.eml", handler);
E‑Mail → MHT und MHTML
Beide Formate bündeln den Nachrichtenkörper und seine Ressourcen in einer einzigen Web-Archivdatei, was für die Archivierung oder das Teilen eines eigenständigen Schnappschusses praktisch ist. MHTML ist die reichere Variante und bewahrt typischerweise die E-Mail-Header (Von / An / Betreff / Datum) in der gerenderten Ausgabe.
// MHT
using (FileStream input = File.OpenRead("message.msg"))
await Converter.ConvertToMht(input, "message.msg", new FolderOutputHandler(@"C:\output\mht"));
// MHTML
using (FileStream input = File.OpenRead("message.eml"))
await Converter.ConvertToMhtml(input, "message.eml", new FolderOutputHandler(@"C:\output\mhtml"));
Nur bei Bedarf konvertieren
ConvertEmlOrMsg konvertiert die Eingabe in das gewünschte Format nur wenn sie nicht bereits in diesem Format vorliegt. Zeigen Sie darauf, ein gemischter Haufen von .eml und .msg Dateien und fragen nach "eml": die .eml Dateien passieren, die .msg Dateien werden konvertiert — ohne dass Sie selbst nach der Erweiterung verzweigen. Das macht es perfekt zum Normalisieren eines Posteingangs auf ein Format.
// .eml input requesting "eml" -> passes through
using (FileStream input = File.OpenRead("message.eml"))
await Converter.ConvertEmlOrMsg(input, "message.eml", handler, "eml");
// .msg input requesting "eml" -> converted
using (FileStream input = File.OpenRead("message.msg"))
await Converter.ConvertEmlOrMsg(input, "message.msg", handler, "eml");
Stapelkonvertierung eines Ordners
Da jede Konvertierung nur ein Methodenaufruf ist, erfordert das Skalieren auf Massenverarbeitung fast keinen zusätzlichen Code — die Dateien enumerieren und den Handler wiederverwenden. Hier wird jede Nachricht in einem Ordner zu HTML gerendert:
foreach (string path in Directory.EnumerateFiles(inputDir)
.Where(f => f.EndsWith(".eml") || f.EndsWith(".msg")))
{
var handler = new FolderOutputHandler(Path.Combine(outputDir, Path.GetFileNameWithoutExtension(path)));
using FileStream input = File.OpenRead(path);
await Converter.Convert(input, Path.GetFileName(path), handler, "html");
}
Tipp:
FolderOutputHandlerschreibt in einen bestehenden Ordner, erstellt ihn aber nicht. AufrufDirectory.CreateDirectory(...)zuerst. Jeder Quelle ein > eigener Unterordner zu geben verhindert ebenfalls Kollisionen, wenn mehrere Nachrichten denselben Basisnamen teilen > (zweimessage.*Dateien würden sonst beide schreiben wollenmessage.html).
Ausgabe an einen anderen Ort als die Festplatte senden
Das ist, wo die IOutputHandler Abstraktions‑Prinzip zahlt sich aus. Die Schnittstelle ist klein:
public interface IOutputHandler
{
void AddOutputStream(string name, Action<Stream> writeAction);
Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync);
}
Der Converter ruft eine dieser Überladungen mit dem Ausgabedateinamen und einem Writer auf. Ihre Implementierung liefert ein Stream und entscheidet, was mit den Bytes geschehen soll. Ein Handler, der alles im Speicher erfasst, sieht so aus:
public sealed class InMemoryOutputHandler : IOutputHandler
{
private readonly Dictionary<string, byte[]> _files = new(StringComparer.OrdinalIgnoreCase);
public IReadOnlyDictionary<string, byte[]> Files => _files;
public void AddOutputStream(string name, Action<Stream> writeAction)
{
using var buffer = new MemoryStream();
writeAction(buffer);
_files[name] = buffer.ToArray();
}
public async Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync)
{
using var buffer = new MemoryStream();
await writeActionAsync(buffer);
_files[name] = buffer.ToArray();
}
}
Der eigentliche Aufruf der Konvertierung bleibt unverändert – nur der Handler ändert sich:
var handler = new InMemoryOutputHandler();
using (FileStream input = File.OpenRead("message.msg"))
await Converter.ConvertToHtml(input, "message.msg", handler);
byte[] html = handler.Files["message.html"]; // stream it, store it, return it...
Von hier aus ist es ein kurzer Schritt zu einem Stream-zu-Cloud oder Stream-zu-HTTP-Response‑Handler.
Die richtige Methode auswählen
| Ziel | Verwendung | | — | — | | Ziel‑Format ist zur Compile‑Zeit bekannt | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Ziel‑Format zur Laufzeit festgelegt | Convert(..., outputType) | | Dateien normalisieren, bereits im Ziel‑Format vorhandene überspringen | ConvertEmlOrMsg(..., outputType) | | Ergebnisse in einen Ordner schreiben | FolderOutputHandler | | Ergebnisse in Speicher / Cloud / HTTP / Datenbank schreiben | Ein benutzerdefinierter IOutputHandler |