サイトアイコン Mailtrap

【徹底解説】SMTPやAPI、PHPMailer、Symfony Mailer、mail()関数を使ったPHPによるメール送信

PHPでメールを送る方法を知りたいと思っている方は大勢います。なんと2024年でも全ウェブサイトの76.4%がPHPを使っているというW3Techのレポートもあるほどです。

筆者はこのトピックについて長く調べてきており、この記事ではPHPでメールを送信する際に最もよく使われるオプションを解説いたします。

この記事でご紹介するプロセスやコードブロックは、PHPバージョン7以上に対応しています。

PHPMailerを使ったメールの送り方

PHPMailer はPHPで最も人気のあるメール送信ライブラリの1つです。多くのPHPフレームワーク(例: LaravelSymfony など)と互換性があり、以下のような強力な機能が備わっています。

なおPHPMailerには独自のメール送信機能が組み込まれていない点に、ご注意ください。PHPのmail()関数を利用したメール送信も可能ですが、スパム関連の問題がある上にプロセスも複雑なため、お勧めできません。詳細はPHPMailerについての記事をご覧ください。

PHPMailerは理想的には、外部のSMTPサーバーと組み合わせて使われるべきものです。信頼性とセキュリティが確保されるため、PHPアプリケーションのメール送信機能として非常に適しています。

では、これからまずPHPMailerを任意のSMTPプロバイダー(例:Mailtrap、SendGrid、Postmark など)で設定する方法を説明します。その後、実際の使い勝手を理解していただくために、Mailtrap SMTPと共に使う方法をご紹介します。

まずPHPの依存関係マネージャーComposerを介してライブラリをインストールします。これはPHPMailerの制作者により、GitHubページで推奨されています。手動インストール用のマニュアルもあるので適宜ご参照ください。

Composerをインストールした後は、composer.jsonファイルに以下の行を追加します。

"phpmailer/phpmailer": "^6.9"

または、以下のコマンドを実行します。

composer require phpmailer/phpmailer

Composerをインストールしたくない場合は、手動でPHPMailerを追加することもできます。特にテスト環境では便利でしょう。PHPMailerのソースコードをダウンロードし、PHPMailerフォルダーの内容をPHP構成で指定されているinclude_pathディレクトリにコピーし、各クラスファイルを手動で読み込みます。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

次にSMTPサービスプロバイダーから提供される資格情報(例:ユーザー名、パスワード、SMTPポートなど)を追加します。設定例は以下の通りです。

$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'api';
$mail->Password = '1a2b3c4d5e6f7g';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

上記を含むメール送信用コード全体は以下の通りです。

<?php
// Start with PHPMailer class
use PHPMailer\PHPMailer\PHPMailer;
require_once './vendor/autoload.php';
// create a new object
$mail = new PHPMailer();
// configure an SMTP
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'api';
$mail->Password = '1a2b3c4d5e6f7g';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

$mail->setFrom('確認@登録済みの-ドメイン', 'あなたのホテル');
$mail->addAddress('受信者@gmail.com', '私');
$mail->Subject = '当ホテルをご利用いただきありがとうございます!';
// HTML設定
$mail->isHTML(TRUE);
$mail->Body = '<html>こんにちは!<br>ご予約を確認いたしました。</br> 添付書類をご確認ください。</html>';
$mail->AltBody = 'こんにちは!ご予約を確認いたしました。添付書類をご確認ください。';
// 添付ファイルを追加
$attachmentPath = './confirmations/yourbooking.pdf';
if (file_exists($attachmentPath)) {
    $mail->addAttachment($attachmentPath, 'yourbooking.pdf');
}

// メッセージを送信
if(!$mail->send()){
    echo 'メッセージを送信できませんでした。';
    echo 'エラー内容: ' . $mail->ErrorInfo;
} else {
    echo 'メッセージが送信されました';
}

Symfony Mailerを使ったメールの送り方

2024年現在、Pear:: MailやSwift Mailerはかなり古くなっており、PHPでメールを送信する場合、Symfony Mailerが最適です。Symfonyのフレームワークは非常に柔軟で、Symfony 4.3 リリースでは新しいMailerおよびMimeコンポーネントが導入されており、以下の機能を提供しています。

PHPMailerと同様にSymfonyでも、Sendmailや他のローカル送信方法を使うと、外部SMTPサービスを利用するしないに関わらずメールを送信できます。Sendmailはスパムフィルターに引っかかりやすくメンテナンスが難しいため、個人的にはオススメしませんが、以下が送り方の詳細です。

まず、MimeとMailerコンポーネントをインストールします。

composer require symfony/mailer

次に、以下のスクリプトを実行します。

<?php

use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport\SendmailTransport;
use Symfony\Component\Mime\Email;

require_once './vendor/autoload.php';

// Sendmailトランスポートを作成
$transport = new SendmailTransport();

// 作成したトランスポートを使ってMailerを作成
$mailer = new Mailer($transport);

// 新しいメールを作成
$email = (new Email())
    ->from('こんにちは@サンプル.com')
    ->to('あなたの名前@サンプル.com')
    ->subject('SymfonyでSendmailを使ってメール送信')
    ->text('Sendmailのメール送信は簡単!')
    ->html('<p>より良いHTML統合のためにTwigを使ってみてください!</p>');

// メールを送信
$mailer->send($email);

セキュリティと到達率を重視する場合は、外部のSMTPサービスを使いながらSymfonyを使うことをお勧めします。以下がコードスニペットです。

<?php

use Symfony\Component\Mailer\Mailer; 
use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport; 
use Symfony\Component\Mime\Email;

require_once './vendor/autoload.php';

// SMTPトランスポートを作成
$transport = (new Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport
('smtp.server.com', 587))
                ->setUsername('username')
                ->setPassword('password');

// トランスポートを使ってMailerを作成
$mailer = new Mailer($transport); 

// 新しいメールを作成
$email = (new Email())
            ->from('こんにちは@登録済み.com')
            ->to('あなたの名前@サンプル.com')
            ->subject('Symfony Mailerでメール送信!')
            ->text('メール送信が楽しくなりました!')
            ->html('<p>より良いHTML統合のためにTwigを使ってみてください!</p>');

// メールを送信
$mailer->send($email);

