電子メール メッセージを処理および転送する C# プログラムを作成しています。POP3 ライブラリと MIME パーサーがあり、MIME ツリーをSystem.Net.Mail.MailMessage
.
異なる MIME パーツをAlternateView
s、LinkedResource
s、およびAttachment
s にマップする最良の方法は何ですか?
EDIT:すべてのメールクライアント(送信と受信の両方)で動作します
電子メール メッセージを処理および転送する C# プログラムを作成しています。POP3 ライブラリと MIME パーサーがあり、MIME ツリーをSystem.Net.Mail.MailMessage
.
異なる MIME パーツをAlternateView
s、LinkedResource
s、およびAttachment
s にマップする最良の方法は何ですか?
EDIT:すべてのメールクライアント(送信と受信の両方)で動作します
10,000 フィートの概要から、これが私がすることです。
MIME パーツをツリーにフラット化します。各パーツに 1 つのパーツのみが含まれていることを確認してください (マルチパート/関連のような親ではありません)。
ボディの次の条件を確認します。
最初の部分が HTML の場合は、メッセージの本文に設定します
1 番目の部分がプレーン テキストで、2 番目の部分がhtml でない場合は、プレーン テキスト部分をメッセージの本文に設定します。
最初の部分がプレーンで、2 番目の部分が html の場合、2 つの代替ビューを作成します。***これは、これらのパーツのいずれにも Content-Disposition:attachment ヘッダーがないことを前提としています。
残りのパーツをループします。を除いて、他のすべてを添付ファイルとして追加します
content-id ヘッダーが設定された画像、または
content-location ヘッダーが設定された画像。
これらのヘッダーのいずれかが存在する場合は、それらの画像を LinkedResource として追加します (実際に HTML 本文部分がある場合のみ)。
これで作業を開始でき、通常のメールの約 99% をカバーできます。
multipart/alternative 部分に含まれるテキスト部分 (text/plain、text/html など) を AlternateView にマップします。また、親の型に関係なく、最初に検出されたテキスト部分を AlternateView にマップして、単一のテキスト部分のみで構成されるメッセージのケースに対応します。
Content-Disposition ヘッダーに応じて、残りの部分を Attachment または LinkedResource にマップします。
添付ファイルの Content-Disposition を使用してこれらのパーツを添付ファイルにマップします。
インラインの Content-Disposition を使用するか、Content-Disposition ヘッダーを使用しないパーツを LinkedResource にマップします。この最後のステップは、Content-ID が特定のテキスト部分から参照された Content-ID と一致することを確認することで解決できますが、実際には、この方法で作成されたすべての LinkedResources が最初の text/html AlternateView に属すると想定できます。 (または、タイプ text/html の AlternateView がない場合は、最後に作成された AlternateView)。
うーん、絶対にSystem.Net.Mail.MailMessageを使用する必要がありますか?
System.Net.Mail.MailMessageは、MIMEが提供するもののごく一部のみを提供します。したがって、MIMEパーサーがすべて/ほとんどの標準機能をサポートすることを目的としている場合、MIMEメッセージをMailMessageにコピーするという目標は、せいぜい困難であり、最悪の場合は不可能です。POP3アクセスを提供するライブラリはSMTPアクセスも提供しませんか?もしそうなら、私はSystem.Net.Mail.MailMessageをそのままにして、サードパーティのライブラリが提供するものなら何でも使用します。
現在、HTML ビューまたは最後のビューで、Content-Disposition
ではないinline
、または Text または Image 以外の MIME カテゴリを含むものを、 、 any 、または MIME カテゴリがaAttachment
のinline
ものにコピーしています。 、その他は. (私はまだこれをテストしていません)Image
LinkedResource
AlternateView
最善の方法ではないかもしれませんが、「生の」メールを取得して、to を新しいメールに置き換えるだけです。