MIMEツリーをMailMessageに変換する
-
05-07-2019 - |
質問
電子メールメッセージを処理および転送するC#プログラムを書いています。 POP3ライブラリとMIMEパーサーがあり、MIMEツリーを System.Net.Mail.MailMessage
にコピーする必要があります。
異なるMIMEパーツを AlternateView
s、 LinkedResource
s、および Attachment
sにマッピングする最良の方法は何ですか?
編集:これはすべてのメールクライアントで機能します(送信と受信の両方)
解決 3
今、私は Content-Disposition
が inline
でないもの、またはMIMEカテゴリがTextまたはImage以外のものをコピーします。 HTMLビューの LinkedResource
への Attachment
、任意の inline
、または Image
のMIMEカテゴリを持つもの最後のビュー、および AlternateView
としてのその他のもの。 (まだテストしていません)
他のヒント
10,000フィートの概要から、ここに私がすることを示します。
MIMEパーツをツリーにフラット化します。各パートには1つ、1つのパートのみが含まれていることを確認してください(マルチパート/関連のような親、またはそのようなものではありません)。
-
本文について次の条件を確認します。
-
最初の部分がHTMLの場合は、メッセージの本文に設定します
-
最初の部分がプレーンテキストで、2番目の部分が not htmlの場合、プレーンテキスト部分をメッセージの本文に設定します。
-
最初の部分がプレーンで、2番目の部分がhtmlの場合、2つの代替ビューを作成します。 ***これは、これらの部分にContent-Disposition:attachmentヘッダーがないことを前提としています。
-
-
残りの部分をループします。
以外のすべてを添付ファイルとして追加します-
content-idヘッダーが設定されている画像、または
content-locationヘッダーセットがある -
images。
これらのヘッダーのいずれかが存在する場合、それらの画像を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をそのままにして、サードパーティのライブラリが提供するものは何でも使用します。