PHPでメール送信!
Twilio SendGridを使って簡単に実装する方法
- 2022年6月30日
- by SendGrid
- Category: 技術ネタ 機能・使い方

はじめに
今回はPHPからTwilio SendGridの公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。
前提条件
サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。
- PHP8.1
- composer
- git
- SendGridアカウント(送信元ドメインでDomain Authenticationを設定したアカウント)
本記事の内容はmacOS上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-php)はバージョン8.0.0を使用しています。
準備
コードサンプルをリポジトリからクローンします。
git clone git@github.com:SendGridJP/sendgridjp-php-example.git
リポジトリ内に移動して.env.exampleをコピーします。
cd sendgridjp-php-example cp .env.example .env
.envファイルを編集(後述)します。
composerによる依存関係の解決を行います。
composer install
サンプルを実行します。
php -f sendgrid-php-example.php
.envファイルの編集
.envファイルは以下のような内容になっています。
API_KEY=api_key TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com FROM=you@youremail.com
API_KEY:SendGridのAPI Key(Mail SendへのFULL ACCESSパーミッションが必要)を指定してください。
TOS:宛先をカンマ区切りで指定してください。サンプルコードの関係上、宛先は3つ以上指定してください。
FROM:送信元アドレス(Domain Authenticationを設定したドメインのメールアドレス)を指定してください。
メール送信サンプルコード
今回使用したサンプルコードを以下に示します。
<?php
require "vendor/autoload.php";
use SendGrid\Mail\From;
use SendGrid\Mail\HtmlContent;
use SendGrid\Mail\Mail;
use SendGrid\Mail\PlainTextContent;
use SendGrid\Mail\Subject;
use SendGrid\Mail\To;
// .envから環境変数読み込み
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$api_key = $_ENV["API_KEY"];
$from = $_ENV["FROM"];
$to = explode(",", $_ENV["TOS"]);
// リクエストパラメータの構築
// 送信元
$from = new From($from, "送信者名");
// 宛先
$tos = [
new To(
$to[0],
"田中 太郎",
[
"%fullname%" => "田中 太郎",
"%familyname%" => "田中",
"%place%" => "中野"
]
),
new To(
$to[1],
"佐藤 次郎",
[
"%fullname%" => "佐藤 次郎",
"%familyname%" => "佐藤",
"%place%" => "目黒"
]
),
new To(
$to[2],
"鈴木 三郎",
[
"%fullname%" => "鈴木 三郎",
"%familyname%" => "鈴木",
"%place%" => "中野"
]
)
];
// 件名
$subject = new Subject(
"[sendgrid-php-example] フクロウのお名前は%fullname%さん"
);
// テキストパート
$plainTextContent = new PlainTextContent(
"%familyname% さんは何をしていますか?\r\n 彼は%place%にいます。"
);
// HTMLパート
$htmlContent = new HtmlContent(
"<strong> %familyname% さんは何をしていますか?</strong><br>彼は%place%にいます。"
);
// Mailオブジェクト生成
$email = new Mail(
$from,
$tos,
$subject,
$plainTextContent,
$htmlContent
);
// カテゴリ
$email->addCategory("category1");
// カスタムヘッダ
$email->addHeader("X-Sent-Using", "SendGrid-API");
// 添付ファイル
$data = base64_encode(file_get_contents("./gif.gif"));
$email->addAttachment(
$data,
"image/gif",
"owl.gif",
"attachment"
);
// デバッグプリント
//print_r(json_encode($email->jsonSerialize(), JSON_PRETTY_PRINT));
$sendgrid = new \SendGrid($api_key);
try {
// 送信
$response = $sendgrid->send($email);
// 結果出力
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
echo "Caught exception: ". $e->getMessage(). "\n";
}
解説
10~15行目
環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。
18~49行目
宛先リスト、送信元アドレス、送信者名、Substitution(宛先ごとの文字列置換)を設定しています。宛先を複数指定しても配信されたメールの宛先では他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先は最大で1,000アドレスまで指定可能です。
50~61行目
メールの件名と本文(text/plainおよびtext/html)を設定しています。「%fullname%」「%familyname%」「%place%」はSubstitutionタグと呼ばれ、26〜28行目のSubstitutionタグで指定した値に置換されてメール送信されます。なお、タグでスペースは使用できません。
70~81行目
カテゴリ、カスタムヘッダ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。
88~93行目
メールを送信してレスポンスを出力しています。
実行結果
各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
Substitutionタグで指定した文字列に置換されていることが確認できます。
宛先1で受信したメール

宛先2で受信したメール

さいごに
SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。
Twilio SendGridのアカウントは無料で作成でき、Freeプランでも無期限でほぼ全ての機能を利用可能です。ぜひご利用ください。

その他の言語については、メール送信チュートリアル【まとめ】をご覧ください。
参考記事
その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。