Symfony Mailerを使ったメール送信についてもっとお知りになりたい方は、詳細ガイド公式ドキュメントをご覧ください。

PHPのmail()関数でメールを送る

PHPのmail()関数はPHPからメールを送るための組み込み関数ですが、いくつかの制限や欠点があるので、それほど人気がありません。

ローカルのメールサーバー設定に依存する(例:お使いのウェブサーバーかメールを送信する)ため、迷惑メールとして判定されたり、メールサービスプロバイダーにより拒否されたりすることがあり、配信到達性に関する問題が発生しやすくなっています。しかも、メールトラッキングなど高度な機能がない上、メールインジェクション攻撃に対して脆弱です。

これらの理由からmail()関数の使用はお勧めできませんが、ご参考のために使い方を説明いたします。

PHP mail()関数の構文は非常にシンプルです。

<?php
mail($to,$subject,$message,[$headers],[$parameters]);
?>

必須パラメータは以下の通りです。

追加のヘッダーとして CCBCC を使って、他の受信者やメッセージのコピーの指定が可能です。なおキーがヘッダー名、値がヘッダーの内容の配列または文字列にすることができます。この場合、ヘッダーはCRLF(\r\n)で区切ります。

以下は、追加ヘッダーを使ってプレーンテキストのメールを送信する方法です。

<?php
$to = "誰かの名前@サンプル.com";
$subject = "件名";
$txt = "こんにちは、世界の皆さん!";
$headers = "From: ウェブマスター@サンプル.com" . "\r\n" .
"CC: 別の誰かの名前@サンプル.com";

mail($to,$subject,$txt,$headers);
?>

PHPファイルのインストールフォルダーに移動し、php.ini ファイルでSMTP設定を構成する必要もあります。ただしこれはローカルホストやXAMPPのようなソリューションでのみ機能します。前述のようにPHPのmail()関数はSMTP認証をサポートしておらず、外部サーバー経由のメッセージ送信ができないためです。

さて、mail関数でHTMLメールを送信するのがいかに難しいか疑問がある場合は、以下のHTMLメッセージの一般的な記述例をご覧ください。

// メッセージ
$message = '
<html>
<head>
  <title>レビューリクエストのリマインダー</title>
</head>
<body>
  <p>12月にレビューが必要なケースは以下の通りです</p>
  <table>
    <tr>
      <th>ケース名</th><th>カテゴリー</th><th>ステータス</th><th>期日</th>
    </tr>
    <tr>
      <td>ケース1</td><td>開発</td><td>保留中</td><td>12月20日</td>
    </tr>
    <tr>
      <td>ケース2</td><td>DevOps</td><td>保留中</td><td>12月21日</td>
    </tr>
  </table>
</body>
</html>
';

HTMLメールを送るには、Content-type ヘッダーを設定します。

$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

もしくは 

$headers['MIME-Version'] = 'MIME-Version: 1.0';
$headers['Content-type'] = text/html; charset=iso-8859-1';

メッセージを複数の受信者に送信する場合は、$to = パラメータにそれぞれのメールアドレスをカンマ(,)で区切って指定します。

mail()関数を使ってメールを送る際は、メール到達性 に関する問題が生じる可能性があることにご注意ください。❌ 送信されるメッセージはドメインで設定したSPFおよびDKIMの恩恵を受けられないので、受信側の MTA (メール転送エージェント) により迷惑メールとして処理される可能性が高くなります。結果として、PHPのmail() 関数で送信されるメールの到達性はあいにく保証されません。さらに配信が失敗した場合でも、バウンスバックメッセージを受け取れません。

SMTPを使ってメールを送る

次にMailtrapのメール配信SMTPをPHPMailerと組み合わせて使う方法をご紹介します。この方法は他のオプションよりも高い配信到達率を達成でき、設定も非常に簡単です。

まずアカウントを登録し、以下のビデオに従ってメール送信ドメインを認証します。

次にMailtrapアカウントの「SMTP/API Settings」タブでSMTP資格情報を見つけます。

重要: 現時点ではTransactional Streamを選択してください。Bulk Stream(メールの一斉送信)については記事の後半で説明いたします。

プレーンテキストのメールを送信するには、以下のスクリプトに資格情報を挿入します。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // インストール方法に応じて調整

$mail = new PHPMailer(true); // 例外を有効にする

// SMTP構成
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io'; // SMTPサーバー
$mail->SMTPAuth = true;
$mail->Username = 'あなたの_ユーザー名'; // Mailtrapのユーザー名
$mail->Password = 'あなたの_パスワード'; // Mailtrapのパスワード
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

// 送信者と受信者の設定
$mail->setFrom('送信者@サンプル.com', '送信者名');
$mail->addAddress('受信者@サンプル.com', '受信者名');

// プレーンテキストメールの送信
$mail->isHTML(false); // メール形式をプレーンテキストに設定
$mail->Subject = '件名をここに入力';
$mail->Body    = 'これはプレーンテキストメッセージの本文です';

// メールを送信
if(!$mail->send()){
    echo 'メッセージは送信できませんでした。Mailerエラー: ' . $mail->ErrorInfo;
} else {
    echo 'メッセージが送信されました';
}

: プレーンテキストのメールを送信したい場合は、isHTMLメソッドがfalseに設定されていることをご確認ください。

HTMLメールを送信する

PHPでのHTMLメールのカスタマイズの詳細についてはこちらの記事をご覧ください。

基本的なHTMLメッセージをPHPMailerで送信するには、isHTMLプロパティを(true)に設定し、次のように送信します。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php'; // パスを確認

$mail = new PHPMailer(true); // `true`により例外が有効になる

