電子メールの会話を含む .eml ファイルのディレクトリがあります。このタイプのファイルを解析する C# で推奨される方法はありますか?
8 に答える
2017 年 8 月に追加: MimeKit を確認してください: https://github.com/jstedfast/MimeKit。.NET Standard をサポートしているため、クロスプラットフォームで実行できます。
元の回答:この回答を説明するサンプル プロジェクトを Githubに投稿しました
CDO COM DLL は Windows/IIS の一部であり、.net で参照できます。正確な解析と優れたオブジェクト モデルを提供します。ADODB.DLL への参照と組み合わせて使用します。
public CDO.Message LoadEmlFromFile(String emlFileName)
{
CDO.Message msg = new CDO.MessageClass();
ADODB.Stream stream = new ADODB.StreamClass();
stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty);
stream.LoadFromFile(emlFileName);
stream.Flush();
msg.DataSource.OpenObject(stream, "_Stream");
msg.DataSource.Save();
stream.Close();
return msg;
}
この記事の要約は 4 つのステップです (以下の 2 番目のステップは記事にはありませんが、必要です)。
Visual Studio の [参照の追加] ダイアログの [COM] タブにある "Microsoft CDO for Windows 2000 Library" への参照を追加します。これにより、プロジェクトに「ADODB」と「CDO」への 2 つの参照が追加されます。
2 つの参照 "ADODB" と "CDO" の Interop タイプの埋め込みを無効にします。(参照 -> ADODB -> プロパティ -> 'Embed Interop Types' を False に設定し、CDO についても同じことを繰り返します)
コードに次のメソッドを追加します。
protected CDO.Message ReadMessage(String emlFileName) { CDO.Message msg = new CDO.MessageClass(); ADODB.Stream stream = new ADODB.StreamClass(); stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty); stream.LoadFromFile(emlFileName); stream.Flush(); msg.DataSource.OpenObject(stream, "_Stream"); msg.DataSource.Save(); return msg; }
eml ファイルのフル パスを渡してこのメソッドを呼び出すと、返される CDO.Message オブジェクトには、To、From、Subject、Body など、必要なすべての解析済み情報が含まれます。
おそらく必要なのは、電子メール/MIME パーサーです。すべてのヘッダー フィールドを解析することはそれほど難しくありませんが、画像、添付ファイル、さまざまなテキストや html 部分などのさまざまな MIME タイプを分離することは非常に複雑になる可能性があります。
私たちはサードパーティ製のツールを使用していますが、多くの C# ツール/ライブラリが存在します。無料の C# メール MIME パーサーを Google で検索します。私がこれを手に入れたように:
http://www.codeproject.com/Articles/11882/Advanced-MIME-Parser-Creator-Editor http://www.lumisoft.ee/lswww/download/downloads/Net/info.txt
適切な MIME パーサーを入手することは、おそらく進むべき道でしょう。無料の MIME パーサー ( codeproject の this など) を使用することもできますが、コード作成者からのコメントは次のようになります。
私がこれに取り組んだのは、MSG ファイルのラッパー クラスに取り組んだのとほぼ同じ時期です。難易度に大きな差。EMLラッパー クラスは仕様を読んで理解するのに 1 日かかったかもしれませんが、MSG ラッパー クラスは 1 週間かかりました。
コードの品質に興味を持ちました。メールの 95% を正しく解析する MIME パーサーを数日/数時間でハッキングできると確信しています。また、残りの 5% を正しく処理するには数か月かかると確信しています。S/MIME (暗号化および署名された電子メール)、Unicode、不正なメール クライアントとサーバーによって生成された不正な形式の電子メール、いくつかのエンコーディング スキーマ、国際化の問題、意図的に不正な形式の電子メールがアプリをクラッシュさせないようにするなどの処理を検討してください。
解析する必要がある電子メールが単一のソースから送信されている場合は、クイック & ダーティ パーサーで十分な場合があります。野生の電子メールを解析する必要がある場合は、より優れたソリューションが必要になる可能性があります。
Rebex Secure Mail コンポーネントをお勧めしますが、他のベンダーのコンポーネントでも十分な結果が得られると確信しています。
選択したパーサーが、Mike Crispin (MIME および IMAP RFC の共著者) によって準備された悪名高い「Mime Torture Sample message」で正しく機能していることを確認します。テスト メッセージは MIME Explorer サンプルに表示され、インストール パッケージでダウンロードできます。
次のコードは、EML ファイルを読み取って解析する方法を示しています。
using Rebex.Mail;
MailMessage message = new MailMessage();
message.Load("file.eml");
試す:
- フェブートメール
- SMTPエクスプレス
- LinkWS ニュースレター Turbo
- emlBridge - eml ファイルを Outlook および事実上他のすべての電子メール クライアントにインポートする
- ニュースレター 2.1 ターボ
- ThunderStor (emlResender)
- Ruby ( eml2mboxを使用)。ジンボブ法を参照してください。
- Evolution - 新しいメッセージを作成し、eml ファイルを添付します。
プログラムを書く:
回避策:
- $ cat mail.eml | mail -s -c ただし、ヘッダーも添付ファイルも解析されません。
- それらをGMailにドロップします(Firefoxは添付ファイルとして保存します)
Aspose.Email for .NET
Aspose.Email for .NET は、.NET アプリケーション内から電子メールを操作するためのコンポーネントのコレクションです。メッセージの送受信機能に加えて、多数の電子メール メッセージ形式とメッセージ ストレージ ファイル (PST/OST) を簡単に操作できます。
Aspose.Email を使用すると、Microsoft Outlook をインストールしなくても、MSG、 EML、EMLX、MHT ファイルなどの多数のメッセージ フォーマットを簡単に作成、読み取り、操作できます。メッセージの内容を変更できるだけでなく、メッセージ オブジェクトから添付ファイルを操作 (追加、抽出、および削除) することもできます。受信者を追加または削除したり、件名やその他のプロパティを変更したりして、メッセージ ヘッダーをカスタマイズできます。また、Mapi プロパティへのアクセスを提供することで、電子メール メッセージを完全に制御できます。
- http://www.aspose.com/.net/email-component.aspx
- https://www.nuget.org/packages/Aspose.Email/
- 次の制限付きの評価版があります: http://www.aspose.com/docs/display/emailnet/Licensing
Outlook を必要としない C# Outlook MSG ファイル リーダー
MSGReader は、Outlook MSG および EML (Mime 1.0) ファイルを読み取るための C# .NET 4.0 ライブラリです。Outlook のほとんどすべての共通オブジェクトがサポートされています。