使用最少代码转换和转换消息

将电子邮件转换过去意味着将其加载到 MailMessage,选择正确的 SaveOptions,连接流并记住每种格式需要的开关。该 Aspose.Email.LowCode 命名空间将所有这些封装为单个静态调用。您只需提供流、文件名以及所需格式——它会自行决定其余并将结果写入您指定的位置。5899c1__](../src/LowCodeEmailConversion) 随其一起发布的项目。

为何使用 "low-code" 命名空间?

Aspose.Email.LowCode 是完整电子邮件 API 上的轻量任务导向表面。它针对 80% 的场景——“我只需要把这条消息转换成那个格式”——而不必考虑消息模型、MIME 或持久化选项。

它围绕三种类型构建:

| 类型 | 角色 | | — | — | | Converter | 执行转换的静态方法。 | |94b97d5590014b04_IOutputHandler) 是关键设计理念:相同的一行转换即可通过更换处理器,将目标指向磁盘、内存、数据库、云存储桶或 HTTP 响应。

Converter 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". 扩展名告诉 Converter 源格式,因此必须准确。 | | handler | The IOutputHandler 接收转换后输出流的 | | outputType | (仅运行时重载)目标格式作为字符串。 |

支持的源格式为 EMLMSG;支持的目标格式为 EMLMSGHTMLMHTMHTML

注意: 这些方法是异步的——始终 await 它们。Converter > 在该任务中写入处理器,因此输出在返回之前不一定会被>刷新 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 → ELM

当目标在编译时已固定且已知时,优先使用显式、意图明确的方法。 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);

电子邮件 → 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);

电子邮件 → 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);
}

Converter 使用这些重载之一并提供输出文件名和写入器。您的实现提供一个 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 |