try {
    $mail->isSMTP();
    $mail->Host = 'live.smtp.mailtrap.io';
    $mail->SMTPAuth = true;
    $mail->Username = 'あなたの_ユーザー名'; // Mailtrapのユーザー名
    $mail->Password = 'あなたの_パスワード'; // Mailtrapのパスワード
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    $mail->setFrom('送信者@サンプル.com', '送信者名');
    $mail->addReplyTo('返信先@サンプル.com', '返信先名'); 
    $mail->addAddress('受信者@サンプル.com', '受信者名'); // 受信者の追加

    $mail->isHTML(true); // メール形式をHTMLに設定
    $mail->Subject = "PHPMailer SMTPテスト";
    $mail->Body = '<h1>SMTPを使ってPHPでHTMLメールを送信</h1><p>これはPHPMailerとSMTPメールサーバーを使って送信しているテストメールです。</p>'; // HTML本文の例
    $mail->AltBody = 'これはメール内容のプレーンテキスト版です';

    if(!$mail->send()){
        echo 'メッセージは送信できませんでした。';
        echo 'Mailerエラー: ' . $mail->ErrorInfo;
    } else {
        echo 'メッセージが送信されました';
    }
} catch (Exception $e) {
    echo "メッセージは送信できませんでした。Mailerエラー: {$mail->ErrorInfo}";
}

複数の受信者にメールを送信する

複数の受信者にメールを送るには、それぞれの受信者向けにaddAddress() メソッドを呼び出すだけです。

以下は、HTMLおよびプレーンテキストのメールを複数の受信者に送信するためのコードスニペットです。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // 例外を有効にする
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = '1a2b3c4d5e6f7g'; // Mailtrapのユーザー名
$mail->Password = '1a2b3c4d5e6f7g'; // Mailtrapのパスワード
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->SMTPKeepAlive = true; // 各メール送信後にSMTP接続を維持する

$mail->setFrom('リスト@サンプル.com', 'リストマネージャー');
$mail->Subject = "Mailtrapメールリスト";

$users = [
  ['email' => '田中@サンプル.com', 'name' => '田中'],
  ['email' => '斉藤@サンプル.com', 'name' => '斉藤']
];

foreach ($users as $user) {
  $mail->addAddress($user['email'], $user['name']); // それぞれのユーザーのメールを追加
  $mail->Body = "<h2>こんにちは、{$user['name']}さん!</h2> <p>お元気ですか?</p>";
  $mail->AltBody = "こんにちは、{$user['name']}さん! \nお元気ですか?";

  try {
      if ($mail->send()) {
          echo "メッセージが送信されました:{$user['email']}\n";
      } else {
          echo "Mailerエラー ({$user['email']}): {$mail->ErrorInfo}\n";
      }
  } catch (Exception $e) {
      echo "Mailerエラー ({$user['email']}): {$e->getMessage()}\n";
  }
  $mail->clearAddresses(); // 次のループのためにアドレスをクリア
}

$mail->smtpClose(); // 必要に応じてSMTP接続を閉じる

プロからのヒント

添付ファイル付きのメールを送る

PHPMailerを使って添付ファイルを送るには、2つのやり方があります。

このやり方では、スクリプトと同じディレクトリにファイルを保存します。

ファイルを添付するには、ファイルのパスを指定するだけです。ファイル名も指定できますが、スクリプトはファイルの実際の名前を使うので任意です。

$mail->addAttachment('path/to/納品書1.pdf', '納品書1.pdf');

例えばこのスクリプトを呼び出すと、PHPMailerはpath/to/納品書1.pdfにあるファイルをメールに添付します。2番目のパラメータの納品書1.pdfの入力は任意ですが、入力すると受信者に表示されるファイル名を指定できます。指定しない場合、PHPMailerは元のファイル名を使用します。

他のファイルを追加する場合は、このコマンドを繰り返します。

$mail->addAttachment('path/to/calculation1.xlsx', 'calculation1.xlsx');

このやり方では、ファイルシステムに物理的なファイルとしてデータを保存せずに添付できます。つまり変数に保存されたデータが添付されます。たとえばデータベースからファイル(例:BLOB)を抽出でき、そのまま添付できます。

この場合、addStringAttachment() コマンドを使って、データ内容とファイル名を指定します。

$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'db_data.db'); 

これはMySQLデータベースに保存されたBLOBデータを添付する場合の例です。

リモートURLを使っての添付も可能です。

$mail->addStringAttachment(file_get_contents($url), 'myfile.pdf');

埋め込み画像付きのメールを送る

埋め込み画像付きのメールを送るには、CID添付ファイル を使います。以下をご参照ください。

$mail->addEmbeddedImage('path/to/image_file.jpg', 'image_cid');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';

埋め込み画像を使ったメール全体のコード例は次のとおりです。

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // 例外を有効にする

$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'あなたの_ユーザー名';
$mail->Password = 'あなたの_パスワード';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('送信者@サンプル.com', '送信者名');
$mail->addReplyTo('返信先@サンプル.com', '返信先名');
$mail->addAddress('受信者@サンプル.com', '受信者名'); // 受信者の指定

$mail->isHTML(true);
$mail->Subject = "PHPMailer SMTPテスト";
$mail->addEmbeddedImage('path/to/image_file.jpg', 'image_cid'); // 画像のパスとCIDを指定
$mail->Body = '<img src="cid:image_cid"> メールのHTML本文'; // imgタグのsrc属性にCIDを使用
$mail->AltBody = 'これはメール内容のプレーンテキスト版です';

if(!$mail->send()){
    echo 'メッセージは送信できませんでした。';
    echo 'Mailerエラー: ' . $mail->ErrorInfo;
}else{
    echo 'メッセージが送信されました';
}

非同期のメール送信

PHPMailerは基本的に同期的に動作し、例えばNode.jsのように非同期処理をサポートしていません。でもexec()関数を使うと、メールをバックグラウンドで送信するPHPスクリプトを呼び出せます。

なおこのやり方を実行するには、PHPのCLI(コマンドラインインターフェイス)のインストールが必須です。

ここではsendEmail.phpスクリプトを紹介します。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/vendor/autoload.php'; // 必要に応じてパスを調整してください

$mail = new PHPMailer(true);

// SMTP設定
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // メインおよびバックアップSMTPサーバーを指定
$mail->SMTPAuth = true; // SMTP認証を有効化
$mail->Username = 'ユーザー@サンプル.com'; // SMTPユーザー名
$mail->Password = 'secret'; // SMTPパスワード
$mail->SMTPSecure = 'tls'; // TLS暗号化を有効化、`ssl`も使用可能
$mail->Port = 587; // 接続するTCPポート

