C#でメールを送信する - SMTP & Email Sending API

Customers Mail Cloudではメール送信に際して、SMTPとAPIの二種類を提供しています。昔からの使い慣れたSMTPを使っても良いですし、SMTPのポート制限されている場合でも使えるAPIを利用しても良いでしょう。

今回はこの二つのメール送信方法について、C#から利用する方法を紹介します。

APIユーザを作成する

API設定画面にて、APIユーザを作成します。アクセス権限として、SMTPは必須になります。API経由での配信を行う場合はSMTPに加えて、HTTP-APIも有効にしてください。

f:id:moongift:20190524133446p:plain

SMTPを使ったメール送信について

標準ライブラリだけで実装します。SMTPサーバのアドレスは指定されたものに置き換えてください。まず必要な変数を定義します。

// SMTPサーバ経由での送信です
string apiUser = "api@smtps.jp";
string apiKey = "YOUR_API_KEY";
string senderMail = "info@smtps.jp";
string recipientMail = "to@smtps.jp";
string smtpHost = "sandbox.smtps.jp";

// メール配信内容です
string subject = "テストメール from Customers Mail Cloud";
string body = "こんにちは。\r\n\r\n改行を入れました。";

今回は標準ライブラリのSmtpClientを使います。SSLを有効にするのを忘れないでください。

// 標準ライブラリのSmtpClientを使います
System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
sc.Host = smtpHost;
sc.Port = 10025;
sc.EnableSsl = true;

次に先ほど定義したAPIユーザ、APIキーを使って認証情報を作成します。

// SMTPの認証設定です
sc.Credentials = new System.Net.NetworkCredential(apiUser, apiKey);

後はメール送信を実行します。

// メールを送信します
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
sc.Send(senderMail, recipientMail, subject, body);

// 後片付けです
sc.Dispose();

標準ライブラリなので簡単に実装できるでしょう。

API経由でのメール送信について

APIサーバについて

APIサーバのエンドポイントURLは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
無料トライアル https://sandbox.smtps.jp/api/v2/emails/send.json
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json

SUBDOMAINは、サービス利用開始時に申請いただいたものです

変数を設定する

変数はSMTPサーバ利用時とほぼ同等、SMTPサーバの代わりにエンドポイントURLを指定します。

// SMTPサーバ経由での送信です
string apiUser = "api@smtps.jp";
string apiKey = "YOUR_API_KEY";
string senderMail = "info@smtps.jp";
string senderName = "送信元";
string recipientMail = "to@smtps.jp";
string recipientName = "User name";

string url = "https://sandbox.smtps.jp/api/v2/emails/send.json";

// メール配信内容です
string subject = "テストメール from Customers Mail Cloud";
string body = "こんにちは。\r\n\r\n改行を入れました。";

配信内容はJSONで定義しますが、標準ライブラリでは別途クラスを定義する必要があり、今回は簡易化するために文字列で定義します。本来は Json.NET や DynamicJsonなどを使うのが良いかと思います。

string content = $@"
{{
  ""api_user"" : ""{apiUser}"",
  ""api_key"" : ""{apiKey}"",
  ""to"" : [
    {{
      ""name"" : ""{recipientName}"",
      ""address"" : ""{recipientMail}""
    }}
  ],
  ""from"" : {{
    ""name"" : ""{senderName}"",
    ""address"" : ""{senderMail}""
  }},
  ""subject"" : ""{subject}"",
  ""text"" : ""{body}""
}}
";

JSONの内容については 共通仕様 | Customers Mail Cloud を参照してください。

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。HTTPアクセスは標準ライブラリのSystem.Net.WebClientを利用しています。

System.Net.WebClient wc = new System.Net.WebClient();
wc.Headers[System.Net.HttpRequestHeader.ContentType] = "application/json;charset=UTF-8";
wc.Headers[System.Net.HttpRequestHeader.Accept] = "application/json";
wc.Encoding = System.Text.Encoding.UTF8;
string response = wc.UploadString(new Uri(url), content);
wc.Dispose();

送信が成功すると、下記のようにメールIDが返ってきます。

{ id: '<1053497219.15567.1558665761030@mta02.sandbox.smtps.jp>' }

エラーがあると、下記のようにエラー内容が返ってきます。

{
  errors: [ { code: '02-001', field: 'text', message: 'text is required.' } ]
}

まとめ

サーバ上の制限によってSMTPが使えない場合でもHTTP経由でメール配信が行えますので、APIをぜひ使ってみてください。今回はC#を使いましたが、汎用的なHTTPアクセスを行っていますので、他のプログラミング言語でも簡単に実装できるでしょう。

さらに詳しい使い方についてはEmail Sending APIを参照してください。