電子メールの会話を含む.emlファイルのディレクトリがあります。このタイプのファイルを解析するC#で推奨されるアプローチはありますか?
この答えを説明するためにサンプルプロジェクトを投稿しました Githubに
CDO COM DLLはWindows/IISの一部であり、.netで参照できます。正確な解析とNiceオブジェクトモデルを提供します。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;
}
-2017年8月追加:MimeKitも確認してください: https://github.com/jstedfast/MimeKit 。 .Netstandardをサポートしているため、クロスプラットフォームで実行されます。
記事の要約は4つのステップです(以下の2番目のステップは記事にはありませんが、必要です)。
「Microsoft CDO for Windows 2000 Library」への参照を追加します。これは、Visual Studioの[参照の追加]ダイアログの[COM]タブにあります。これにより、プロジェクトの「ADODB」と「CDO」に2つの参照が追加されます。
2参照「ADODB」および「CDO」の相互運用タイプの埋め込みを無効にします。 (参照-> 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#のツール/ライブラリは数多くあります。 Googleで無料のC#メールMIMEパーサーを検索します。私がこれを手に入れたように:
http://www.codeproject.com/Articles/11882/Advanced-MIME-Parser-Creator-Editorhttp://www.lumisoft.ee/lswww/download/downloads/ Net/info.txt
適切なMIMEパーサーを取得するのがおそらく方法です。無料のMIMEパーサー(codeprojectの this one など)を使用することもできますが、コード作成者のコメントは次のようになります。
MSGファイルのラッパークラスに取り組んでいたのとほぼ同時にこれに取り組みました。難易度の大きな違いです。EMLラッパークラスはおそらく仕様を読んで正しく取得するために1日、MSGラッパークラスは1週間かかりました。
コードの品質に興味を持ちました。 95%のメールを数日/数時間で正しく解析するMIMEパーサーをハッキングできると確信しています。また、残りの5%を正しく取得するには数か月かかると確信しています。 S/MIME(暗号化および署名された電子メール)、ユニコード、不正なメールクライアントとサーバーによって生成された不正な電子メール、いくつかのエンコーディングスキーマ、国際化の問題、意図的にモール形成された電子メールがアプリをクラッシュさせないことなどを処理することを検討してください...
解析する必要がある電子メールが単一のソースから来る場合は、高速でダーティなパーサーで十分です。野生からの電子メールを解析する必要がある場合、より良いソリューションが必要になる可能性があります。
Rebex Secure Mail component をお勧めしますが、他のベンダーのコンポーネントでも適切な結果が得られるはずです。
選択したパーサーが、Mike Crispin(MIMEおよびIMAP RFCの共著者)によって準備された悪名高い "Mime Torture Sample message"で正しく動作していることを確認します。 テストメッセージはMIMEエクスプローラのサンプルに表示されます であり、インストールパッケージでは ダウンロード済み になります。
次のコードは、EMLファイルを読み取って解析する方法を示しています。
using Rebex.Mail;
MailMessage message = new MailMessage();
message.Load("file.eml");
このために Papercut のMime部分を使い始めたところです。一見、まともでシンプルなようです。
public void ProcessRawContents(string raw)
{
// NB: empty lines may be relevant for interpretation and for content !!
var lRawLines = raw.Split(new []{"\r\n"}, StringSplitOptions.None);
var lMailReader = new MimeReader(lRawLines);
var lMimeEntity = lMailReader.CreateMimeEntity();
MailMessageEx Email = lMimeEntity.ToMailMessageEx();
// ...
}
(MailMessageEx
は、もちろんMailMessage
から派生しています。)
試してください:
プログラムを書く:
回避策:
Aspose.Email for .NET
Aspose.Email for .NETは、.NETアプリケーション内から電子メールを操作するためのコンポーネントのコレクションです。これにより、多数の電子メールメッセージ形式およびメッセージストレージファイル(PST/OST)とメッセージの送受信機能を簡単に使用できます。
Aspose.Emailは、MSG、[〜#〜] eml [〜#〜]、EMLXおよびMHTファイルMicrosoft Outlookをインストールする必要なし。メッセージの内容を変更できるだけでなく、メッセージオブジェクトから添付ファイルを操作(追加、抽出、削除)することもできます。受信者の追加または削除、件名またはその他のプロパティの変更により、メッセージヘッダーをカスタマイズできます。また、Mapiプロパティへのアクセスを提供することにより、電子メールメッセージを完全に制御できます。
C#Outlook MSG Outlookを必要としないファイルリーダー
MSGReaderは、Outlook MSGおよびEML(Mime 1.0)ファイルを読み取るためのC#.NET 4.0ライブラリです。Outlookのほとんどすべての共通オブジェクトがサポートされています。