// メール設定
$mail->setFrom('送信者@サンプル.com', '送信者名');
$mail->addAddress('受信者@サンプル.com', '受信者名'); // 受信者を追加
$mail->isHTML(true); // メール形式をHTMLに設定
$mail->Subject = 'ここに件名を入力';
$mail->Body    = 'これはHTMLメッセージ本文で、<b>太字です!</b>';
$mail->AltBody = 'これはHTMLをサポートしていないメールクライアント向けのプレーンテキスト版です';

try {
    $mail->send();
    echo 'メッセージが送信されました';
} catch (Exception $e) {
    echo "メッセージは送信できませんでした。Mailerエラー: {$mail->ErrorInfo}";
}

このスクリプトを実行するには、以下のコマンドを使います。

exec("php /Absolute/path/to/sendEmail.php > /dev/null &");

注意事項

一括(バルク)メールの送り方

ここまでの解説ではMailtrapのトランザクショナルストリームを使ってきましたが、これからは一括メール送信用のバルクストリームの資格情報を使います。これにより、多くの受信者宛ての一斉メール送信が可能になります。

まずMailtrapアカウントにログインした後、「SMTP Settings」タブに移動して、右側に表示されるバルクストリームの資格情報を取得します。

次に以下のスクリプトに資格情報を入力し、複数の受信者に一斉にメールを送信します。

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Composerのautoloadファイルへのパス

$mail = new PHPMailer(true);

try {
    // サーバー設定
    $mail->isSMTP();
    $mail->Host       = 'bulk.smtp.mailtrap.io'; // 使用するSMTPサーバー
    $mail->SMTPAuth   = true;                    // SMTP認証を有効化
    $mail->Username   = 'あなたの_smtp_ユーザー名';    // SMTPユーザー名
    $mail->Password   = 'あなたの_smtp_パスワード';    // SMTPパスワード
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS暗号化を有効化
    $mail->Port       = 587;                     // TCPポート

    // 送信元と返信先のアドレス
    $mail->setFrom('送信者@サンプル.com', '送信者名');
    $mail->addReplyTo('返信先@サンプル.com', '返信先名');

    // メールの内容
    $mail->isHTML(true); // メール形式をHTMLに設定
    
    // 受信者リスト
    $recipients = [
        ['email' => '名前1@サンプル.com', 'name' => '名前1'],
        ['email' => '名前2@サンプル.com', 'name' => '名前2'],
        // 必要に応じて他の受信者を追加
    ];

    foreach ($recipients as $recipient) {
        $mail->addAddress($recipient['email'], $recipient['name']); // 各受信者を追加

        // メッセージの内容を個別に設定
        $mail->Subject = 'ここに件名を入力';
        $mail->Body    = 'これはHTMLメッセージ本文で、<b>太字です!</b>';
        $mail->AltBody = 'これはHTMLをサポートしていないメールクライアント向けのプレーンテキスト版です';

        $mail->send();
        $mail->clearAddresses(); // 次の反復のためにアドレスをクリア
    }

    echo 'メッセージが送信されました';
} catch (Exception $e) {
    echo "メッセージは送信できませんでした。Mailerエラー: {$mail->ErrorInfo}";
}

このやり方だと各メールごとにSMTP接続を開閉せずに複数の受信者に送信でき、各メールごとにPHPMailerのインスタンスを作成するよりも効率的です。

ただし大量のメールを処理する場合は、RabbitMQ、Beanstalkd、Redisなどのジョブキューシステムをお勧めします。

例として、Redisで設定する方法をご紹介します。

まず、Composer経由でプロジェクトにRedisのPHPクライアント predis/predis を追加します。プロジェクトのルートディレクトリ(composer.jsonファイルがある場所)で以下のコマンドを実行します。

composer require predis/predis

その後、Redisのリストにメールジョブをプッシュするジョブプロデューサースクリプトを作成します。このスクリプトでは送信するメール情報をJSON形式でエンコードし、プッシュします。

require 'vendor/autoload.php';

use Predis\Client;

$redis = new Client();

while (true) {
    // 'emailQueue'リストからジョブをポップし、空の場合は最大5秒間ブロック
    $job = $redis->brpop(['emailQueue'], 5);

    if ($job) {
        // ジョブ形式: [$listName, $jobData]
        $emailDataJson = $job[1];
        $emailData = json_decode($emailDataJson, true);

        // emailDataを処理
        // PHPMailerでメールを送信し、成功/失敗などを記録

        echo "emailQueueからジョブを処理しました: " . $emailDataJson . "\n";
    } else {
        // タイムアウト期間内にキューにジョブが存在しません
        echo "ジョブを待機中...\n";
    }
}

最後にワーカースクリプトを作成し、PHPMailerがBulk Streamの認証情報で設定されていることを確認します。

<?php
require 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use Predis\Client;

// Redisクライアントを初期化
$redis = new Client();

// エラーログ関数
function logError($message) {
    // エラーをログファイルにアペンド
    file_put_contents('email_errors.log', $message . PHP_EOL, FILE_APPEND);
}

// メール送信関数。成功時にtrueを返し、失敗時にはfalseを返す
function sendEmail($emailData) {
    $mail = new PHPMailer(true);

    try {
        // SMTP設定
        $mail->isSMTP();
        $mail->Host       = 'bulk.smtp.mailtrap.io';
        $mail->SMTPAuth   = true;
        $mail->Username   = 'あなたの_smtp_ユーザー名';
        $mail->Password   = 'あなたの_smtp_パスワード';
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = 587;

        // 受信者
        $mail->setFrom('送信者@サンプル.com', 'Mailer');
        $mail->addAddress($emailData['email']); // 受信者

        // コンテンツ
        $mail->isHTML(true); // メール形式をHTMLに設定
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        return true;
    } catch (Exception $e) {
        // エラーの詳細をログに記録
        logError("{$emailData['email']}へのメール送信に失敗しました。Mailerエラー: " . $mail->ErrorInfo);
        return false;
    }
}

// リトライポリシー
$maxRetries = 3; // メール送信失敗時の最大リトライ回数
$retryDelay = 2; // リトライ間の初期遅延時間(秒単位)

while ($emailDataJson = $redis->rpop('emailQueue')) {
    $emailData = json_decode($emailDataJson, true);
    $attempt = 0;

    while (!sendEmail($emailData) && $attempt < $maxRetries) {
        $attempt++;
        // Exponential backoff
        sleep($retryDelay * pow(2, $attempt - 1));
    }

    if ($attempt == $maxRetries) {
        // 全リトライ後に送信失敗したメールの最終ログ
        logError("Final failure: {$emailData['email']}へのメールは{$maxRetries}回の試行後も送信できませんでした。");
    } else {
        echo "{$emailData['email']}にメールが送信されました\n";
    }
}

