最小限のコードでメッセージを変換および変換

メール変換はかつて MailMessage、適切なものを選択します SaveOptions、ストリームの配線、どの形式がどのスイッチを必要とするかを記憶します。その Aspose.Email.LowCode 名前空間は、すべてを単一の静的呼び出しに凝縮します。ストリーム、ファイル名、希望の形式を渡すだけで、残りは自動で処理し、指定した場所に結果を書き込みます。5899c1__](../src/LowCodeEmailConversion) それに付随して出荷されるプロジェクト。

"ロウコード" 名前空間はなぜか?

Aspose.Email.LowCode フルメール API の薄いタスク指向インターフェースです。80% のケース — 「このメッセージをあの形式に変換したい」 — に対応し、メッセージモデル、MIME、永続化オプションを意識させません。

3 つの型を中心に構築されています:

| 型 | 役割 | | — | — | | 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 | (実行時オーバーロードのみ) ターゲット形式を文字列で指定します。 |

サポートされる入力形式は EMLMSG、サポートされる出力は 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);

メール → HTML

ConvertToHtml メッセージを単独の HTML ドキュメントとしてレンダリングします — ブラウザーでメールをプレビューしたり、Web ページに埋め込んだりするのに最適です。以下のいずれかを受け付けます .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

両形式ともメッセージ本文とリソースを単一の Web アーカイブファイルにバンドルします。これにより、アーカイブや自己完結型スナップショットの共有が便利になります。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);
}

コンバータは出力ファイル名とライターを渡してこれらのオーバーロードのいずれかを呼び出します。実装は 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 |