しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

SendGrid の公式 C# クライアントが残念な感じだったので

本来なら SendGrid の Template Engine を使ってみた的な内容になるはずだったんですけど、公式に提供されている C# のクライアントがバグ持ちで、直すには PCL を捨てないとダメなんじゃないかという感じだったので、カッとなってオレオレクライアントを作りました。今は公開している。

https://github.com/shibayan/SendGridSharp

公式の C# クライアントだと、置換タグを使いつつメールを送信するのには以下のようなコードを書く必要があります。Web クラスとか、引数で List 渡さないといけなかったりで、ちょいちょい微妙。

var web = new SendGrid.Web(new NetworkCredential("API_USER", "API_KEY"));

var message = new SendGrid.SendGridMessage();

message.AddTo("****@****.com");
message.From = new MailAddress("****@****.com");

message.AddSubstitution("-name-", new List<string> { "抱かれたい男 No.1" });

message.Subject = "-name- さんへ";
message.Text = "-name- さん";

web.Deliver(message);

あと致命的なのが AddSubstitution メソッドで日本語を渡した時に必ず化ける点。

f:id:shiba-yan:20140911233656p:plain

原因はどうやら PCL にするために JSON へのシリアライズを半分ぐらい自力で作っちゃっている部分で、これは PCL を優先する今の実装だと修正めんどくさいと思ったので、カッとして作ったわけです。

ちなみに今回サクッと作った SendGridSharp を使うと以下のような感じ。SendGridMessage クラスは手を抜くために MailMessage クラスを継承してるのでイケてない。このあたりはやる気があれば改善したい。

var client = new SendGridClient(new NetworkCredential("API_USER", "API_KEY"));

var message = new SendGridMessage();

message.To.Add("****@****.com");
message.From = new MailAddress("****@****.com");

message.Header.AddSubstitution("-name-", "抱かれたい男 No.1");
message.UseFooter("html", "text");

message.Subject = "-name- さんへ";
message.Body = "-name- さん";

client.Send(message);

実際のところ、メインは SMTPAPI のヘッダーを作る部分だったので、とりあえずそこを作りなおしました。フィルタの設定周りで SmtpHeader クラスにメソッドを生やし過ぎるのもいまいちだと思ったので、そのあたりは拡張メソッドを使って提供することに。

そして致命的だった置換タグに日本語を入れたら化ける件も修正してあります。

f:id:shiba-yan:20140911233707p:plain

SendGridClient クラスは REST API を叩いてますが、SMTP で送信している場合には SmtpHeader クラスを使って、X-SMTPAPI ヘッダーの値を作ることが出来ます。

var header = new SmtpHeader();

header.UseFooter("html の時", "text の時");
header.UseClickTrack();
header.UseOpenTrack();

// JSON で X-SMTPAPI の値を取れる
var smtpapi = header.ToString();

SendGridSharp.Test プロジェクトにテストコードも少し入っているので、SmtpHeader クラスの使い方は見た方がわかりやすいかもしれないです。