プロからのヒント:Redisを使う場合、プロセスマネージャー(例:Supervisor)のご利用をお勧めします。そうすれば、ワーカースクリプトがクラッシュした場合でも自動的に再起動されます。

メール配信API を使ってメールを送る

APIベースのメール送信には、メールサービスプロバイダーの公式PHP SDKの利用が最適です。PHPMailerはAPIベースのメール送信向けに設計されていないので、代わりにMailtrapのメール配信APIを使うと便利です。このAPIはPHPクライアントを提供しており、お使いのアプリにMailtrapを簡単に統合できます。

Mailtrapのメール配信APIでメールを送るには、まずアカウントを作成し、送信ドメインを追加して認証します。

その後、公式のMailtrapのPHP SDKをComposer経由でインストールします。

以下のコマンドのいずれかを使うと、すぐに準備が出来ます。

# symfony httpクライアント(推奨)
composer require railsware/mailtrap-php symfony/http-client nyholm/psr7

# または guzzle httpクライアント
composer require railsware/mailtrap-php guzzlehttp/guzzle php-http/guzzle7-adapter

注記:MailtrapのAPIクライアントはPSR-18のクライアント抽象化を使っており、HTTPメッセージを送信するライブラリに依存していないため、任意のHTTPクライアントを選択できるという柔軟性があります。

次にSDKを使ってプレーンテキストのメールを送るために、以下のコードスニペット使います。

<?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;

require __DIR__ . '/vendor/autoload.php';

// APIトークンをここで取得 https://mailtrap.io/api-tokens
$apiKey = getenv('MAILTRAPの_API_KEYを入力');
$mailtrap = new MailtrapClient(new Config($apiKey));

$email = (new Email())
    ->from(new Address('サンプル@お使いの-ドメインを-ここに入力.com', 'Mailtrap テスト'))
    ->replyTo(new Address('返信@お使いの-ドメインを-ここに入力.com'))
    ->to(new Address('電子メール@サンプル.com', 'ジョン')) // 受信者
    ->priority(Email::PRIORITY_HIGH)
    ->subject('HTMLメール作成のベストプラクティス')
    ->text('こんにちは!HTMLメール作成のベストプラクティスを学び、すぐに使えるテンプレートを試してみましょう。Mailtrapの「HTMLメールの作り方」ガイドがブログで公開されています');

// ヘッダー設定
$email->getHeaders()
    ->addTextHeader('X-Message-Source', 'ドメイン.com')
    ->add(new UnstructuredHeader('X-Mailer', 'Mailtrap PHP Client'));

// カスタム変数
$email->getHeaders()
    ->add(new CustomVariableHeader('user_id', '45982'))
    ->add(new CustomVariableHeader('batch_id', 'PSJ-12'));

// カテゴリ(1つのみ)
$email->getHeaders()
    ->add(new CategoryHeader('統合テスト'));

try {
    $response = $mailtrap->sending()->emails()->send($email); // メール配信API(実際の送信)
    
    var_dump(ResponseHelper::toArray($response)); // ボディ(配列)
} catch (Exception $e) {
    echo '例外が発生しました:',  $e->getMessage(), "\n";
}

注意

HTMLメールを送る

プレーンテキストメール用のスクリプトを少し修正するだけで、HTMLメールを送信できます。具体的には、->html() メソッドを追加します。

以下のコード例では、複数の受信者にHTMLメールを送信し、ファイルを添付する方法をご紹介します。

<?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;
use Symfony\Component\Mime\Part\DataPart;

require __DIR__ . '/vendor/autoload.php';

// APIトークンをここで取得 https://mailtrap.io/api-tokens


$apiKey = “MAILTRAP_API_KEY”;
$mailtrap = new MailtrapClient(new Config($apiKey));

$email = (new Email())
    ->from(new Address('サンプル@お使いの-ドメインを-ここに入力.com', 'Mailtrap テスト'))
    ->replyTo(new Address('返信@yお使いの-ドメインを-ここに入力.com'))
    ->to(new Address('電子メール@サンプル.com', 'ジョン'))
    ->priority(Email::PRIORITY_HIGH)
    ->cc('mailtrapのqa担当者@サンプル.com')
    ->addCc('ステージング@サンプル.com')
    ->bcc('mailtrapの開発者@サンプル.com')
    ->subject('HTMLメール作成のベストプラクティス')
    ->text('こんにちは!HTMLメール作成のベストプラクティスを学び、すぐに使えるテンプレートを試してみましょう。Mailtrapの「HTMLメールの作り方」ガイドがブログで公開されています')
    ->html(
        '<html>
        <body>
        <p>こんにちは!<br>
        HTMLメールの作成方法のベストプラクティスを学び、すぐに使えるテンプレートを試してみましょう。</p>
        <p><a href="https://mailtrap.io/ja/blog/build-html-email/">MailtrapのHTMLメール作成ガイド</a>がブログで公開されています</p>
        <img src="cid:logo">
        </body>
    </html>'
    )
    ->embed(fopen('https://mailtrap.io/wp-content/uploads/2021/04/mailtrap-new-logo.svg', 'r'), 'logo', 'image/svg+xml');

// 添付ファイルを追加
$email->attachFromPath('/あなたの/ファイル/の/パス.pdf', 'ファイル名.pdf', 'application/pdf');

// ヘッダー設定
$email->getHeaders()
    ->addTextHeader('X-Message-Source', 'ドメイン.com')
    ->add(new UnstructuredHeader('X-Mailer', 'Mailtrap PHP Client'));

// カスタム変数
$email->getHeaders()
    ->add(new CustomVariableHeader('user_id', '45982'))
    ->add(new CustomVariableHeader('batch_id', 'PSJ-12'));

// カテゴリ(1つのみ)
$email->getHeaders()
    ->add(new CategoryHeader('統合テスト'));

