WordPressでは、サイトからの通知や問い合わせフォームからの通知などを行う際、デフォルトでwp_mail()という関数を使用してメールを送信しています。

何も設定もせずにメールが送れるのはWordPressのありがたい機能ではあるものの、受信側のセキュリティ等によって、メールの受信が拒否されたり、迷惑メールとしてマークされてしまったりすることが少なくありません。

単純なサイトからの通知ならいいですが、問い合わせがあったのに見逃してしまったり、ユーザーへ送信すべきメールが届いていないなんてことになるとちょっと都合が悪いですね。

致命的なのはサイトがストップされたときに送信される「サイトに重大なエラーが..」というメールや、パスワードをリセットした時の確認メールが届かなかった時。まあ、どちらも修復の知識があればメールなんてなくても簡単に解決できるのですが、そうでない場合は..青ざめますね。

そこで今回はプラグインを使わずに、より到達度の高い「SMTP-AUTH」とより秘匿性の高いSSLやTLS(STARTTLS)の暗号化を使ってサイトからメールを送信する方法を紹介します。

メールの送信方法を変更するコードと解説

サンプルコード

WordPress標準のメール送信システムにフック(正確には、wp_mail()が起動する前に割込み)して、「SMTP-AUTH」通信させ、「SSL」で暗号化する場合のサンプルコードです。

以下のコードを有効化しているテーマのfunctions.phpへ追加し、赤字部分をサーバーなどで調べて自身の環境に合わせて変更すれば機能します。

functions.phpへの追記に不慣れな方、万が一トラブルが発生した際に対処できない方は無理にカスタマイズしないでください(トラブルが起きても責任は負いかねます)

/***** メールをSMTP経由にする テスト*****/
function sample_send_mail_smtp($phpmailer){
//サイト名・サイトメールアドレスを変数化
	$blog_name = get_bloginfo('name');
	$blog_admin_email = get_bloginfo('admin_email');

//パラメーターをセット
	$phpmailer->isSMTP();//SMTP有効化
	$phpmailer->Host = 'mail.habone.biz';//メールサーバーのホスト名
	$phpmailer->SMTPAuth = true;//SMTP認証の有無(true OR false)
	$phpmailer->Port = '465';//SMTPポート番号(ssl:465 tls:587)
	$phpmailer->Username = 'ユーザー名';//ユーザー名
	$phpmailer->Password = 'パスワード';//パスワード
	$phpmailer->SMTPSecure = 'ssl';//SMTP暗号化方式(ssl OR tls)
	$phpmailer->setFrom($blog_admin_email, $blog_name);//送信者情報
}
add_action('phpmailer_init', 'sample_send_mail_smtp');

コードの説明

WordPressでメールを送信する際には以下のようなプロセスがあります。

  1. メールを送信する命令が実行される
  2. PHPでメールを送信する機能(PHP Mailer)が初期化される
  3. wp_mail()(PHP Mailerを使ってWordPressがメールを送信する機能)が実行される
  4. メールが送信される

サンプルコードは、2の後で流れを遮断して設定を切り替える、「phpmailer_init」というフックを使用します。

