C# MimeKit

【C#】.emlファイルの本文を読みやすく抽出する方法(MimeKit)

公開日: 2025年7月19日

はじめに

.eml ファイルとは、メールデータをそのまま保存したファイル形式で、多くのメールソフトやサーバーが対応しています。
しかし .eml は MIME 形式で構成されており、そのままでは人間にとって読みにくい形式です。

本記事では、C# と .NET で .eml ファイルから本文テキストを抽出する方法を、人気のライブラリ MimeKit を使って解説します。

この記事でわかること

1. MimeKitとは?

MimeKit は、.NET 環境で MIME メールを解析・作成できる高機能ライブラリです。
SMTP/IMAP/POP3 のサポートも含まれており、メール処理では定番のライブラリです。

2. MimeKit のインストール方法

まずは NuGet パッケージマネージャから MimeKit をインストールします。

dotnet add package MimeKit
    

または、Visual Studio の「NuGet パッケージの管理」から「MimeKit」で検索してインストールしてください。

3. C# コード例:.emlファイルから本文を抽出する

以下は、MimeKit を使って .eml ファイルから本文テキストを抽出する C# のサンプルコードです。

using System;
using System.IO;
using MimeKit;

class Program
{
    static void Main()
    {
        string emlPath = @"output_one_mail\mail_283257.eml";

        // EMLファイルを読み込んでパース
        using var stream = File.OpenRead(emlPath);
        var message = MimeMessage.Load(stream);

        // 件名の出力
        Console.WriteLine("件名: " + message.Subject);

        // 差出人と宛先
        Console.WriteLine("差出人: " + message.From);
        Console.WriteLine("宛先: " + message.To);

        // 本文を抽出(プレーンテキスト優先)
        string bodyText = message.TextBody ?? message.HtmlBody ?? "(本文なし)";
        Console.WriteLine("\n本文:\n" + bodyText);
    }
}

4. MIME形式とは?本文が複数ある理由

メールは以下のように複数の形式(マルチパート)で構成されていることがあります:

そのため、TextBody(テキスト)か HtmlBody(HTML)のどちらかを取得する必要があります。

5. HTMLメールに対応するには?

HTMLメールの内容を処理したい場合は、HtmlBody を使って次のように抽出・表示・変換が可能です:

string html = message.HtmlBody;
string plainText = HtmlToPlainText(html); // HTML→テキスト変換処理を追加すると◎
    

※ HtmlAgilityPack を使えば、HTML からテキスト抽出も可能です。

6. 添付ファイルがある場合の処理方法

MimeKit を使えば、添付ファイルの検出・保存も簡単です:

foreach (var attachment in message.Attachments)
{
    if (attachment is MimePart part)
    {
        string fileName = part.FileName ?? "unknown.bin";
        using var fileStream = File.Create(fileName);
        part.Content.DecodeTo(fileStream);
        Console.WriteLine($"添付ファイルを保存: {fileName}");
    }
}

.eml ファイルの解析は一見難しそうに見えますが、MimeKit を使えば非常にシンプルに扱えます。


WinUI 3 / XAML の Grid.Width 設定方法

WinUI 3でMenuFlyoutをShowAtで表示する方法【コード付き解説】

MenuFlyoutWinUI 3 で便利なポップアップメニュー

WinUI 3の開発で混乱しがちな「空白のウィンドウ」と「空白のページ」の違い

PowerShellでMSIXアプリ(Storeアプリ)を起動する方法|AppUserModelIdとURIスキーム活用術

Microsoft Storeアプリ更新時のロールアウト設定まとめ

PowerShellでtail -f!WindowsでUTF-8対応のリアルタイムログ監視を実現する方法

Microsoft純正の新しいコンソールエディタ「edit」が復活!| edit.exe インストール方法

Microsoft Authenticatorのオートフィル機能が2025年7月に終了

RuntimeBroker.exeとMsEdgeWebView2.exeとは?Windows 11のプロセスについて

PowerShellでGrapheme Clusterについて処理を考える

業務用ノートパソコンのストレージは暗号化されている?BitLockerの確認と対策方法

【Windows】Volta コマンドライン インストール | Node.jsをバージョン管理する方法

【C# .NET 8 対応】List<string> を重複なしでマージする方法|

【C#】大容量ファイルを指定サイズ以下に分割する方法|.NET8対応コード付き

【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet

【C#】.emlファイルの本文を読みやすく抽出する方法

WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法

switch文でオブジェクトの型を判別する方法

【WPF】Task.Run中にUIを更新する方法

System.Text.Json 9.0.0.0 で FileNotFoundException

C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】

C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法

【Anker Soundcore Liberty 4】イヤーピース紛失!代替品はAmazonで購入

和暦設定でも安心!C#でISO 8601やカスタム日時文字列を確実にDateTimeに変換