Конвертація та трансформація повідомлень за мінімального коду

Конвертація електронної пошти раніше означала завантаження її у MailMessage, вибір правильного SaveOptions, підключення потоків і запам’ятовування, який формат потребує яких перемикачів. Aspose.Email.LowCode простір імен зводить усе це до одного статичного виклику. Ви передаєте йому потік, назву файлу та потрібний формат — він визначає решту і записує результат куди завгодно.5899c1__](../src/LowCodeEmailConversion) проект, який постачається разом з ним.

Чому простір імен «low-code»?

Aspose.Email.LowCode є тонким, орієнтованим на завдання інтерфейсом над повним API електронної пошти. Він існує для 80 % випадків — «я просто хочу перетворити це повідомлення у той формат» — коли не хочете думати про моделі повідомлень, MIME чи параметри збереження.

Він побудований навколо трьох типів:

| Тип | Роль | | — | — | | Converter | Статичні методи, що виконують конверсію. | |94b97d5590014b04_IOutputHandler) — ключова ідея дизайну: та сама однорядкова конверсія може спрямовуватись у диск, пам’ять, базу даних, хмарне сховище або HTTP‑відповідь просто шляхом заміни обробника.

API Конвертера в одному погляді

Кожен метод є static, повертає Task, і має такий самий вигляд:

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

| Параметр | Значення | | — | — | | input | Джерельне повідомлення як Stream (файл, завантаження, буфер пам’яті…). | | nameWithExtension | Оригінальна назва файлу, наприклад "message.msg". Розширення повідомляє Конвертеру формат джерела, тому воно має бути точним. | | handler | IOutputHandler який отримує перетворений потік вихідних даних. | | outputType | (Тільки перевантаження під час виконання) цільовий формат як рядок. |

Підтримувані формати джерела — EML та MSG; підтримувані цілі — EML, MSG, HTML, MHT, і MHTML.

Примітка: ці методи асинхронні — завжди await вони. Конвертер > записує в обробник у рамках цього завдання, тому вихідні дані не гарантуються, що будуть > скинуті до завершення повернення Task завершено.

Автовизначення перетворення

Convert читає розширення nameWithExtension, визначає формат джерела та створює будь‑який outputType ви запитуєте. Це найгнучкіша точка входу, коли цільовий формат визначається під час виконання (наприклад, з вводу користувача або конфігурації).

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

Коли пункт призначення фіксований і відомий під час компіляції, надавайте перевагу явному, інтуїтивно зрозумілому методу. ConvertToEml перетворює Outlook .msg у стандартний 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

Зворотний напрямок. Використовуйте ConvertToMsg коли застосунок або одержувач очікує нативних елементів Outlook:

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

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

Email → HTML

ConvertToHtml виводить повідомлення як окремий HTML‑документ — ідеально для попереднього перегляду електронної пошти у браузері або вбудовування в веб‑сторінку. Приймає будь‑який .eml або .msg вхід:

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

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

Email → MHT та MHTML

Обидва формати об’єднують тіло повідомлення та його ресурси в один веб-архівний файл, що зручно для архівування або спільного використання самодостатнього знімка. MHTML — більш багатий варіант і зазвичай зберігає заголовки електронної пошти (From / To / Subject / Date) у виведеному результаті.

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

Конвертувати лише за потреби

ConvertEmlOrMsg перетворює вхід в запитаний формат тільки якщо він ще не в цьому форматі. Направте його на змішану купу .eml і .msg файли та запитують "eml": .eml файли проходять крізь, .msg файли конвертуються — без вашого розгалуження за розширенням. Це ідеально підходить для нормалізації вхідної скриньки в один формат.

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

Пакетне перетворення папки

Оскільки кожне перетворення — лише виклик методу, масштабування на пакетну роботу майже не вимагає додаткового коду — перебирайте файли та використовуйте той самий обробник. Тепер кожне повідомлення у папці перетворюється у 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");
}

Порада: FolderOutputHandler записує у існуючу папку, але не створює її. Виклик Directory.CreateDirectory(...) спочатку. Надання кожному джерелу власної підпапки також запобігає зіткненням, коли кілька повідомлень мають однакову базову назву (два message.* файли, які інакше обидва хотіли б записати message.html).

Виведення в інше місце, ніж диск

Тут саме IOutputHandler абстракція виправдовує себе. Інтерфейс мінімальний:

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

Converter викликає один із цих перевантажень з іменем вихідного файлу та writer‑ом. Ваша реалізація передає Stream і вирішує, що робити з байтами. Обробник, який захоплює все в пам’яті, виглядає так:

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

Сам виклик конвертації не змінюється — змінюється лише обробник:

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

Звідси — короткий крок до Stream-to-хмари або Stream-to-HTTP-відповідь обробника.

Вибір правильного методу

| Мета | Використання | | — | — | | Цільовий формат відомий під час компіляції | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Цільовий формат визначається під час виконання | Convert(..., outputType) | | Нормалізувати файли, пропускаючи ті, що вже у цільовому форматі | ConvertEmlOrMsg(..., outputType) | | Записати результати у папку | FolderOutputHandler | | Записати результати в пам’ять / хмару / HTTP / базу даних | Користувацький IOutputHandler |