Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説
2017/06/04
PHPから Phpmailerを使ってメールを送信
PHPでメールを送信する関数と言えば、mail関数や、mb_send_mail関数がありますが、この関数を使うと Yahooや Gmail宛のメールがスパム判定されてしまう...
そんな困った状況でもメールを送信できてしまう PHPのライブラリを紹介します。
関数化してますので、コピペで OK!
そもそも借りているサーバにメールサーバが用意されていなくて、メールが送信できない...
そんな場合でも対応できます。
ちなみに、パソコンに XAMPPを入れてローカル環境を作っている場合でも OKです。
ただ、そもそも XAMPP環境でメールを送信できるようにしたいという場合は、後述の「Phpmailerでローカル環境からもメール送信」を参照してください。
mb_send_mailで送信するとスパムと判定
そもそも、なぜ mail関数や、mb_send_mail関数ではスパム判定されてしまうのでしょうか?
他のサイトでは「ヘッダー要素が不足しているので引数で指定する要素を追加して見ましょう」といった感じで PHPの記述の内容を変えることで対応できるようなことが書かれています。
ですが、mail関数や、mb_send_mail関数は、メールを送信するプログラムである sendmailを通してメールを送信するのですが、この sendmailのメールサーバとしての設定が正しくない場合は、スパムとして判定されてしまうのです。
そのため、いくら PHPの記述方法を変更してもスパムとして判定される根本解決にはならないのです。
スパム判定されないための解決策
メールの送信の処理をイメージにまとめたものが上記のものになります。
1.は、mail関数や、mb_send_mail関数を使って送信する場合です。
PHPで、メールのヘッダ、送信先、タイトル、本文などを編集し、mb_send_mail関数を使って、sendmailにメールを送信してもらいます。
これが前項で説明した内容です。
2.は、この記事で解説をするライブラリ「Phpmailer」を使って送信する場合です。
PHPで、メールのヘッダや本文などを編集するところまでは同じですが、同じサーバ内の sendmailに渡すのではなく、外部の SMTPサーバに接続し、そこからメールを送信してもらう方法です。
外部のメールサーバは、Gmailのサーバだったり、自分で契約しているプロバイダやレンタルサーバの SMTPサーバを利用します。
こうすることにより、送ったメールはスパムとして判定されなくなります。
この外部の SMTPサーバを経由してメールを送信するためのライブラリが「Phpmailer」なのです。
このライブラリは、XOOPSという CMSや Symfonyという PHPフレームワークなどでも採用されているライブラリですので、信頼できるものです。
ちなみに、この方法は、パソコンから Outlookなどのメールソフトを使ってメールを送っていることと同じことをやっているわけですので、これでスパム判定された場合は、Outlookを使って送信してもスパム判定される SMTPサーバだということになります。
Phpmailerを使って Gmailの SMTPからメール送信
Phpmailerを設置
まずは、Phpmailerを設置します。
http://phpmailer.worxware.com/
オフィシャルサイトは上記ですが、ソースは Githubからダウンロードします。
下記がその Githubの画面です。
https://github.com/Synchro/PHPMailer
Githubを使ったことがない方は分かりにくいですが、右ナビの下に「Download ZIP」というボタンがありますので、それをクリックします。
Githubはプログラムなどのファイルを保存管理(履歴管理)しておくための仕組みです。
ダウンロードしたファイルを解凍して、フォームを作成しているフォルダなどに入れます。
フォルダ名も適当に変更しても問題ありません。
この記事では「PHPMailer」というフォルダ名に変更して、PHPのプログラムが置いてあるフォルダと同じ階層に置いた想定で記述しています。
また、下記のフォルダとその中身のファイルは要らないので消しても OKです。
他にもいらないものはありそうですが...
docs
examples
test
※2015.07.06 追記
ここで紹介しているフォームからメールを送信するだけであれば、下記の 3ファイルだけあれば動くようです。
class.phpmailer.php
class.smtp.php
PHPMailerAutoload.php
Phpmailerを利用する PHPのソース
Phpmailerの読み込みと SMTP設定
Phpmailerを読み込む設定と、メールを送信する SMTPサーバの情報を指定します。
プログラムの設定ファイルか、プログラムファイルの先頭に記述しておけばいいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Phpmailerの読み込み require_once ( './PHPMailer/PHPMailerAutoload.php' ); // 外部SMTPサーバーのホスト名 $smtp_host = "ssl://smtp.gmail.com"; // 外部SMTPのポート番号 $smtp_port = "587"; // 外部SMTPに接続するユーザー名 $smtp_user = "hogehoge@hogehoge.com"; // 外部SMTPに接続するパスワード $smtp_password = "*********"; |
メールの送信の関数と関数を呼び出す設定
下記が実際にメールを送信する処理です。
phpmailersend関数の引数となる各値は、あらかじめ定数として設定をしておくか、フォームからの入力値などを編集して設定してください。
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 51 52 |
// Phpmailerを使ってメールを送信する関数の呼び出し $res = phpmailersend ( $to, $subject, $body, $fromname, $fromaddress, $ccadress, $bccadress ); if ( $res == "Message has been sent" ){ // 正常処理 } else { // エラー処理 } // SMTPを使ってメール送信関数 function phpmailersend ( $to, $subject, $body, $fromname, $fromaddress, $ccadress="", $bccadress="" ){ global $smtp_host, $smtp_port, $smtp_user, $smtp_password; $to_array = explode ( ',', preg_replace ( '/\s/', '', $to ) ); $cc_array = explode ( ',', preg_replace ( '/\s/', '', $ccadress ) ); $bcc_array = explode ( ',', preg_replace ( '/\s/', '', $bccadress ) ); $mailer = new PHPMailer(); $mailer -> CharSet = "iso-2022-jp"; $mailer -> Encoding = "7bit"; $mailer -> IsSMTP(); $mailer -> Host = $smtp_host . ":" . $smtp_port; $mailer -> SMTPAuth = TRUE; $mailer -> Username = $smtp_user; // Gmailのアカウント名 $mailer -> Password = $smtp_password; // Gmailのパスワード $mailer -> From = $fromaddress; // Fromのメールアドレス $mailer -> FromName = mb_encode_mimeheader ( mb_convert_encoding ( $fromname, "JIS", "UTF-8" ) ); $mailer -> Subject = mb_encode_mimeheader ( mb_convert_encoding ( $subject, "JIS", "UTF-8" ) ); $mailer -> Body = mb_convert_encoding ( $body, "JIS", "UTF-8" ); foreach ( $to_array as $to ) { $mailer -> AddAddress ( $to ); // TO } foreach ( $cc_array as $cc ) { $mailer -> AddCC ( $cc ); // CC } foreach ( $bcc_array as $bcc ) { $mailer -> AddBCC ( $bcc ); // BCC } if( !$mailer -> Send() ){ $message = "Message was not sent<br/ >"; $message .= "Mailer Error: " . $mailer->ErrorInfo; } else { $message = "Message has been sent"; } return $message; } |
Phpmailerを利用する PHPのソースの解説
上記で設定したソースの解説を行います。
動けばいいという場合は、読み飛ばしてもらって構いません。
Phpmailerの読み込み(2行目)
require_once ( './PHPMailer/PHPMailerAutoload.php' );
の部分ですが、他のサイトでは下記の様に記載してあるサイトも多々ありました。
require_once ( './PHPMailer/class.phpmailer.php' );
ですが、私の環境では後者の設定では下記のエラーが出てうまく動きませんでしたので、前者の設定に切り替えました。
同じようなエラーが出る場合は切り替えてみてください。
PHP Fatal error: Class 'SMTP' not found in ./lib/phpmailer/class.phpmailer.php
正確な情報は不明ですが、Phpmailerのバージョンによって設定の仕方が違う可能性があります。(今回のこの解説は Phpmailer Ver. 5.2.9で行っています。)
ちなみに「require_once」の部分は、「require」「include_once」「include」でも何の問題もありません。
SMTPサーバの設定(4行目~)
「外部SMTPサーバーのホスト名」は、Gmailの場合は「ssl://smtp.gmail.com」「tls://smtp.gmail.com」を設定します。
レンタルサーバやプロバイダなどの契約しているメールサーバを使用する場合は、PCのメールソフトに設定している SMTPサーバを設定します。
「外部SMTPのポート番号」は、Gmailの場合は「465」を指定します。
一般的には「587」となっていますので、契約しているメールサーバの場合は「587」を使うことになるでしょう。
「外部SMTPに接続するユーザー名」は、Gmailの場合は「username@gmail.com」になります。
レンタルサーバの場合は、「username@hogehoge.com」の様にメールアドレス全体の時と、「username」の部分だけの場合とありますので、確認してから設定してください。
「外部SMTPに接続するパスワード」は、パスワードを指定します。
ただし、Gmailの場合は、パスワードを指定しただけでは「Mailer Error: SMTP connect() failed.」のエラーとなる場合がありますので、注意してください。
詳細は後述の「Gmailのパスワードの設定について」に書いていますので参考にしてみてください。
Phpmailerの実行関数(16行目~18行目)
関数に与える「$to」「$ccadress」「$bccadress」の値は下記の様に、「,(カンマ)」で複数の設定も想定しています。
そのため、スペースを削除した上でカンマで区切って配列に入れる処理になっています。
$to = "aaa@hogehoge.com, bbb@hogehoge.com, ccc@hogehoge.com";
処理上はスペースが混ざっているメールアドレスを Phpmailerに与えても問題ありませんでしたね。
スペースを省く処理くらいは Phpmailerでもやっているようです。
ちなみに、ここで配列に入れたものを 34行目~42行目の「foreach」で入力されている数だけ設定を追加していきます。
Phpmailerの実行関数(22行目~23行目)
22行目、23行目の「CharSet」と「Encoding」の設定は、記述しなくてもメール送信は可能です。
ただ、文字化けをする場合はこれを指定するといいでしょう。
Phpmailerが利用できる条件・PHPのバージョン
Phpmailerの解説の中で明確な条件を確認することはできていませんが、このライブラリは PHP 4系では利用することはできません。
理由は、ライブラリを呼び出す際に「$mailer = new PHPMailer();」と記述するオブジェクト関連の処理が PHP4系では実装されていないためです。
たぶん、PHP5.0以降では利用できると思いますが、実際に試してみた一番古いバージョンとして PHP 5.2.17では OKだった、という感じです。もちろん、それ以降のバージョンは OKでした。
また、4.4.9以前のバージョンでは NGでした。
Gmailのパスワードの設定について
Gmailのパスワードに限らず、Googleのサービスは ID、PASSを厳密に管理するようになってきています。
そのため、Gmailがデフォルトの設定のままでは直接 SMTPサーバにアクセスできないようになっています。
一般的にメールを送受信する際にも、メールソフトによっては Gmailのメールを扱えないものもありますが、それはこの設定によるものです。
Gmail関連でメールの設定に関しては、下記のサイトに説明がありますので参考にしてみてください。
http://www.atmarkit.co.jp/ait/articles/1409/03/news109.html
で、契約しているプロバイダの SMTPサーバだと問題ないのに、Gmailに変えると下記のエラーメッセージが表示されるという場合は、Gmailの設定を変更してみてください。
Mailer Error: SMTP connect() failed.
下記 URLの Googleアカウント設定にアクセスをします。
https://myaccount.google.com/?pli=1
上記のある「安全性の低いアプリのアクセス」を「オンにする」にすることで「許可」に変更することができます。
これで設定している内容でアクセスが可能になります。
Phpmailerでメール送信時の注意点
TOと CC、TOと BCCのアドレスが同じ場合は TOにしか送信されませんので注意が必要です。
これは Phpmailerでメールを送信するプログラムの時だけの注意点ではありませんが、結構忘れがちの落とし穴ですので、「なんで 1通しかメールが届かないの?」という不具合の時にはチェックしてみてください。
Phpmailerでローカル環境からもメール送信
XAMPPなどのローカル環境を構築して、プログラムの勉強やシステム開発を行っている方もいらっしゃると思いますが、ローカル環境なのでメール送信の環境がなくて困っている!という場合も、この Phpmailerライブラリを使うことでメールを送信することができてしまいます。
もっとも、そもそも XAMPP環境からメールが送信できないとメールフォームだけではなく、WordPressで何か開発する際なども困るわけですので、そんな場合は「ローカル環境の XAMPPからメールを送信できるように設定する」という記事を書いていますが、この記事の内容の対応をすることで XAMPP環境からもメールが送信できるようになります。
結局は、Gmailのメールサーバにメールを送ってもらっているわけですが。
Phpmailerと同種の Qdmailを使う場合
Phpmailerと同じように、PHPから外部の SMTPサーバを経由してメールを送信する機能を提供するライブラリとして、「Qdmail」「Qdsmtp」というものがあります。
私は Phpmailerより先にこれを見つけたために、これを先に使ってみたワケですが、開発がずいぶん前に止まってしまったようで、現在の PHP5などでは下記の様にエラーが出てしまいます。
1 2 3 4 5 |
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\htdocs\lib\qdmail.php on line 661 Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\htdocs\lib\qdmail.php on line 3677 Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\htdocs\lib\qdmail.php on line 3771 Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\htdocs\lib\qdmail.php on line 3820 Strict Standards: Declaration of QdmailComponent::smtpObject() should be compatible with & QdmailBase::smtpObject($null = false) in C:\xampp\htdocs\lib\qdmail.php on line 3734 |
これは、PHPのエラーレベルに「E_DEPRECATED」が加わったことで出るもので、将来的にサポートされなくなる関数が使われているときに出る警告です。
現状では警告メッセージが出るだけですので、使用するプログラムに下記のエラーメッセージの制御コードを追加すれば見えなくなります。
1 |
error_reporting ( E_ALL ^ E_DEPRECATED ^ E_STRICT ); |
もしくは、.htaccessに書く場合は下記を指定します。
1 |
php_value "error_reporting" "E_ALL & ~E_NOTICE & ~E_DEPRECATED" |
これで警告メッセージは見えなくなりますし、現時点ではプログラムの動作も何の問題もありませんが、将来的にはサポートされなくなる関数が入っているわけですし、積極的にこちらの Qdmailを使う理由が見当たりません。
Phpmailerはファイル数、ファイル容量が大きいためにその点が問題になる場合があれば、Qdmailを使う場面もある可能性はゼロではありませんが、実際ありえないでしょうね。
今後もスパム判定が厳しくなることはあってもゆるくなることは考えられませんので、今のうちから Phpmailerを利用しておくといいでしょうね。
WordPressで Phpmailerを利用する場合
ここで紹介したメールを送信するとスパム判定されてしまう問題点は WordPressにも同様に存在します。
ですが、WordPressの場合は、WP Mail SMTP、WP SMTP、Easy WP SMTPといったプラグインで簡単に対応が出来てしまいます。
その解説の記事を下記に書いていますので、あわせて参考にしてください。
WP Mail SMTP、WP SMTP、Easy WP SMTPでWordPressのメールのスパム判定を回避
WP Mail SMTPはPHP5.6、7.0系ではメール送信時にエラーが発生。その対処方法。
SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。
-
複数銘柄を指定して株価チャートを一覧するツール公開
入力銘柄の5日間、3か月間、6か月間、1年間、2年間の株価チャートを一覧表示しますのでチャートで売買判断をするのに最適です。
-
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
パーミッション(属性)一括変更ツール・WordPress最適化済
WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。
-
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!
-
ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説
ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!
-
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。
-
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。
-
Basic認証の.htaccess、.htpasswd生成ツールと解説
Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。
Comment
PHPMailerのダウンロードページとして提示しているGithubですが、正しくは https://github.com/PHPMailer/PHPMailer です。
(以下、上記のリンク先をPHPMailer/PHPMailerとします)
紹介しているページの上をよく見ると分かるのですが、「forked from PHPMailer/PHPMailer」とあります。
これは、PHPMailer/PHPMailerをコピーした、のような意味合いで、本来のページがPHPMailer/PHPMailerであることを示しています。
また、commitsの数(更新数)も、PHPMailer/PHPMailerのほうが多いことがわかると思います。
sounisi5011さん、コメントありがとうございます。
理解不足でご迷惑をおかけしました。
近日中に記事の方も更新をさせていただきます!