PHPでメール送信!SendGridを使って簡単に実装する方法

PHPからSendGrid公式ライブラリを使ってメールを送る方法

はじめに

今回はPHPからSendGrid公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。

前提条件

サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。
・PHP5.3以上
・composer
・git
SendGridアカウント

本記事の内容はUbuntu上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-php)はバージョン4.0.0を使用しています。

制限事項

現状、SendGrid公式のPHPライブラリではBccを指定することができません。SendGridのAppsの設定で「BCC」機能を有効にするか、宛先リストに追加することでBccと同様の動作をさせることが可能です。

準備

コードサンプルをリポジトリからクローンします。

git clone https://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
    送信元アドレスを指定してください。

メール送信サンプルコード

今回使用したサンプルコードを以下に示します。

<?php
require 'vendor/autoload.php';
$dotenv = new DotenvDotenv(__DIR__);
$dotenv->load();

$api_key           = $_ENV['API_KEY'];
$from              = $_ENV['FROM'];
$tos               = explode(',', $_ENV['TOS']);

$sendgrid = new SendGrid($api_key, array("turn_off_ssl_verification" => true));
$email    = new SendGridEmail();
$email->setSmtpapiTos($tos)->
       setFrom($from)->
       setFromName("送信者名")->
       setSubject("[sendgrid-php-example] フクロウのお名前は%fullname%さん")->
       setText("%familyname% さんは何をしていますか?rn 彼は%place%にいます。")->
       setHtml("<strong> %familyname% さんは何をしていますか?</strong><br />彼は%place%にいます。")->
       addSubstitution("%fullname%", array("田中 太郎", "佐藤 次郎", "鈴木 三郎"))->
       addSubstitution("%familyname%", array("田中", "佐藤", "鈴木"))->
       addSubstitution("%place%", array("%office%", "%home%", "%office%"))->
       addSection('%office%', '中野')->
       addSection('%home%', '目黒')->
       addCategory('category1')->
       addHeader('X-Sent-Using', 'SendGrid-API')->
       addAttachment('./gif.gif', 'owl.gif');

$response = $sendgrid->send($email);
var_dump($response);

解説

5~8行目

環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。

12~14行目

宛先リスト、送信元アドレス、送信者名を設定しています。宛先を複数指定しても配信されたメールの宛先には他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先リストは最大で10,000アドレスまで指定可能です。

15~17行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。「%fullname%」「%familyname%」「%place%」というSubstitutionタグ(後述)と、「%office%」「%home%」というSectionタグ(後述)を埋め込んでいます。尚、タグでスペースは使用できません。

18~20行目

Substitutionタグに対応する配列を設定しています。Substitutionタグは宛先ごとに件名、本文に文字列を埋め込むための機能です。2番目の引数で指定した配列の要素が12行目で指定した宛先リスト配列の要素に対応しています。

21~22行目

Sectionタグで置換する文字列を設定しています。Sectionタグは対応する文字列に置換されます。複数箇所に同じ文字列を埋め込みたい場合に使用します。

23~25行目

カテゴリ、任意ヘッダ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。

27~28行目

メールを送信してレスポンスを出力しています。

実行結果

各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
Substitutionタグ、Sectionタグがそれぞれ指定した文字列に置換されていることが確認できます。

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

送信元アドレスに「sendgrid.info経由」と表示されているのはDomain Whitelabelを設定していないためです。正しく設定することで独自ドメインからメールを送信したように表示することができます。

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

SendGridのフリートライアル(無期限)へのお申込みはこちらから。

その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。