.NET 4.5 WebアプリケーションはクラスSmtpClientを使用して、さまざまな受信者に電子メールメッセージを作成して送信します。 各電子メールメッセージは、からなる:OSXメールアプリケーションで2回レンダリングされたインラインイメージ
- HTMLメッセージ本体
- 埋め込みインラインイメージ(JPEGやPNG又はGIF)
- アタッチメント(PDF)
サンプルコードであります以下。それは正常に動作しますが、OSXユーザーからの不満が1つあります。 Appleの標準的なメールアプリケーションは画像を2回レンダリングします。メッセージ本体にインライン展開され、PDF本文のプレビューの横にメッセージ本文に続いて表示されます。
Iは、以下の特性を有する手を加え。いずれも役に立たない。
- SmtpClientさんDeliveryFormat
- MailMessageのIsBodyHtmlとBodyTransferEncoding
- AttachmentのMIMEタイプ、インライン、DispositionType、コンテンツID、ファイル名、サイズ、のCreationDate、ModificationDate
私が作曲した場合MS Outlookで同様の電子メールメッセージをAppleのユーザーに送信すると、イメージはメッセージ本体にインライン展開され、私はそれが欲しいのとまったく同じです。だから明らかにはです。 を読んだ後、生のMIMEデータを調べ、Outlookがmultipart/related
を使用してメッセージ本文と画像をグループ化していることに気付きました。
私の質問:私は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つの添付ファイル(ampersand
とHello
)と3つの文字列で追加のリソースファイルResource1.resx
が必要になりますがhost
( SMTPサーバー)、from
およびto
(いずれも電子メールアドレス)です。