WordpressやWEB上から、Gmailアドレスのメールを送信できない!
今回サイト上で問題が発生し、Gmailからの送信が行えなくなっていたので、その解決に至るまでの流れをつらつらと書き残していこうと思います。
同じ問題に直面した方、何らかのお役に立てればと思います…。
問題は、ここ遡る事数日…、先日まで正常に動作していたWEB上のフォームや、Wordpressの管理者アドレスとして指定しているGmailアドレスからメールが送信されていないことが判明。
Gmail使うなよ!という話もありますが、様々な事情のためGmailを指定しているのですが、あまり突っ込まないでください。
1つは上記にあげたWordpressのフォームで「Contact form7」というプラグインです。
もう1つは、GoogleカレンダーAPIを通して、フォームから日付を選択して申し込むと、対象のGoogleアカウントのカレンダーに予定が設定される、自前のお問い合わせフォームになります。
いずれも自動送信時の送信元アドレスとしてGmailが指定されています。
これ関係あるのかわかりませんが、お問い合わせ自体、つまり申し込みを行う側もGmailのアドレスを指定すると絶対にメールが届かないんですよね。普通のメールは時々迷惑メールには届く事も…。
つまり管理者にもユーザーにも何も反応が無いという、無駄な時間を費やすだけの無用の長物と化しているわけです。
で、いろいろと調べてみると、ここ最近Gmailの判定が厳しくなったようで、そのまま運用していては、なりすましやスパムと判断されてしまうため送信ができなくなっているようです。(以前からありましたが、順次反映されているようです)
まあ、example.comのサイトからgmail.comとしてメールが送られるのは普通ではないわけで…。しかし、事情からGmailとしての送信を行いたい…。
この記事にたどり着いた方は恐らく、「SPFレコード」の設定なども試されたのではないでしょうか?
ここではSPFについては詳しくお話しませんが、結論として私自身もSPFの設定を様々試しましたが、全く改善されませんでした。
また、自前のフォームの方になりますが、mb_send_mailの第五引数に「-f」のオプションを設定することで解決できたようなお話も見受けましたが、私の方では、何とかメール自体は送信することができたものの、全てのメールが「550-5.7.26」エラーとなりもれなく迷惑メールに警告メッセージと共に振り分けられてしまいます。
結論、GmailをSMTPで送信する事で解決!
あまり長くなってあれなので、結論です。
現在の問題として、Wordpressの場合には、wp_mail()関数での送信で引っ掛かり、PHPのフォームの場合、今回はmb_send_mailの関数で送信しようとする際に問題となっています。
そこで、GmailのSMTPサーバーを使った送信に切り替えます。嘘のように問題が解決されると思いますので、お困りの方はこちらの方式をお試しください。
では、ここからスピードアップで紹介します!
Wordpressのプラグイン、Contact Form 7をSMTPで送信する!(プラグイン不要)
まずは、Contact Form 7をSMTPで送信する方法です。
※Contact Form 7と記載していますが、厳密にはWordpressから送信する場合なので他のプラグイン使っていても大丈夫かと…。
GmailのSMTPを使うにあたって、Googleから「アプリパスワード」なるものを取得しなければなりません。※アプリパスワードは後でお話しする、PHPなどを利用した場合の送信でも必要となります。今回はWP、PHPいずれの場合も取得しましょう。
早速取得しましょう。
今回使用するGmailの、Googleアカウントにログインし、セキュリティを選択し、「2段階認証プロセス」をクリックします。
Googleアカウント:https://www.google.com/intl/ja/account/about/
なお、アプリパスワードは、この2段階認証が有効でなければ取得できません。
設定などは全く難しくないので、必ずこちらを有効に設定してください。
有効になると以下の通り最後に「アプリパスワード」が表示されていますので、今度はこちらをクリックします。※表示されない方は2段階認証を有効にしてください。
生成されたパスワードは、一旦メモ帳などに張り付けて保存しておいてください。
これで、WordpressでSMTPを利用する準備ができました。
WordpressでSMTPを利用するためのアクションフックをfunctions.phpに追記する。
今までのWPで利用している、wp_mai関数に変わってSMTP送信を行うために、phpmailer_initを使って設定を行います。
phpmailer_initについての詳細はこちらをご確認ください。
こちら、実際に設定するとこんな感じです。
function my_phpmailer_example($phpmailer)
{
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.gmail.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = '587';
$phpmailer->Username = 'example@gmail.com'; //今回のGmailアドレス
$phpmailer->Password = 'xxxxxxxxxxxxxxx'; //アプリパスワード
$phpmailer->SMTPSecure = 'tls';
$phpmailer->From = 'example@gmail.com'; //送信者アドレス
$phpmailer->FromName = '送信者名とか…'; //送信者情報
}
add_action('phpmailer_init', 'my_phpmailer_example');
アドレスやパスワードなど、諸々細かな部分はご自身の情報に書き換えてください。
パスワードは生成した、アプリパスワードになります、先ほどメモ帳に保存した情報を記載してください。
上記は、TLS(Transport Layer Security)として送信する設定です。
SSLとして利用する場合には、 以下の項目部分をこのように変更してください。
Portは465、SMTPSecureはsslに変更してください。
{
$phpmailer->Port = '465';
$phpmailer->SMTPSecure = 'ssl';
}
設定が出来たら、これらのコードをお使いの、functions.phpに張り付けて保存し、サーバーにアップします、これで完了です。※functions.phpは作業前にバックアップを取っておきましょう。
動作確認のため、現在お使いの「Contact form7」やその他、Wordpressから送信されるフォームなどに申し込みを行ってみてください。無事にGmailアドレスから送られて受信できれば成功です!
PHPからの送信をGmailのSMTPで行うには?
先ほどまでは、Wordpressから送信を行う場合、つまりwp_mail()関数から送る場合ですが、続いては自前のPHPフォーム(mb_send_mail()関数)などから送る場合の方法についてです。
Wordpressの時より、少しだけ手間が増えますが最後まで読んでいただければ、問題無く設定できるかと思いますのでご安心ください!
まずは、Wordpressの時にお伝えした通り、今回もアプリパスワードが必要になりますので同様の手順でパスワードを取得し、メモ帳などに保存をしておいてください。
PHPからの送信にはPHPMailerを利用する
方法は色々あるかと思いますが、PHPMailerを利用するとGmaiからのSMTP送信が非常に簡単に送れるで、今回はこちらを使って行きたいと思います。
まずは、PHPMailer本体を以下よりダウンロードします。
PHPMailer:https://github.com/PHPMailer/PHPMailer
ちなみに、今回はComposerからインストールするのではなく、上記URLよりダウンロードしたファイルを使用します。そのため、読み込みのパスが若干異なりComposer経由ではエラーとなりますので、今回はダウンロードしたファイルを利用してください。
ダウンロードは、上記URLにアクセスし「Code」から「Downlode ZIP」を選択します。
ダウンロードデータを解凍すると、何故かPHPMailer-masterという名前になっていますので、これを「PHPMailer」に変更します。※ディレクトリ名変更は、しなくてもいいですが、その場合は読み込みパスの変更を行ってください。この後記載するコードをコピペなどで利用される方は、「PHPMailer」に変更してください。
準備が出来ましたら、解凍したデータ、「PHPMailer」をメール送信を行うファイルと同じ階層にアップロードを行ってください。
mb_send_mail() のメール送信の処理が書かれているファイルがあるかと思います。
例えば、thanks.php などですね。
こちらのファイルを同じ場所に、「PHPMailer」をアップロードしてください。
もちろん階層は自由に変更頂いて結構ですが、その際は、適宜読み込みパスの指定を変更してください。
例)
contact
├ PHPMailer ←同じ階層にディレクトリ丸ごとアップ
├ contact.php
├ check.php
└ thanks.php
最後に、SMTPからの送信設定を行う!
ここまでで、SMTPからの送信設定は90%完了です。
あとは、以下のコードを参考に設定を行っていただき、現在mb_send_mai()などでメールを送信する設定になっている箇所を変更して頂ければ完了です!
//PHPMailer読み込み
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
//設置場所のパス指定
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
$mail = new PHPMailer(true);
try {
//Gmail 認証情報
$host = 'smtp.gmail.com';
$username = 'example@gmail.com';//Gmailアドレス
$password = '****************'; //アプリパスワード
//差出人
$from = 'example@gmail.com'; //差出人のメールアドレス
$fromname = '差出人名'; //差出人の表示名
//宛先
$to = 'example_user@gmail.com'; //申込者のアドレスが入るよう設定
$toname = '宛先名'; //申込者の宛名
//件名・本文
$subject = 'メールの件名を入れてください'; //メールの件名
$body = '送信するメールの本文'; //メールの本文
//メール設定
$mail->SMTPDebug = 2; //デバッグの際は1or2 運用時、最終的には0指定
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = $host;
$mail->Username = $username;
$mail->Password = $password;
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->CharSet = "utf-8";
$mail->Encoding = "base64";
$mail->setFrom($from, $fromname);
$mail->addAddress($to, $toname);
$mail->Subject = $subject;
$mail->Body = $body;
//メール送信
$mail->send();
echo '成功';
} catch (Exception $e) {
echo '失敗: ', $mail->ErrorInfo;
}
もし、初心者の方でどういう事なの???という事でありましたら、なんてことはありません。
現在mb_send_mail(***,***, …) などで設定されているメール送信の関数部分をコメントアウトしていただき、その代わりに上記の設定を丸ごと入れてあげればOKです。
あとは、今まで使っていたメールアドレスや本文などを格納した変数などあれば、適宜今回の設定に反映してあげてください。
これでGmailからの送信がSMTP経由となり、無事に受信できるかと思います。
今回、かなり把握して頂きやすいよう細かく紹介したつもりですが、もしわかりにくい部分などありましたらコメント頂けたらと思います。
Gmail送信問題が無事に解決されることを祈ります!!
0 件のコメント:
コメントを投稿