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

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

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

APIユーザを作成する

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

f:id:moongift:20190524133446p:plain

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

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

// SMTPサーバ経由での送信です
$api_user = 'api@smtps.jp';
$api_key  = 'YOUR_API_KEY';
$from_address = 'info@smtps.jp';
$from_name = 'Mailer';
$to_address = 'to@smtps.jp';
$to_name = 'John Doe';
$smtp_host = 'sandbox.smtps.jp';
$smtp_port = 10025;

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

メール送信にはPHPMailerを使います。インストールはComposerを使って行っています。

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
$mail->SMTPDebug = 0;
$mail->setLanguage('ja');
$mail->isSMTP();
$mail->Host       = $smtp_host;
$mail->SMTPAuth   = true;
$mail->SMTPSecure = 'tls';
$mail->Port       = $smtp_port;

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

// SMTPの認証設定です
$mail->Username   = $api_user;
$mail->Password   = $api_key;

後はメール送信を実行します。日本語の件名を使う場合には mb_encode_mimeheader を使ってエンコーディングしてください。

// メール送信情報です
$mail->setFrom($from_address, $from_name);
$mail->addAddress($to_address, $to_name);
$mail->isHTML(false);
$mail->Subject = mb_encode_mimeheader($subject);
$mail->Body = $body;

// メールを送信します
$mail->send();

これでSMTP経由でのメール送信が完了します。

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サーバ経由での送信です
$api_user = 'api@smtps.jp';
$api_key  = 'YOUR_API_KEY';
$from_address = 'info@smtps.jp';
$from_name = 'Mailer';
$to_address = 'to@smtps.jp';
$to_name = 'John Doe';

// メール配信内容です
$subject = 'テストメール from Customers Mail Cloud';
$body = "こんにちは。\r\n\r\n改行を入れました。";
$url = 'https://sandbox.smtps.jp/api/v2/emails/send.json';

配信内容は連想配列で定義します。

$data = [
  "api_user" => $api_user,
  "api_key" => $api_key,
  "to" => [
    [
      "name" => $to_name,
      "address" => $to_address
    ]
  ],
  "from" => [
    "name" => $from_name,
    "address" => $from_address
  ],
  "subject" => $subject,
  "text" => $body
];

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

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。HTTPアクセスは file_get_contents を使いますが、POSTメソッドなのでstream_context_createでコンテクストを生成してから行います。

$context = stream_context_create(array(
  'http' => array(
    'method' => 'POST',
    'header' => implode(PHP_EOL, [
      'Content-Type: application/json',
      'Accept: application/json'
    ]),
    'content'=>  json_encode($data),
    'ignore_errors' => true
  )
));

$response = file_get_contents($url, false, $context);

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

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

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

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

まとめ

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

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