WordPressでも使ってる!新しくなったPHPMailerを使ってみよう
プログラムを作っている中でメールを送信する機能がありますが、手で書くと結構煩雑になりませんか?
サーバーやポートの設定、ログイン認証、添付ファイルの追加・・・・。
そんな考えるのも面倒なメール送信を一気に楽にしてくれるライブラリ PHPMailer をご紹介します。
なお PHPMailer はバージョン5が非推奨になっており、代わりにバージョン6を推奨しています。
この記事では記載時点で最新の v6.0.7 でご紹介します。
◆PHPMailer に関するリンク
目次
環境
実行環境はこんな感じです。
CentOS 7
PHP Version 7.1.11
Composer
※Composerのインストールおよび使い方の説明は割愛します
※Linuxの使い方の説明は割愛します
実装方法
インストール
まずは composer で PHPMailer をインストールします
1 2 3 |
$ composer require phpmailer/phpmailer |
続いて PHPMailer を使用できるようにします
1 2 3 4 5 6 7 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; |
これで PHPMailer を使用する準備ができました。
基本的なメールの送信をする
シンプルですが、基本的なメールの送信をするには下記のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.sample.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'smtp_user@sample.com'; $mailer->Password = 'smtp_password'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
とても一般的な内容ばかりですね。
送信元と送信先のアドレスの第二引数は名前になりますが、省略することも可能です。
送信先を増やす
1通のメールで送信先を増やす場合、下記のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.sample.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'smtp_user@sample.com'; $mailer->Password = 'smtp_password'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // 追加の送信先アドレスを設定 $mailer->addAddress('next_example@sample.com'); $mailer->addCC('cc@sample.com'); $mailer->addBCC('bcc@sample.com'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
単に送信先を追加するだけではなく CC や BCC も同じように追加できるのもいいですね。
こちらも第二引数に名前を設定することが可能です。
添付ファイルを追加する
メールに添付ファイルを追加する場合は下記のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.sample.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'smtp_user@sample.com'; $mailer->Password = 'smtp_password'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // 添付ファイルを付ける $mailer->addAttachment('/var/tmp/file_list.zip', 'fileSet.zip'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
添付ファイルまでの 相対パス・絶対パス を指定することで、自動的に添付することができます。
もちろん、複数個つけることも可能で、その場合は複数回 addAttachment を呼び出します。
余談ですが、第二引数は表示する名称で、省略が可能です。
エラーメッセージを日本語にする
基本的にエラーなどは全て英語となりますが、日本語として出力してほしい時もあると思います。
そんな時は下記の命令を1つ追加してあげましょう。
1 2 3 |
$mailer->setLanguage('ja'); |
ただし 「SMTP connect() failed」 「SMTP server error」 など、一部翻訳されていないものがありますので、過度な期待は厳禁です。
GmailのSMTPからメールを送る
SMTPサーバをGmailにすることもあると思います。
その場合は下記のように設定してあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.gmail.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'Gmailのアカウント'; $mailer->Password = 'Gmailのパスワード'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
プログラムはこれで完了ですが、まだGmail側で 安全性の低いアプリの許可を有効にする と セキュリティから端末のアクティビティーを許可する の2つの設定を行う必要があります。
それぞれの設定は下記の公式サイトをご確認ください。
日本語を含むメールを送る
昔からメール送信で問題になる日本語ですが、下記のようにすればタイトルや本文、送信者から添付のファイル名まで日本語が使えるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // メールの文字に関する設定 $mailer->CharSet = 'UTF-8'; $mailer->Encoding = 'base64'; // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.sample.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'smtp_user@sample.com'; $mailer->Password = 'smtp_password'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
古いメールクライアントで文字化けしてしまう場合、CharSet を ISO-2022-JP にすることで解決する場合もあります。
HeaderのX-Mailerを変更したい
デフォルトではX-Mailrが PHPMailer になっています。
PHPMailerだけなら良いのですが、バージョンも記載されているため、セキュリティホールが見つかった場合は格好の餌になってしまう恐れもあります。
そんなX-Mailerを変更するには下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
require 'vendor/autoload.php'; // PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // インスタンス化(trueを設定することでExceptionをONにする) $mailer = new PHPMailer(true); try { // X-Mailerを変更 $mailer->XMailer = 'NewMailerSystem'; // サーバー設定 // SMTPを明示的にON $mailer->isSMTP(); // SMTPサーバーを設定 $mailer->Host = 'smtp.sample.com'; // SMTP認証をON $mailer->SMTPAuth = true; $mailer->Username = 'smtp_user@sample.com'; $mailer->Password = 'smtp_password'; // tls または ssl $mailer->SMTPSecure = 'tls'; $mailer->Port = 587; // メール送信設定 // 送信元アドレス $mailer->setFrom('example@sample.com', 'Sender'); // 送信先アドレス $mailer->addAddress('jone@sample.net', 'Joe User'); // メール内容設定 // HTMLメールをON $mailer->isHTML(true); // メールタイトルを設定 $mailer->Subject = 'Sample Mail'; // メール本文を設定 $mailer->Body = 'This is <b>Sample Mail!</b>'; // メール送信 $mailer->send(); echo 'メール送信しました'; } catch(Exception $e) { echo 'メール送信に失敗しました [Error: '.$mailer->ErrorInfo.']'; } |
なお、X-Mailerを完全に消したい場合は 半角スペース を設定してあげることで消すことができます。
Composerが使えない・使わない場合
もし環境によりComposerが使えない場合やWindowsで使用する場合など、別の方法でインストールしたい時はこちらの記事をご参照ください。
PhpSpreadsheetを例に挙げた、Composerを使わずに使用する方法を記載しています。
さいごに
mail や mb_send_mail などでももちろんメールは送れますが、添付ファイルや文字コードなどを意識すると手間ですよね?
この PHPMailer は歴史も長く、人気もあるためか活発に更新されています。
業務系システムに入れる場合でも、セキュリティ的な問題が比較的早く解決されるため非常に便利です。
メール送信機能を追加する場合は一度使ってみてはどうでしょうか?
- おすすめ記事
POPULAR
のえる
Full-stack Developer