web-dev-qa-db-ja.com

C#での.emlファイルの解析に関する推奨事項

電子メールの会話を含む.emlファイルのディレクトリがあります。このタイプのファイルを解析するC#で推奨されるアプローチはありますか?

42
adeel825

この答えを説明するためにサンプルプロジェクトを投稿しました 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をサポートしているため、クロスプラットフォームで実行されます。

62
Ries Vriend

LumiSoft には Mimeパーサー が含まれます。

Sasa にはMimeパーサーも含まれています。

11

適切な解決策については、このリンクに従ってください:

記事の要約は4つのステップです(以下の2番目のステップは記事にはありませんが、必要です)。

  1. 「Microsoft CDO for Windows 2000 Library」への参照を追加します。これは、Visual Studioの[参照の追加]ダイアログの[COM]タブにあります。これにより、プロジェクトの「ADODB」と「CDO」に2つの参照が追加されます。

  2. 2参照「ADODB」および「CDO」の相互運用タイプの埋め込みを無効にします。 (参照-> ADODB->プロパティ-> 'Embed Interop Types'をFalseに設定し、CDOについても同じことを繰り返します)

  3. コードに次のメソッドを追加します。

    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;
    }
    
  4. このメソッドを呼び出すには、emlファイルのフルパスを渡します。このメソッドが返すCDO.Messageオブジェクトには、To、From、Subject、Bodyなど、必要なすべての解析情報が含まれます。

9
Sujeewa

おそらく必要なのは、メール/ 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

4
Samuel

適切な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");
4
Martin Vobr

このために 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から派生しています。)

3
Yahoo Serious

試してください:

  • febootimail
  • SmtpExpress
  • LinkWSニュースレターターボ
  • emlBridge-emlファイルをOutlookおよび他のほぼすべての電子メールクライアントにインポートする
  • ニュースレター2.1 Turbo
  • ThunderStor (emlResender)
  • Ruby( eml2mbox を使用)。 jimbobメソッド を参照してください。
  • 進化-新しいメッセージを作成し、emlファイルを添付し、

プログラムを書く:

回避策:

  • $ cat mail.eml | mail -s -cただし、ヘッダーは解析されず、添付ファイルも解析されません。
  • gMailにドロップします(Firefoxは添付ファイルとして保存します)
2
kenorb

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のほとんどすべての共通オブジェクトがサポートされています。

2
ofthelit