Konwertuj i przekształcaj wiadomości przy minimalnym kodzie

Konwersja e‑maila kiedyś oznaczała wczytanie go do MailMessage, wybierając właściwy SaveOptions, podłączając strumienie i pamiętając, który format wymaga których przełączników. The Aspose.Email.LowCode namespace collapses all of that into a single static call. You hand it a stream, the file name, and the format you want — it figures out the rest and writes the result wherever you tell it to.5899c1__](../src/LowCodeEmailConversion) projekt, który jest dostarczany wraz z nią.

Dlaczego przestrzeń nazw „low-code”?

Aspose.Email.LowCode jest cienką, zadaniową powłoką nad pełnym API e‑mail. Istnieje dla 80% przypadków — „Chcę po prostu zamienić tę wiadomość na ten format” — gdzie nie chcesz myśleć o modelach wiadomości, MIME czy opcjach przechowywania.

Opiera się na trzech typach:

| Typ | Rola | | — | — | | Converter | Metody statyczne wykonujące konwersję. | |94b97d5590014b04_IOutputHandler) to kluczowa idea projektowa: ta sama jednowierszowa konwersja może docierać do dysku, pamięci, bazy danych, chmury lub odpowiedzi HTTP po prostu zamieniając obsługę.

API Convertera w skrócie

Każda metoda jest static, zwraca Task, i ma tę samą strukturę:

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);

| Parametr | Znaczenie | | — | — | | input | Źródłowa wiadomość jako Stream (plik, upload, bufor pamięci…). | | nameWithExtension | Oryginalna nazwa pliku, np. "message.msg". Rozszerzenie informuje Converter o formacie źródłowym, więc musi być dokładne. | | handler | The IOutputHandler który odbiera przekonwertowany strumień wyjściowy. | | outputType | (Tylko przeciążenia w czasie działania) format docelowy jako string. |

Obsługiwane formaty źródłowe to EML i MSG; obsługiwane cele to EML, MSG, HTML, MHT i MHTML.

Uwaga: te metody są asynchroniczne — zawsze await Jeśli Converter > zapisuje do obsługi jako część tego zadania, wyjście nie jest gwarantowane, że zostanie > opróżnione do momentu zwrócenia Task zostaje zakończone.

Automatyczne wykrywanie konwersji

Convert odczytuje rozszerzenie nameWithExtension, wykrywa format źródłowy i produkuje cokolwiek outputType o które prosisz. To najbardziej elastyczny punkt wejścia, gdy format docelowy jest określany w czasie działania (np. z wejścia użytkownika lub konfiguracji).

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

Gdy docelowy format jest stały i znany w czasie kompilacji, preferuj jawną, wyraźnie określającą intencję metodę. ConvertToEml przekształca Outlook .msg do standardowego 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

Odwrócony kierunek. Użyj ConvertToMsg gdy aplikacja lub odbiorca oczekuje natywnych elementów Outlook:

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 renderuje wiadomość jako odrębny dokument HTML — idealny do podglądu e‑maila w przeglądarce lub osadzenia go na stronie internetowej. Akceptuje zarówno .eml lub .msg wejście:

using FileStream input = File.OpenRead("message.eml");
var handler = new FolderOutputHandler(@"C:\output\html");

await Converter.ConvertToHtml(input, "message.eml", handler);

E‑mail → MHT i MHTML

Oba formaty pakują treść wiadomości i jej zasoby w pojedynczy plik archiwum webowego, co jest wygodne do archiwizacji lub udostępniania samodzielnego migawki. MHTML jest bogatszą odmianą i zazwyczaj zachowuje nagłówki e‑mail (From / To / Subject / Date) w renderowanym wyjściu.

// 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"));

Konwertuj tylko w razie potrzeby

ConvertEmlOrMsg konwertuje wejście do żądanego formatu tylko jeśli nie jest już w tym formacie. skieruj ją na mieszany stos .eml i .msg pliki i zapytaj o "eml": .eml pliki przechodzą, .msg pliki są konwertowane — bez konieczności samodzielnego rozgałęziania po rozszerzeniu. To czyni ją idealną do normalizacji skrzynki odbiorczej do jednego formatu.

// .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");

Konwersja wsadowa folderu

Ponieważ każda konwersja to tylko wywołanie metody, skalowanie do pracy zbiorczej wymaga prawie żadnego dodatkowego kodu — wyenumeruj pliki i ponownie użyj obsługi. Tutaj każda wiadomość w folderze jest renderowana do HTML:

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");
}

Wskazówka: FolderOutputHandler zapisuje do istniejącego folderu, ale go nie > tworzy. Wywołaj Directory.CreateDirectory(...) pierwsze. Nadanie każdemu źródłu > własnego podfolderu zapobiega również kolizjom, gdy kilka wiadomości ma tę samą nazwę bazową > (dwa message.* pliki w przeciwnym razie oba chciałyby zapisać message.html).

Wysyłanie wyjścia poza dysk

To jest miejsce, gdzie IOutputHandler abstrakcja się opłaca. Interfejs jest mały:

public interface IOutputHandler
{
    void AddOutputStream(string name, Action<Stream> writeAction);
    Task AddOutputStream(string name, Func<Stream, Task> writeActionAsync);
}

Konwerter wywołuje jedną z tych przeciążeń z nazwą pliku wyjściowego i pisarzem. Twoja implementacja dostarcza Stream i decyduje, co zrobić z bajtami. Obsługa, która przechwytuje wszystko w pamięci, wygląda tak:

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();
    }
}

Wywołanie konwersji pozostaje niezmienione — różni się tylko obsługa:

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...

Stąd krótki krok do Stream-do chmury lub Stream-do-obsługi odpowiedzi HTTP.

Wybór właściwej metody

| Cel | Użycie | | — | — | | Format docelowy znany w czasie kompilacji | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Format docelowy określany w czasie działania | Convert(..., outputType) | | Normalizuj pliki, pomijając te już w formacie docelowym | ConvertEmlOrMsg(..., outputType) | | Zapisz wyniki w folderze | FolderOutputHandler | | Zapisz wyniki w pamięci / chmurze / HTTP / bazie danych | Niestandardowy IOutputHandler |