使用最少代码转换和转换消息
将电子邮件转换过去意味着将其加载到 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 | (仅运行时重载)目标格式作为字符串。 |
支持的源格式为 EML 和 MSG;支持的目标格式为 EML、MSG、HTML、MHT 和 MHTML。
注意: 这些方法是异步的——始终
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 |