Analog Studio

WordPressのContactForm7で送信が遅い・迷惑メールになる場合にSMTPを設定する方法

概要

WordPress でサイトを作成する時、お問い合わせフォームとして「Contact Form 7」というプラグインを使う機会は多いと思います。
非常に便利でカスタマイズ性に優れたプラグインですが、サーバや設定によっては送信されるまでに非常に時間が掛かることや迷惑メールに仕分けられてしまうこともあります。
もっと深刻だとメールが送信すらされないこともあります。

そんな時、メールの送信に SMTP サーバというメール送信用のサーバを設定することで解決できることが多いです。
そこで今回はそんな SMTP サーバの設定方法を紹介します。

そもそもなんでメール配信が遅かったり迷惑メールになるのか?

Contact Form 7 で送信されるメールは WordPress の wp_mail() 関数を利用して送信されています。
基本的にはこの仕様に問題はありません。

しかし、この wp_mail() 関数は内部的には PHPMailer というライブラリを使用して動いており、PHP の設定ファイルに従ってメールの送信処理が行われます。
この送信処理は sendmail などのサーバアプリケーション (php.ini 設定ファイルによる) で実行されますが、ここに問題が潜んでいます。

php.ini で SMTP サーバを localhost (つまりサーバ自分自身) に設定していても DNS (名前解決、localhost を IP アドレスに変換する仕組み) で自分の IP を取得するまでの時間が掛かったりしてしまうことがあります。
またメール送信は順番に送信される為、共有サーバなどでは意図せず順番待ちが発生している可能性があります。
迷惑メール対策で送信間隔が長いことも考えられるので数分以上も待たされることもあるでしょう。

迷惑メールに関しては、php.ini に SMTP サーバへのアカウント認証などを設定していない場合は、送信元がサーバ自身になり送信元メールに設定したドメイン (貴方の独自ドメイン) と実際に送信したサーバのドメイン (レンタルサーバなどのドメイン) が一致しないことになるので迷惑メールと判定される可能性が高くなります。

したがって、これらを解消するために SMTP サーバを明示してメールアカウントの認証を行うことで回避できるというわけです。
送信サーバもレンタルサーバや Gmail ならすぐに名前解決できますし、アカウント認証しているので送信元もはっきりしています。

レンタルサーバで SPF / DKIM / DMAR の設定を反映するためには SMTP 認証が必要

Google のメール受信のポリシーにより、SPF (Sender Policy Framework) や DKIM (DomainKeys Identified Mail)、DMARK (Domain-based Message Authentication、Reporting and Conformance) の設定が必要になった方も多いでしょう。

SPF は、DNS に送信サーバの IP アドレスを設定しておくことで、見かけのメールアドレス (From) があなたの管理するドメインを騙って別の送信サーバから送信された場合に送信サーバの IP が一致しないことでこれらの詐称を見抜くことができます。

DKIM は、サーバに保存された秘密鍵と送信データを使って署名と呼ばれる一種のハッシュ値をメール送信のヘッダに付与して送信します。この署名を DNS の DKIM 設定で確認できる公開鍵を使って検証を行います。公開鍵を使って正しく検証ができる署名を作成できるのは、秘密鍵を持っているサーバのみなので本文や送信元に詐称がないことが確認できます。
(DKIM は現時点では、RSA 暗号のみがサポートされています)

DMARK は、検証に失敗したメールをどのように処理するかの指示を与えるフラグです。こちらも設定することが推奨されています。

多くのレンタルサーバでは、これらの設定が行えるのは自信が管理するドメインだけですので、SMTP 認証が必要になるということです。

WordPressでのSMTPサーバの設定方法

WordPress の wp_mail() 関数で送信されるメールに SMTP 認証を行う場合、プラグインを使用する方法と functions.php にコードを追加する方法があります。
どちらを使うかの判断はお任せしますが、プラグインは多くのページで紹介されているので fucntions.php の方法を詳しく解説します。

プラグイン「WP Mail SMTP」を使う

プラグインの紹介だけしておきます。使うプラグインは「WP Mail SMTP by WPForms」というもので非常に有名です。
https://ja.wordpress.org/plugins/wp-mail-smtp/

このプラグインでは様々な SMTP サーバを使った設定が行えます。

但し、送信元のメールアドレスは設定した SMTP サーバのメールアドレスになってしまうので自動返信などでいくつかの仮想のアドレスを利用したい場合には使えません。
お問い合わせの自動返信に auto-reply@あなたのドメイン、ユーザ登録完了の自動返信に registered@あなたのドメイン、…などと使い分けることはできません。
このような場合は以下の方法を試してみて下さい。

functions.phpにコードを追加する

プラグインよりも柔軟な処理を行いたい (自動返信ごとにメールを分けるなど) 場合は functions.php にコードを追加します。
functions.php の編集はリスクがあるので慎重に自己責任で行って下さい。

wp_mail() 関数は送信直前に 'phpmailer_init' というアクションフックを設定してあります。
このフックでは PHPMailer オブジェクトへのポインタを引数として受け取れるので設定を追加していきます。

具体的には以下のコードを functions.php のどこでもいいので追加します。

// wp_mail()関数で送信するメールにSMTPサーバ認証を使う add_action( 'phpmailer_init', function( $phpmailer ) { // SMTP有効設定 $phpmailer->isSMTP(); // SMTP接続を継続 // 1通ごと送信するなら設定しなくてもいい // $phpmailer->SMTPKeepAlive = true; // メールサーバーのホスト名 $phpmailer->Host = 'sv****.xserver.jp'; // Xserverの場合(****にはサーバ番号) // SMTP認証の有無 (true/false) // メールアカウントで認証するのでtrueを設定 $phpmailer->SMTPAuth = true; // SMTPポート番号 // 暗号化なしなら25、SSLで暗号化なら465、TSLで暗号化なら587が多い(詳細はサーバの設定を確認) $phpmailer->Port = 465; // SMTP認証時のユーザー名 // ユーザ名はアカウント名やメールアドレスが多い(詳細はサーバの設定を確認) $phpmailer->Username = 'send-mail@analogstd.com'; // このアドレスは実際には存在しません // ユーザーのパスワード // パスワードは平文で設定するので注意して下さい $phpmailer->Password = '*****************'; // SMTP暗号化方式(port番号:587->tls/465->sslが多い) $phpmailer->SMTPSecure = 'ssl'; // 送信元アドレスを固定にする場合はここで設定する // 設定しない場合、ContactForm7の送信元に設定したアドレスが設定されています // $phpmailer->From = "send-mail@analogstd.com"; // 送信元の差出人名を固定にする場合はここで設定する // 設定しない場合、ContactForm7の送信元に設定した名前が設定されています // $phpmailer->FromName = "Analog Studio 自動返信"; } );

これで SMTP サーバを認証して使うことができるようになりました。

但し、送信元ごとに違う SMTP サーバを設定したい……となると $phpmailer->From などに設定されているアドレスから条件分岐して設定する必要が出てきます。
管理が煩雑になるので本当に必要かを良く検討してみて下さい。

まとめ

以上、Contact Form 7 をはじめとする WordPress からのメール送信がうまくいかない時の対処法でした。
プラグインで送信元アドレスが固定さて困った際には思い出してみて下さい。