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

PHPでメール送信!

はじめに

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

前提条件

サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。

  • PHP7.4
  • composer
  • git
  • SendGridアカウント

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

準備

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

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

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

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

<?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で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

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

さいごに

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

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

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

参考記事

その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。