WP Mail SMTPはPHP5.6、7.0系ではメール送信時にエラーが発生。その対処方法。
2017/06/04
WP Mail SMTPはPHP5.6、7.0系ではメール送信時にエラーが発生
X Serverで PHPを 7.0にアップすると WP Mail SMTPでメールが送信できなくなった
「月極駐車場検索エース」のサイトは、WordPressで構築していまして、メールの送信には、メール送信プラグイン「WP Mail SMTP」を使っていました。
そして、2016年の年末にこのブログも含めて SSL化の対応を行いましたが、その際に PHPのバージョンを 7.0系にアップデートする対応をしていました。
X Serverでは、PHPのバージョンを変更することが非常に簡単に実行することができます。
で、PHP 7.0にアップしたところ、メールが送信されなくなるというエラーが発生しました。
これは、PHP 5.6から OPEN SSLに関するアップデートがあったために、ピア証明書が正しく設定されていないサーバからメールを送信する際にエラーとなり、SMTP経由でメールが送信できなくなる、という不具合でした。
詳細は、最後に書いていますので合わせて参考にしてみてください。
というわけで、この不具合を回避する方法を紹介します。
functions.phpに不具合回避の処理を追加する
PHPのバージョンが 5.6以上(7.0系を含む)になると、OPEN SSLのピア証明書を検証する処理がデフォルトで有効になりましたので、ピア証明書が正しくない場合にエラーとなり、メールが送信できなくなる、という問題でした。
そのための対処方法として、PHP 5.5までと同じように、「ピア証明書の検証をしない」という処理に戻す方法を採ります。
具体的には、下記を functions.phpに編集します。
functions.phpのある場所は、下記になります。
/{WordPressのインストール場所}/wp-content/themes/{テーマ名}/functions.php
functions.phpのある場所についての詳細は、「WordPressの functions.phpがある場所」に解説をしていますので合わせて参考にしてください。
functions.phpのファイルの中のどこかに追記すればいいんですが、ファイルの一番最後に追記する方法が無難でしょう。
1 2 3 4 5 6 7 8 9 |
function my_wp_mail_smtp_custom_options ( $phpmailer ) { if ( isset( $phpmailer->SMTPAuth ) ) { if ( $phpmailer->SMTPAuth == true ) { $phpmailer->SMTPOptions = array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true)); } } return $phpmailer; } add_filter("wp_mail_smtp_custom_options","my_wp_mail_smtp_custom_options"); |
WP Mail SMTPのプラグインのファイルを直接修正はダメ
前項の解説で、functions.phpに処理を記述しています。
これは、プラグインのファイルを直接メンテナンスをしないための処理です。
前項で解説した処理は、下記の様に、プラグインのファイルを直接メンテナンスする方法と同じ処理になります。
/wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php
の 150行目付近
1 2 3 4 5 6 7 |
// If we're using smtp auth, set the username & password if (get_option('smtp_auth') == "true") { $phpmailer->SMTPAuth = TRUE; $phpmailer->Username = get_option('smtp_user'); $phpmailer->Password = get_option('smtp_pass'); $phpmailer->SMTPOptions = array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true)); } |
この方法であれば、6行目の 1行を追加するだけで対応が可能です。
そのため、この方が一見簡単に見えますが、プラグインのアップデートが行われた場合は、修正したファイルは更新されてしまいますので、その都度修正をやり直す必要が発生します。(プラグインをアップデートすると、プラグインフォルダの中身は、「削除→新規追加」の処理が実行されるため、プラグインフォルダの中身は全く別物になります。)
そのため、プラグインのファイルを直接メンテナンスしてしまうと、プラグインのアップデートを気軽にできなくなりますので、避けるべき対応方法です。
「SMTP Mailer」というプラグインを使う
これまで解説した方法は、functions.php、もしくは、wp_mail_smtp.phpのファイルに対して、プログラムの改修を行う、というものです。
私はエンジニアですので、プログラムを触ることに抵抗はありませんが、なるべくならプログラムに触らずに何とかしたい、という方もいるでしょう。
ということで、サクッと新しいプラグインを導入するという方法もありますので、ご紹介します。
「SMTP Mailer」というプラグインを使う方法です。
「WP Mail SMTP」を「停止」させて、「SMTP Mailer」というプラグインをインストールして、利用します。
詳細な利用方法については、「SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応」に解説記事を書きましたので、そちらを参考にしてください。
「SMTP Mailer」の設定のポイントは、「Disable SSL Certificate Verification」にはチェックを入れるようにする、というところですね。
WP Mail SMTPで PHP 5.6、7.0にするとエラーが出る理由を詳細解説
PHPが 5.6にバージョンアップする際、OPEN SSLに関する処理に変更がありました。
その変更とは、「ピア証明書」を検証する「ピア検証」が、デフォルトで有効になりました。
それによって、「ピア証明書」が正しくないサーバを利用していた場合は、PHPのバージョンを 5.6(7.0系を含む)にバージョンアップすることで、SMTPサーバへの接続がエラーとなり、SMTPサーバ経由でメールを送信する処理がエラーになるようになりました。
つまりは、「WP Mail SMTP」プラグインを使って、SMTPサーバ経由で送信していたメールがエラーになるようになった、というわけです。
「ピア証明書」は、通信相手から受け取った相手側の証明書で、この証明書を使って通信相手の身元を確認したり、暗号化のための公開キーを入手することができます。
また、「ピア証明書」の別名を「対向マシンのX.509v3証明書」といいます。
「X.509」は、電気通信標準化部門(ITU-T)が規定する公開鍵基盤(PKI)の規格で、公開鍵証明書の標準形式や、証明書パス検証アルゴリズムなどを定めています。
その規格のバージョン 3が、「X.509v3証明書」です。
ざっくり説明すると、SSLの認証には複数の手順で実現されていますが、その一つ一つにチェックする仕組みがあるわけですが、その一つが「ピア証明書」を検証する「ピア検証」で、PHP 5.6からはその「ピア検証」がデフォルトで有効になりました。
ということです。
ということですので、対処方法としては、下記のようなものがあります。
・ピア認証を無効にする
・ピア認証の対処がされているプラグインを利用する
・PHPのバージョンを 5.5以下にする
3項目目は、選択肢としてとりえないので解説はしません。
理由は、すでに PHP 5.5以下は推奨されないバージョンであるためです。
また、本来の対応方法としては、正しいピア証明書を使っている SMTPサーバを利用する、という方法なわけですが、利用しているレンタルサーバ(私の場合は X serverですが)が正しく実装されていないのだとすると、ユーザ側では対処療法で対処するしかないわけです。
あとは、X serverに連絡をして、連絡をして、連絡をして、対応してもらう、という方法でしょうか。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
WP Customer ReviewsでWordPressにオリジナルの口コミサイトを構築
口コミサイトを構築するためのプラグイン。独自フォームによるレビュー、評価点を投稿でき、入力項目の追加もできます。
-
AdminerはWordPressのデータベース管理プラグインの決定版!
データベース管理プラグインはAdminerがあれば他に必要ありません。なぜならDB管理ツールAdminerと同じものをプラグインとして提供しているからです。
-
WordPressにプラグインを使わず OGP(Open Graph Protocol)の設定方法解説
WordPressに OGP(Open Graph Protocol)をプラグインを使わずに設定する方法の解説。
-
WordPress csvインポート、エクスポートのプラグイン
WordPressから csvファイルをエクスポート、インポートする方法を紹介しています。
-
Search RegexでWordPress投稿の文字列を検索・置換する使い方解説
WordPressの投稿テキストを検索、置換するプラグイン Search Regexの使い方の詳細解説です。
-
WordPressのメディア設定でアップロードするファイルの保存場所を変更する方法
メディアのアップロードするファイルの保存先を変更する方法の解説。現在はオプションとなっていますので、/wp-admin/options.phpから設定します。
-
Rating-Widgetは超簡単設定のWordPress口コミサイト構築プラグイン
口コミの評価点を投稿する機能に特化したプラグインで、多様なイメージの投稿方法や一覧ページ、コメントなどにも投稿機能を追加することができます。
-
WordPressのウィジェットでショートコードを使う方法add_filter
WordPressのウィジェットでショートコードを利用するには add_filter、do_shortcodeの関数を利用する必要があります。
-
BackWPupでバックアップ・Jobの設定・保存する情報の設定
BackWPupその2。Jobのバックアップの基本部分と対象の設定についての解説。
-
WordPressのコメントスパム対策 3つのプラグイン
対策なしではコメントスパムがやってきます。その対策方針としてプラグインを提示しながら解説します。いずれかの対策は必須です。
Comment
こちらの記事でSMTPのメールテストに成功しました!
ありがとうございます!
下記のようなスペックで動作確認しました。
WordPress 5.3.15
PHP 7.2.12
masakichi さん、コメントありがとうございます。
記事自体も古いですが、WordPressのバージョンもかなり変わってしまっていますが、無事に動作したと言うことで良かったです!