2016-04-18 10 views
0

.NET 4.5 WebアプリケーションはクラスSmtpClientを使用して、さまざまな受信者に電子メールメッセージを作成して送信します。 各電子メールメッセージは、からなる:OSXメールアプリケーションで2回レンダリングされたインラインイメージ

  • HTMLメッセージ本体
  • 埋め込みインラインイメージ(JPEGやPNG又はGIF)
  • アタッチメント(PDF)

サンプルコードであります以下。それは正常に動作しますが、OSXユーザーからの不満が1つあります。 Appleの標準的なメールアプリケーションは画像を2回レンダリングします。メッセージ本体にインライン展開され、PDF本文のプレビューの横にメッセージ本文に続いて表示されます。


Screenshot Apple Mail, faulty message


Iは、以下の特性を有する手を加え。いずれも役に立たない。

  • SmtpClientさんDeliveryFormat
  • MailMessageのIsBodyHtmlとBodyTransferEncoding
  • AttachmentのMIMEタイプ、インライン、DispositionType、コンテンツID、ファイル名、サイズ、のCreationDate、ModificationDate

私が作曲した場合MS Outlookで同様の電子メールメッセージをAppleのユーザーに送信すると、イメージはメッセージ本体にインライン展開され、私はそれが欲しいのとまったく同じです。だから明らかにです。 ​​を読んだ後、生のMIMEデータを調べ、Outlookがmultipart/relatedを使用してメッセージ本文と画像をグループ化していることに気付きました。


Screenshot Apple Mail, message from Outlook


私の質問:私はSystem.Net.Mailで見つかったクラスでOutlookの動作を模倣するにはどうすればよい ?私はむしろしないだろう

もの:

  • 外部画像の代わりに埋め込まれたものを(多くの電子メールクライアントが最初に受信者のプライバシーを保護するためにこれらをブロック)を採用。
  • (法的な手間を避けるために)第三者のライブラリを使用します。私が見つけたSmtpDirectクラスhereは問題を解決しているようですが(返されたサーバ例外はありますが)、このような微妙な変更にはMSのSmtpClient実装の完全な書き換えを受け入れるのは難しいです。
  • 電子メールメッセージをピックアップフォルダに送信し、結果の.emlファイルを操作し、そのファイルをExchangeサーバーにプッシュします。

問題再現する最小限のコード:

using System.IO; 
using System.Net.Mail; 
using System.Net.Mime; 

namespace SendMail 
{ 
    class Program 
    { 
     const string body = "Body text <img src=\"cid:ampersand.gif\" /> image."; 

     static Attachment CreateGif() 
     { 
      var att = new Attachment(new MemoryStream(Resource1.ampersand), "ampersand.gif") 
      { 
       ContentId = "ampersand.gif", 
       ContentType = new ContentType(MediaTypeNames.Image.Gif) 
      }; 
      att.ContentDisposition.Inline = true; 
      return att; 
     } 

     static Attachment CreatePdf() 
     { 
      var att = new Attachment(new MemoryStream(Resource1.Hello), "Hello.pdf") 
      { 
       ContentId = "Hello.pdf", 
       ContentType = new ContentType(MediaTypeNames.Application.Pdf) 
      }; 
      att.ContentDisposition.Inline = false; 
      return att; 
     } 

     static MailMessage CreateMessage() 
     { 
      var msg = new MailMessage(Resource1.from, Resource1.to, "The subject", body) 
      { 
       IsBodyHtml = true 
      }; 
      msg.Attachments.Add(CreateGif()); 
      msg.Attachments.Add(CreatePdf()); 
      return msg; 
     } 

     static void Main(string[] args) 
     { 
      new SmtpClient(Resource1.host).Send(CreateMessage()); 
     } 
    } 
} 

実際に構築し、それを実行するには、次の2つの添付ファイル(ampersandHello)と3つの文字列で追加のリソースファイルResource1.resxが必要になりますがhost( SMTPサーバー)、fromおよびto(いずれも電子メールアドレス)です。

答えて

0

(私は質問を投稿しました前に、このソリューションを自分で見つけましたが、とにかく公開することにしました;。!それは他の人を助けることが、私は他のソリューションのために、まだオープンしています)

私は、所望の効果を得ることができましたクラスAlternateViewを使用してください。副作用としてScreenshot Apple Mail, fixed message



static MailMessage CreateMessage() 
{ 
    var client = new SmtpClient(Resource1.host); 
    var msg = new MailMessage(Resource1.from, Resource1.to, "The subject", "Alternative message body in plain text."); 
    var view = AlternateView.CreateAlternateViewFromString(body, System.Text.Encoding.UTF8, MediaTypeNames.Text.Html); 
    var res = new LinkedResource(new MemoryStream(Resource1.ampersand), new ContentType(MediaTypeNames.Image.Gif)) 
    { 
     ContentId = "ampersand.gif" 
    }; 
    view.LinkedResources.Add(res); 
    msg.AlternateViews.Add(view); 
    msg.Attachments.Add(CreatePdf()); 
    return msg; 
} 

、メッセージは今も(HTMLを拒否偏執Webクライアント用)、本体のプレーンテキストバージョンが含まれています。ちょっと負担ですが(「平文の代替メッセージ本文」に改善が必要です)、異なるセキュリティ設定でメッセージがどのように表示されるかをより詳細に制御できます。

関連する問題