try {
    $response = $mailtrap->sending()->emails()->send($email); // メール配信API(実際の送信)
    
    var_dump(ResponseHelper::toArray($response)); // ボディ(配列)
} catch (Exception $e) {
    echo '例外が発生しました: ',  $e->getMessage(), "\n";
}

複数の受信者にメールを送る

複数の受信者にメールを送るには、コードの toccbcc フィールドにアドレスを追加するだけです。コードで使われている Symfony の Email クラスでは、それぞれのフィールドに複数の受信者を追加できます。

以下は、使えるコードの一例です。

<?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;

require __DIR__ . '/vendor/autoload.php';

// APIトークンをここで取得 https://mailtrap.io/api-tokens
$apiKey = getenv('MAILTRAPの_API_KEYを入力');
$mailtrap = new MailtrapClient(new Config($apiKey));

$email = (new Email())
    ->from(new Address('サンプル@お使いの-ドメインを-ここに入力.com', 'Mailtrap テスト'))
    ->replyTo(new Address('返信@お使いの-ドメインを-ここに入力.com'))
    ->to(new Address('電子メール@サンプル.com', 'ジョン'))
    ->priority(Email::PRIORITY_HIGH)
    ->cc('mailtrapのqa担当者@サンプル.com')
    ->addCc('ステージング@サンプル.com')
    ->bcc('mailtrapの開発者@サンプル.com')
    ->subject('HTMLメール構築のベストプラクティス')
    ->text('こんにちは!HTMLメール構築のベストプラクティスを学び、すぐに使えるテンプレートを試しましょう。Mailtrapの「HTMLメール構築ガイド」がブログで公開されています');

// ヘッダー設定
$email->getHeaders()
    ->addTextHeader('X-Message-Source', 'ドメイン.com')
    ->add(new UnstructuredHeader('X-Mailer', 'Mailtrap PHP クライアント')); // addTextHeaderと同様

// カスタム変数
$email->getHeaders()
    ->add(new CustomVariableHeader('user_id', '45982'))
    ->add(new CustomVariableHeader('batch_id', 'PSJ-12'));

// カテゴリ(1つのみ)
$email->getHeaders()
    ->add(new CategoryHeader('統合テスト'));

try {
    $response = $mailtrap->sending()->emails()->send($email); // メール配信API(実際の送信)
    
    var_dump(ResponseHelper::toArray($response)); // ボディ(配列)
} catch (Exception $e) {
    echo '例外が発生しました: ',  $e->getMessage(), "\n";
}

添付ファイル付きメールの送信

添付ファイル付きのメールを送る場合、Symfony の Mime Emailクラスの attachFromPath() メソッドを使います。このメソッドではファイルのパスを指定して、ファイルを添付します。

次のコードは、ファイルを添付したメールを送る場合の例です。

<?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;

require __DIR__ . '/vendor/autoload.php';

// APIトークンをここで取得 https://mailtrap.io/api-tokens


$apiKey = getenv('MAILTRAPの_API_KEYを入力');
$mailtrap = new MailtrapClient(new Config($apiKey));

// メールオブジェクトの初期化
$email = (new Email())
    ->from(new Address('サンプル@お使いの-ドメインを-ここに入力.com', 'Mailtrap テスト'))
    ->replyTo(new Address('返信@お使いの-ドメインを-ここに入力.com'))
    ->to(new Address('電子メール@サンプル.com', 'ジョン')) // 複数の受信者の場合、他のアドレスを繰り返し追加
    ->priority(Email::PRIORITY_HIGH)
    ->subject('HTMLメール構築のベストプラクティス')
    ->text('こんにちは!HTMLメール作成のベストプラクティスを学び、すぐに使えるテンプレートを試してみましょう。Mailtrapの「HTMLメール作成ガイド」がブログで公開されています');

// 添付ファイルを追加
$email->attachFromPath('/あなたの/ファイル/の/パス.pdf', 'ファイル名.pdf', 'application/pdf');

// 先に定義されたヘッダーとカスタム変数
$email->getHeaders()
    ->addTextHeader('X-Message-Source', 'ドメイン.com')
    ->add(new UnstructuredHeader('X-Mailer', 'Mailtrap PHP クライアント'))
    ->add(new CustomVariableHeader('user_id', '45982'))
    ->add(new CustomVariableHeader('batch_id', 'PSJ-12'))
    ->add(new CategoryHeader('統合テスト'));

try {
    $response = $mailtrap->sending()->emails()->send($email); // Mailtrapでメールを送信
    var_dump(ResponseHelper::toArray($response)); // レスポンスを表示
} catch (Exception $e) {
    echo '例外が発生しました:',  $e->getMessage(), "\n";
}

埋め込み画像付きメールの送信

埋め込み画像付きのメールの送信は、Email オブジェクトの一部として ->embed() メソッドを使えるので簡単です。HTMLのメール本文内に画像を直接含められ、Content-ID(CID)を介して参照できます。

<?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;

require __DIR__ . '/vendor/autoload.php';

// APIトークンをここで取得 https://mailtrap.io/api-tokens
$apiKey = getenv('MAILTRAPの_API_KEYを入力');
$mailtrap = new MailtrapClient(new Config($apiKey));

// 必要な詳細情報を含むメールオブジェクトの初期化
$email = (new Email())
    ->from(new Address('サンプル@あなたの-ドメインを-ここに入力.com', 'Mailtrap テスト'))
    ->replyTo(new Address('返信@あなたの-ドメインを-ここに入力.com'))
    ->to(new Address('電子メール@サンプル.com', '受信者名'))
    ->subject('埋め込み画像付きHTMLメール')
    ->html('<html><body>以下は埋め込み画像です: <img src="cid:unique-image-id"></body></html>');

// 画像を埋め込み、CIDを割り当てる
$imagePath = '/画像/の/パス.jpg'; // 画像ファイルの正しいパスを使用
$email->embedFromPath($imagePath, 'unique-image-id');

// (オプション)CC、BCC、テキスト形式など追加の設定も可能

try {
    $response = $mailtrap->sending()->emails()->send($email); // Mailtrapでメールを送信
    var_dump(ResponseHelper::toArray($response)); // レスポンスを表示
} catch (Exception $e) {
    echo '例外が発生しました:',  $e->getMessage(), "\n";
}

ヒント/画像/の/パス.jpg を実際の画像ファイルのパスに置き換えることを忘れないでください。

