Конвертиране и трансформиране на съобщения с минимален код

Конвертирането на имейл преди това означаваше зареждане в 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 е по-богатият вариант и обикновено запазва заглавките на имейла (От / До / Тема / Дата) в изхода.

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

Конверторът извиква едно от тези преповди с името на изходния файл и писател. Вашата имплементация предоставя 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-към-облак или Stream-към-HTTP-отговор обработчик.

Избор на правилния метод

| Цел | Използване | | — | — | | Целевият формат е известен при компилация | ConvertToEml / ConvertToMsg / ConvertToHtml / ConvertToMht / ConvertToMhtml | | Целевият формат се определя по време на изпълнение | Convert(..., outputType) | | Нормализиране на файлове, пропускайки тези, които вече са в целевия формат | ConvertEmlOrMsg(..., outputType) | | Записване на резултатите в папка | FolderOutputHandler | | Записване на резултатите в памет / облак / HTTP / база данни | Персонализиран IOutputHandler |