読者です 読者をやめる 読者になる 読者になる

ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

SendGrid の Web API v3 で統計情報を取得する

Microsoft Azure SendGrid

久しぶりに、SendGrid の Web API のドキュメントを読んだら、Web API v3 が公開されていました。Web API v3  は、Basic 認証を使うようになり、API のリクエストの送信先ホストも変更されています。

gooner.hateblo.jp

以前の投稿で、統計情報を取得する General Statistics の Web API を使って、今月のメール送信通数を取得しました。従来の General Statistics が非推奨となり、今後は v3 の Stats を利用することを推奨しています。そこで、統計情報の取得方法を Web API v3 に置き換えてみました。

統計情報を取得する

今回も、今月のメール送信通数を通知してくれる Azure Webjobs を発行することにします。

#Program.cs
static void Main()
{
    try
    {
        var sendGridUserName = "xxx";
        var sendGridPassword = "xxx";
 
        // Basic 認証
        var parameter = Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(String.Format("{0}:{1}", sendGridUserName, sendGridPassword)));
        var authHeader = new AuthenticationHeaderValue("Basic", parameter);
 
        // 今月の統計情報を取得
        var startDate = DateTime.UtcNow.AddHours(9).AddDays(-1).ToString("yyyy-MM-01");
        var queryCollection = new Dictionary<string, string>();
        queryCollection.Add("start_date", startDate);
        queryCollection.Add("aggregated_by", "month");
        var queryString = "?" + String.Join("&", queryCollection.Select(x => String.Format("{0}={1}", x.Key, x.Value)));
        var url = "https://api.sendgrid.com/v3/stats" + queryString;
 
        int delivered = 0;
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = authHeader;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = client.GetStringAsync(url).Result;
            var statistics = JsonConvert.DeserializeObject<List<MySendGridStatisticsV3>>(response);
            delivered = statistics[0].stats[0].metrics.delivered;
        }
        var message = String.Format("今月の送信件数は、{0} 件です。", delivered);
 
        // メール送信
        var from = "admin@example.com";
 
        var to = new List<string>();
        to.Add("tony@example.com");
        var smtpapi = new Header();
        smtpapi.SetTo(to);
 
        var email = new SendGridMessage();
        email.AddTo(from);  // SmtpapiのSetTo()を使用しているため、実際にはこのアドレスにはメールは送信されない
        email.From = new MailAddress(from, "Web Services Adminstrator");
        email.Subject = "SendGrid Statistics";
        email.Text = message;
        email.Headers.Add("X-Smtpapi", smtpapi.JsonString());
 
        var credentials = new NetworkCredential(sendGridUserName, sendGridPassword);
        new Web(credentials).Deliver(email);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

パラメーターとして、Start_date に月初の日付(2015-03-01)、aggregated_by に month を指定しています。MySendGridStatisticsV3 クラスは、Visual Studio の形式を選択して貼り付けで、JSON をクラスとして貼り付けて作りました。

#MySendGridStatisticsV3.cs
public class MySendGridStatisticsV3
{
    public string date { get; set; }
    public Stat[] stats { get; set; }
}
 
public class Stat
{
    public Metrics metrics { get; set; }
}
 
public class Metrics
{
    public int blocks { get; set; }
    public int bounce_drops { get; set; }
    public int bounces { get; set; }
    public int clicks { get; set; }
    public int deferred { get; set; }
    public int delivered { get; set; }
    public int invalid_emails { get; set; }
    public int opens { get; set; }
    public int processed { get; set; }
    public int requests { get; set; }
    public int spam_report_drops { get; set; }
    public int spam_reports { get; set; }
    public int unique_clicks { get; set; }
    public int unique_opens { get; set; }
    public int unsubscribe_drops { get; set; }
    public int unsubscribes { get; set; }
}

あとは、このコンソールアプリを定期的に実行するスケジュールで WebJobs として発行するだけです。

まとめ

SendGrid の Web API のドキュメントを読んでみると、メールを送信できるだけでなく、いろいろな機能が充実していて面白いです。次回は、Event Webhook にチャレンジしてみたいと思います。