非同期メール送信

HTTPリクエストを非同期で送信するには、PHPの curl_multi 関数を使います。

curl_multi_init() 関数は複数のHTTPリクエストを同時に実行できるcURL拡張機能の一部です。ただしこの拡張機能が有効化されていない、またはインストールされていない場合は、どのcURL関数も利用できません。

この問題を解決するには、PHPインストールでcURL拡張を有効にします。なお様々なオペレーティングシステムを使っての有効化手順は以下の通りです。

sudo apt-get update
sudo apt-get install php-curl

インストール後に手動で拡張を有効化する必要がある場合もありますが、通常は自動的に有効化されます。必要に応じてphp.ini ファイルを見つけて編集します。(ファイルの場所はPHPのバージョンやセットアップによって異なりますが、PHP 7.4 CLIの場合、一般的には /etc/php/7.4/cli/php.ini などのパスにあることが多いです。)その後、extension=curl という行がコメントアウトされていない旨を確認して、行の先頭にセミコロンがあれば削除します。

次にApacheサーバーを再起動します。

sudo service apache2 restart

以下はそのコード例です。

<?php

// cURLマルチハンドルの初期化
$multiCurl = curl_multi_init();

// 各cURLハンドルを追跡する配列
$curlHandles = [];

// 例:複数のメールデータ(デモ用に同じメールを複数の受信者に送信)
$emailDatas = [
    [
        'from' => '送信者@サンプル.com',
        'to' => '受信者1@サンプル.com',
        'subject' => 'ここに件名を入力',
        'text' => 'これはプレーンテキストのメッセージ本文です',
        'html' => '<p>これはHTML形式のメッセージ本文です</p>',
    ],
    [
        'from' => '送信者@サンプル.com',
        'to' => '受信者2@サンプル.com',
        'subject' => 'ここに件名を入力',
        'text' => 'これはプレーンテキストのメッセージ本文です',
        'html' => '<p>これはHTML形式のメッセージ本文です</p>',
    ]
    // 必要に応じてさらに追加
];

foreach ($emailDatas as $emailData) {
    // 各メールのcURLハンドルを準備
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.mailtrap.io/v1/messages'); // 正しいAPIエンドポイントを使用
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($emailData));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer あなたの_mailtrap_api_tokenをここに入力', // 実際のMailtrap APIトークンを使用
    ]);

    // cURLハンドルをマルチハンドルに追加
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch; // ハンドルを追跡
}

// cURLマルチハンドルの実行
$active = null;
do {
    $mrc = curl_multi_exec($multiCurl, $active);
    if ($mrc != CURLM_OK) {
        // cURLマルチエラーの処理
        break;
    }
    // 任意のcurl_multi接続のアクティビティを待機
    if (curl_multi_select($multiCurl) == -1) {
        usleep(100);
    }
} while ($active);

// レスポンスを読み取り処理
foreach ($curlHandles as $handle) {
    $response = curl_multi_getcontent($handle);
    // ここでレスポンスを処理。HTTPステータスコード、レスポンスボディなどを確認
    echo $response . PHP_EOL;

    // ハンドルを削除して閉じる
    curl_multi_remove_handle($multiCurl, $handle);
    curl_close($handle);
}

// cURLマルチハンドルを閉じる
curl_multi_close($multiCurl);

一括(バルク)メール送信のやり方

大量のメールをMailtrapのメール配信APIを使ってPHP経由で送る場合、ジョブキューシステムを使うと最も効率的です。

まずMailtrapのメール一斉送信(Bulk Stream)を設定します。Mailtrapアカウントで「SMTP/API Settings」タブに移動し、「Bulk Stream」ウィンドウでAPIを選択します。ホスト名とAPIトークンが表示されるので、それらをコピーし、以下のPHPスクリプトに貼り付けます。

このようにメール一斉送信の資格情報を設定すると、RabbitMQやBeanstalkdなど、ほとんどのジョブキューシステムを使えるようになります。ここではRedisの設定方法をご紹介します。

Redisをまだインストールしていない場合は、プロジェクトに追加します。

composer require predis/predis

次に以下のPHPコードスニペットを使い、すべての必要な情報を含むジョブをRedisにキューに追加します。

require 'vendor/autoload.php';

$predis = new Predis\Client();

$emailData = [
    'from' => '送信者@サンプル.com',
    'to' => '受信者@サンプル.com',
    'subject' => '件名をここに入力',
    'html' => '<p>ここにHTMLコンテンツを入力</p>',
    'text' => 'ここにプレーンテキストを入力',
    // メールに必要な他のデータも含める
];

// メールデータを後で処理するためにキューに追加
$predis->lpush('emailQueue', json_encode($emailData));

最後に、このPHPスクリプトを使ってRedisキューの新しいメールタスクを監視し、キューから削除してMailtrapのメール配信API経由で送信します。

require 'vendor/autoload.php';

$predis = new Predis\Client();
$mailtrapConfig = new Mailtrap\Config('あなたの_mailtrap_api_keyをここに入力');
$mailtrapClient = new Mailtrap\MailtrapClient($mailtrapConfig);

while (true) {
    // メールタスクが利用可能になるまでブロック
    $emailTask = $predis->brpop('emailQueue', 0);
    
    if ($emailTask) {
        $emailData = json_decode($emailTask[1], true);
        
        // Mailtrapのメール配信APIを使ってメールを送信
        $email = (new Symfony\Component\Mime\Email())
            ->from(new Address($emailData['from']))
            ->to(new Address($emailData['to']))
            ->subject($emailData['subject'])
            ->html($emailData['html'])
            ->text($emailData['text']);
        
        try {
            $response = $mailtrapClient->sending()->emails()->send($email);
            echo "メールが送信されました: ", var_dump($response), "\n";
        } catch (Exception $e) {
            echo "メールの送信に失敗しました:", $e->getMessage(), "\n";
        }
    }
}

このワーカーをバックグラウンドプロセスとして、またはSupervisorなどのプロセスマネージャーでタスクとして実行するのをお勧めします。

送信前のメールテスト

これまでPHPを使った様々なメールの送り方について説明いたしましたが、メール送信機能が期待通りに動作しているかどうかを確認する必要があります。コードがすべて完成したら、送信方法に関係なく、メールを送る前に必ずPHPでメールテストを行うことが重要です。