コード中の各内容(//でコメントしています)を指定して、「SMTP-AUTH」「SSL」を使ってメールを送信するように切り替えています。

WordPressのサイトから送信されるメールなので、以下の項目は未入力でも自動セットされるようにしています。

項目自動設定する関数
Hostget_bloginfo(‘name’);サイト名
Fromget_bloginfo(‘admin_email’);送信元アドレス
FromNameget_bloginfo(‘name’);サイト名

設定できる情報

前項のサンプルコードに設定されている情報以外にも、いろいろな情報を含めることができます。必要な項目に対して以下のようにパラメーターを追加して必要情報への編集を行ってください。

$phpmailer->パラメーターと設定値

基本項目

項目構文備考
SMTPを有効化isSMTP();

サーバーとの接続情報

項目構文備考
ホスト名Host = ‘ホスト名’;
SMTP-AUTHの有効化SMTPAuth = true;true / false
ユーザー名Username = ‘ユーザー名’;
パスワードPassword = ‘パスワード’;
暗号化SMTPSecure = ‘形式’;ssl / tls
ポート番号Port = ‘ポート番号’;SSLの場合は「465」など
TLSの場合は「587」など

送信内容(送信者情報や返信情報)

項目構文備考
送信元setFrom(‘送信元アドレス’, ‘送信者名’);
受信アドレスaddAddress(‘受信メールアドレス’);受信者を指定する場合に設定
(単純にSMTP-AUTH通信する場合には不要)
返信先addReplyTo(‘返信アドレス’,’受信者名’);別のメールアドレスへ返信させる場合に指定
(返信時の送信先情報に自動挿入される内容)
CCaddCC(‘受信アドレス’);CCとして受信するメールアドレス
BCCaddBCC(‘受信アドレス’);BCCとして受信するメールアドレス

本文に関する設定項目

項目構文備考
書式isHTML(true);Text形式:false
HTML形式:true
件名Subject = ‘件名’;
本文冒頭Body = ‘冒頭の文章’;
本文の代替AltBody = ‘Text内容’;受信者がHTML形式のメールを受信
できない場合に代替で表示する文章

その他詳しい情報はPHPMailerなどを参照ください

きちんとメールが送信されるかを確認する

ここまでの説明とコードの追加を行ってOK!ではありません。実際にメールが送信されるか?本当に「SMTP-AUTH」を使って送信され、「SSLやTLS」で暗号化されているかを確認する(テストする)必要があります。

テストメールを送信するには、以下のプラグインを一旦(テスト用として)インストール&有効化します。

プラグインを有効化したら、「ツール」→「Test Email」を開き、下図のような画面が出てくるので、受信可能なメールアドレス(サイトのメールアドレスでも可)と件名を入力し、「変更を保存」をクリックして送信してみてください。

送信が完了したら、画面上部に「Email has been sent!」と表示されれば、正常に送信されています。

簡易的な確認でよければ、受信したメールの名前が「wordpress」ではなく、サイト名(または自分)となっていればカスタマイズしたコードはきちんと適用されています。

きちんと確認したい場合には、メールのソースを表示して以下の点を確認しておきましょう。

  • 送信者名が「サイト名」になっているか(文字化けしているのは日本語だからですので問題ありません)
  • Received項目に「(TLS〇〇)」などの暗号化情報が入っているか

テストして問題がないようでしたら「WP Test Email」プラグインは停止&削除してカスタマイズ終了です。

メール送信時にエラーが出るときは

テストメールの送信時にエラーが表示されたり、「サイトに重大なエラーが..」と出てしまったときは、設定内容に誤りがある場合がほとんどですので、以下の点などを見直してみましょう。

  • 各設定の文字列が半角の「’」で囲まれているか
  • 「;」「’」などの記号が重複していないか、全角になっていないか
  • 同じパラメーターを重複して追加していないか

「重大なエラー..」となった場合でもエラーになっているのはメール送信の部分だけですので、普通にその他の編集はできると思います。ただケースバイケースですので、対処に慣れていない方はこのカスタマイズをあきらめた方がいいでしょう

素直にプラグインを使った方がいいケースもあります

ここまでは、プラグインなしで「SMTP-AUTH」「SSLまたはTLS」を使ってのメール送信に切り替える方法を紹介してきました。

確かにプラグインを1つ追加するよりも、上記のようなコードで簡単に実装できるので便利ですし、余分な設定プログラム等がないのでより高速動作させたい場合には有効であるものの、以下の場合には、素直に専用プラグインを使用したほうが無難ですから、よく検討して使い分けをしましょう。

  • 大量にメールを送信する(メルマガなど)サイトで、サーバーの制限により時間や日単位でのメール送信件数を制御する必要がある場合
  • テーマのfunctions.phpへのコード追記やトラブル対応に明るくない場合
  • 他のプラグインなどのメール送信機能との併用で不都合や不具合がある場合

用語の簡易解説

「SMTP-AUTH」

よく、これと同じようなコードの紹介ページなどで「SMTPでの送信に切り替える」というのがありますが、厳密には正しい表現ではありません。

というのも、WordPressから送信するメールシステム自体は既に「SMTP」を使った送信はしているからです。

このページで使っている「SMTP-AUTH」とは、「SMTP」を拡張(強化)する機能で、超簡単に言い換えれば送信前に「お前は誰だ?」「本当に本人が送信しているのか?」を確認する機能です。

昔々メールができるようになった頃は、この認証がなく、なりすましメールが横行しました。

これを防ぐために、送信用の接続情報(メールアドレスとパスワードなど)の認証プロセスを追加して、本人(本当に送信権限を持った送信者か?)確認を行った上でメールを送信するという仕組みへ変化しました。

これが「SMTP-AUTH」認証です。もちろん、ポート番号や接続情報が漏洩してしまえばなりすましは可能になるものの、当時のノーチェックと比べれば格段に不正行為は減った画期的な仕組みです。

参考:TCP/IP – SMTP Submission Port

「SSL」「TLS」

単純にメールの送受信中に情報を盗み取られるのを防ぐ機能です。暗号化には大きく「SSL」と「TLS(正式には「STARTTLS」)」という方法があり、どちらを使って通信するかに応じてサーバー側でポート(通路)が割り当てられています。

つまり、そのポートを通して送られたメールの内容は、第三者が傍受しても解読できないようにするというのが暗号化機能です。

恐らくサイト管理している方なら、サイトのSSL通信対応というのは耳にしたことがあるかと思います。これは単純にURLの先頭が「https://~」になるというものではなく、持ち主が明確な場合に発行されるSSL証明書を適用させ、通信時にデータを暗号化するという機能で、この暗号化をメールでも使えるようにしたものと考えればいいでしょう。

従って、「SSL」通信対応のサイトからのメールであれば、メールの暗号化も「SSL」にしておけば間違いがなく、どうしても送信できない場合に「TLS」を使うという形で問題ないでしょう。

参考:SSL,STARTTLSによるメール通信経路の暗号化