Posted at

MimeKitで.mboxファイル読んでみる

More than 1 year has passed since last update.

Google TakeoutとかでGMailのデータを取得すると、拡張子がmboxのファイルとして落ちてきます。

このmboxファイルは、電子メールのデータ(emlファイル)をそのままつなげたような構造になっていて、プログラムから簡単に読むことができます。

そうは言っても、自分でパースするのはめんどくさいので、MimeKitを使います。


MimeKitのインストール

MimeKitはNuGetからインストールできます。

検索すると何種類か出てきますが、今回は、mboxファイルをパースするだけなので、MimeKitLiteで足ります。

Liteじゃ足りないこともしたいとか、大は小を兼ねると思っている人は、フルセットを入れておくのもよいでしょう。


mboxファイルを読む

入れてしまえば、あとは公式のドキュメントに書いてあること(Parsing messages)と同じ感じですが、一応、コマンドライン引数で受け取ったファイルから読み込んで情報を表示するコードを置いておきます。


Program.cs

using System;

using System.IO;
using System.Linq;
using MimeKit;

namespace MboxRead
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Usage: MboxRead <file>");
return;
}

var inputpath = args[0];
using (var stream = File.OpenRead(inputpath))
{
// パーサを生成
var parser = new MimeParser(stream, MimeFormat.Mbox);
while (!parser.IsEndOfStream)
{
// メッセージをパースする
var message = parser.ParseMessage();

// メッセージを使って何かする
Console.WriteLine("[From]");
Console.WriteLine(string.Join(Environment.NewLine, message.From.Select(a => a.ToString())));
Console.WriteLine("[To]");
Console.WriteLine(string.Join(Environment.NewLine, message.To.Select(a => a.ToString())));
Console.WriteLine("[Subject]");
Console.WriteLine(message.Subject);
Console.WriteLine("[TextBody]");
Console.WriteLine(message.TextBody);
Console.WriteLine("[HtmlBody]");
Console.WriteLine(message.HtmlBody);
Console.WriteLine("[Attachments]");
Console.WriteLine(string.Join(Environment.NewLine, message.Attachments.Select(a => a.ContentDisposition)));
Console.WriteLine();
}
}
}
}
}



サンプルコードの作成環境


  • C#

  • .NET Framework 4.7.1

  • コンソールアプリケーション

  • Visual Studio 2017 15.7.3

  • Windows 10 Home 64bit