メールのテストは業界標準とみなされていて、メール送信サイクルにおける不可欠な作業です。幸いにもMailtrapの包括的なメール送信テストソリューションを利用すれば、メールのテスト、プレビュー、トラブルシューティングを送信前に実施できます。

具体的にはMailtrapのメール送信テストを使うと、HTML/CSSを検査してコードの誤りを特定・修正できます。

この機能はテンプレートベースのHTML/CSSデザインの互換性を確認・修正するために非常に重要です。また、ライブメールを送信することなくデザインを最適化できます。

チームメンバーとテストプロセスを簡単に共有し、新しいプロジェクトを作成したり、複数のオブジェクトを追加したりもできます。

何よりもMailtrapのメール送信テストの設定は簡単で、SMTP資格情報や公式のPHP SDK経由で楽々統合できます。

SMTP

SMTPサーバーを使ってメールをテストするには、トランスポートメソッドに以下通りMailtrapのSMTP資格情報を指定するだけです。

Host: sandbox.smtp.mailtrap.io
Port: 25 or 465 or 587 or 2525
Username: 各Mailtrap受信トレイごとに固有
Password: 各Mailtrap受信トレイごとに固有
TLS: オプション(すべてのポートでSTARTTLSが利用可能)

Mailtrapを使うと、PHPライブラリやフレームワークとの統合も可能です。例えばPHPMailerとの統合の例は以下の通りです。

$phpmailer = new PHPMailer();
$phpmailer->isSMTP();
$phpmailer->Host = 'sandbox.smtp.mailtrap.io';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587;
$phpmailer->Username = '1a2b3c4d5e6f7g';
$phpmailer->Password = '1a2b3c4d5e6f7g';

Symfonyフレームワークとの統合の場合、MAILER_DSN は以下の通りです。

MAILER_DSN=smtp://username:password@sandbox.smtp.mailtrap.io:587/?encryption=tls

テストメールを送信すると、数秒後にMailtrapの仮想受信ボックスで次のメッセージを確認できます。

API

Mailtrapのメール送信テストAPIをPHPベースのアプリに統合する場合は、以下のコードを使います。

?php

use Mailtrap\Config;
use Mailtrap\EmailHeader\CategoryHeader;
use Mailtrap\EmailHeader\CustomVariableHeader;
use Mailtrap\Helper\ResponseHelper;
use Mailtrap\MailtrapClient;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Header\UnstructuredHeader;

require __DIR__ . '/../vendor/autoload.php';


/**********************************************************************************************************************
 ******************************************* メール送信テスト ************************************************************
 **********************************************************************************************************************
 */

/**
 * メール送信テストAPI
 *
 * POST https://sandbox.api.mailtrap.io/api/send/{inbox_id}
 */
try {
    // APIトークンをここで取得 https://mailtrap.io/api-tokens
    $apiKey = getenv('MAILTRAPの_API_KEYをここに入力');
    $mailtrap = new MailtrapClient(new Config($apiKey));

    $email = (new Email())
        ->from(new Address('mailtrap@サンプル.com', 'Mailtrap テスト'))
        ->replyTo(new Address('返信@サンプル.com'))
        ->to(new Address('電子メール@サンプル.com', 'ジョン'))
        ->cc('mailtrapのqa担当者@サンプル.com')
        ->addCc('ステージング@サンプル.com')
        ->bcc('mailtrapの開発者@サンプル.com')
        ->subject('HTMLメールの作成に関するベストプラクティス')
        ->text('こんにちは!HTMLメールの作成に関するベストプラクティスを学び、すぐに使えるテンプレートを試してみてください。Mailtrapのガイドがブログで公開されています。')
        ->html(
            '<html>
            <body>
            <p><br>こんにちは</br>
            HTMLメールの作成に関するベストプラクティスを学び、すぐに使えるテンプレートを試してみてください。</p>
            <p><a href="https://mailtrap.io/ja/blog/build-html-email/">Mailtrapのガイド</a>がブログで公開されています。</p>
            <img src="cid:logo">
            </body>
        </html>'
        )
        ->embed(fopen('https://mailtrap.io/wp-content/uploads/2021/04/mailtrap-new-logo.svg', 'r'), 'logo', 'image/svg+xml')
        ->attachFromPath('README.md')
    ;

    // ヘッダー
    $email->getHeaders()
        ->addTextHeader('X-Message-Source', '1alf.com')
        ->add(new UnstructuredHeader('X-Mailer', 'Mailtrap PHP クライアント'));

    // カスタム変数
    $email->getHeaders()
        ->add(new CustomVariableHeader('user_id', '45982'))
        ->add(new CustomVariableHeader('batch_id', 'PSJ-12'));

    // カテゴリ (1つだけ)
    $email->getHeaders()
        ->add(new CategoryHeader('統合テスト'));

    // inbox_id が必要なパラメータ
    $response = $mailtrap->sandbox()->emails()->send($email, 1000001); // <--- 実際のinbox_idを使ってください(そうしないと401エラーが発生します)

    // レスポンスから取得可能な情報をすべて出力
    var_dump($response->getHeaders()); // ヘッダー (配列)
    var_dump($response->getStatusCode()); // ステータスコード (int)
    var_dump(ResponseHelper::toArray($response)); // 本文 (配列)
} catch (Exception $e) {
    echo '例外が発生しました:',  $e->getMessage(), "\n";
}

もちろんAPIトークンやその他の資格情報などのプレースホルダ値を、Mailtrapアカウントにより提供された実際のデータに置き換えるのをどうぞお忘れなく。

MailtrapのAPI連携メール送信テストの詳細、備わっている様々な機能(例:テストやQA自動化、自動シーケンスのテストなど)については、公式ドキュメントをご参照ください。

まとめ

以上で、PHPでのメール送信についてのチュートリアルは終了です!

この記事ではPHP経由の代表的なメール送信のやり方をご紹介し、Mailtrapなどのサードパーティメールサービスを使って効率的にメールを送り、時間とコストを節約しつつ手間を軽減する方法を解説いたしました。

さらに学びたい方は、Mailtrapのブログで他のPHP関連の記事もご覧ください。

モバイルバージョンを終了