PHPでメールを扱うときに便利なライブラリを紹介
この記事は2023/06/01に作成されました。
PHPを使用してメールの扱いに悩む場面は多いと思います。今回はそんなときに参考になりそうな、送信と解析に便利な二つのライブラリを紹介させていただきます。
PHPMailer
https://github.com/PHPMailer/PHPMailer
PHPから電子メールを送信するための便利なライブラリです。SMTP送信を行う際に使いやすかったため今回ご紹介いたします。
基本的な使い方
composerを利用の場合は以下から
composer require phpmailer/phpmailer
読み込みかたはそれぞれの環境によりますが、公式に従うと
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';
//Load Composer's autoloader
require 'vendor/autoload.php';
//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);
のように読み込んでください。使用するためのシンプルな設定例を紹介します。
まずはサーバー設定
//サーバーの設定
$mail->isSMTP();//ここでSMTPの送信を宣言する
$mail->SMTPAuth = true;//SMTP認証の有無
$mail->Host = 'smtp.example.com';//SMTPホスト
$mail->Username = 'user@example.com';//SMTP user
$mail->Password = 'secret';//SMTP password
$mail->Sender = 'sender@example.net'; // Return-path
$mail->SMTPSecure = 'ssl';//ssl or tls の選択を行う。好ましくないが使用しない場合はfalse
公式ではPHPMailer::ENCRYPTION_SMTPSとPHPMailer::ENCRYPTION_STARTTLSが用意されているが、それぞれssl,tlsを指定するのと同義。
$mail->Port = 465;//ポートの指定。
基本的なSMTPを行うためのサーバー設定は完了。Host,Username,Passwordあたりは送信のたびに変更がありそうなため、変数として定義しておくと良いかと思います。次に送信情報に関しての設定。
//送信設定
$mail->setFrom('from@example.com', 'Mailer');//from
$mail->addReplyTo('info@example.com', 'Information');//reply
$mail->addAddress('joe@example.net', 'Joe User');//送信先
$mail->addAddress('ellen@example.com');//送信先の追加も行える。名前は省略しても大丈夫。
$mail->addCustomHeader('X-custom-data', 1);//カスタムヘッダーを追加
//送信内容設定
$mail->isHTML(false);//HTMLメールを使用するか
$mail->Subject = 'Here is the subject';//件名
$mail->Body = 'This is body';//本文
$mail->send();//送信
ここまででシンプルなSMTP送信が可能になりました。ほとんど公式の設定と同じですが、return-pathを設定できたり、カスタムヘッダーの追加を行っています。公式のドキュメントにはないですが、ライブラリの中身を読むと使える設定は多いので追加してみてください。
デバッグするときに便利なメソッド
前節の設定には書いていませんでしたが、送信フローを細かく出力してくれるメソッドが用意されています。ログメッセージを出力するために異なるレベルを設定します。
1.Emergency(緊急)
2.Alert(警告)
3.Critical(重大)
4.Error(エラー)
5.Warning(警告)
6.Notice(通知)
7.Info(情報)
8.Debug(デバッグ)
がそれぞれ出力されますが、最低でも4,5あたりを設定すると良いでしょう。
$mail->SMTPDebug = 4;(出力レベルの設定)
送信後のタイミングなどで
$mail->Debugoutput = function ($str, $level) {
echo "debug level $level; message: $str
";
};
$levelにはエラーレベルの数値、$strにはログメッセージが入ってきます。デバッグや処理の確認などに使用してください。
php-mime-mail-parser
https://github.com/php-mime-mail-parser/php-mime-mail-parser
電子メールをパースするライブラリです。PHPのバージョンごとに細かくバージョンが存在しているので、自分の環境を確認して選定してください。
基本的な使い方
composerを利用の場合は以下から
composer require php-mime-mail-parser/php-mime-mail-parser
インストールに失敗する可能性があります。その場合は、PHPのPECLエクステンションmailparseがインストールされていないことが原因かもしれません。このライブラリはmailparseを使用しているようなのでご確認ください。
https://pecl.php.net/package/mailparse
公式からですが電子メールの読み込み方が4つあります。
// 1.ファイルパスを設定
$parser->setPath($path);
// 2. メールのテキストを指定
$parser->setText(file_get_contents($path));
// 3.ファイルのリソースを指定
$parser->setStream(fopen($path, "r"));
// 4.メールサーバーからの入力を指定
$parser->setStream(fopen("php://stdin", "r"));
今回は、バウンスメールを受け取ってメソッドを叩くため、メールサーバーから直接メールデータを渡してもらって受け取る方法(上記ソースコード内にある、4.メールサーバーからの入力を指定)を利用しています。
$parser = new Parser();
$parser->setStream(fopen('php://stdin', 'r'));
$to = $parser->getHeader('to');
$from = $parser->getHeader('from');
$subject = $parser->getHeader('subject');
$body = $parser->getMessageBody('text');
このようにメッセージのデータを簡単に取得することができます。
また以下のようなカスタムヘッダーも取得可能です。
$customData = $parser->getHeader('X-custom-data');
まとめ
ライブラリを使用して複雑な処理を簡略化できるのは良い点だなと感じます。
しかし、それによって自分で把握できないエラーや処理が起きてしまう恐れもあります。
ライブラリを使用するときは注意して作成していきましょう。
以上です、ありがとうございました。
プログラマー/K.D