[PHP] メールの設定

ローカルに入れたWordPressをいじろうとして、
管理者でログインしようとしたら、

パスワードが思い出せないw

管理者とかユーザーのアカウント・パスワードって、
データベースに保存されてると思うんですが、
それで確認しようとしたところ、

MariaDB [wpdb]> select * from wp_users\G
*************************** 1. row ***************************
                 ID: 1
         user_login: [管理者ユーザー名]
          user_pass: $P$BwgLfXwj4sbvXyFfUssNgIUw2GnI/J.
      user_nicename: [管理者ユーザー名]
         user_email: [メールアドレス]
           user_url:
~(以下略)~

ハッシュで保存されてるので、
確認することができないんですよね。

ということで、

これに頼ります。

登録してるメールアドレスにリンクとかを送って、
パスワードの変更をするやつですね。多分。

これで、メールアドレスを入力して、
「新しいパスワードを取得」を押したんですが、

「メールを送信できませんでした。
 ホスティングサービス上で mail() 関数が無効になっている可能性があります。」

と出てきました。

それもそのはず。
PHPでメールの設定なんてしたことないですからね。

というわけで、
メールの設定をして、送れるようにしたい。

php.iniの設定

https://www.javadrive.jp/php/mailini/index1.html

↑を参考に設定。
Yahoo!メールを設定しようと思います。

Yahoo!メールの設定値は、
Yahoo!メールヘルプを参照。

[mail function]
; For Win32 only.
SMTP=smtp.mail.yahoo.co.jp
smtp_port=465

; For Win32 only.
sendmail_from = [自分のメールアドレス]

ここまで設定しましたが、
これだけでいいの?

SMTP-AUTHのユーザー名とか、パスワードとか、
設定してないんですけど・・・

その設定方法がわからないので、
試しにここまでの設定で動作を確認してみます。

Apacheを再起動して、

↑↑↑と同様に「新しいパスワードを取得」を実行し、
同じくエラーが出るんですが、
その間のパケットをキャプチャ。

TCPの3ウェイハンドシェークは成功してるけど、
そのあと何もしてなくて、
20秒後にサーバーからリセットされてますね。

一方、普段使ってるメーラーで送信するときの
パケットをキャプチャしてみると、

3ウェイハンドシェークの後すぐに、
TLSのセッション張りに行ってますね。

なので、多分、
ユーザー名とパスワードの設定以前に、
TLSを使ったSMTP通信を有効にする必要があるはず。

独習PHPを見ると、
“mb_send_mail”関数の解説のところで、
メール関係の設定が載ってた。

それを参考に、下記のように設定。

・php.ini

[mail function]
...
sendmail_path = "\"C:\pg\xampp\sendmail\sendmail.exe\" -t" (Windows環境の場合の書き方)
...
(中略)
...
mbstring.language = Japanese (コメントアウト外す)

・sendmail.ini
[sendmail]
smtp_server=smtp.mail.yahoo.co.jp
smtp_port=465
...
auth_username=[自分のyahooユーザー名]
auth_password=[パスワード]
...
...
force_sender=[自分のメールアドレス]

「sendmail」というソフトを使うように設定する。
&「sendmail」でメールサーバーへの認証情報等を設定する。

この 「sendmail」はXAMPPのパッケージに入ってた。
無い場合は、下記からダウンロードすればいいみたい。
https://www.glob.com.au/sendmail/

Apache再起動して、
再度、「新しいパスワードを取得」を実行。
→ダメ、同様のエラーが出る

キャプチャを見ると、
TLSのセッションは張って、
何度か”Application Data”のやり取りはしてるが、
最後、”Encripted Alert”っていうのが出て終了してる。

独習PHPのサンプルプログラムを
少し改造したプログラムでやってみても失敗。
(「メール送信に失敗しました」が出る)

Apacheのエラーログには何も出てない。

sendmailのエラーログもあるみたい。
https://techacademy.jp/magazine/4129

これを見ると、

18/12/09 15:17:55 : authorization failed (#5.7.0)

つまり、ユーザー名かパスワードが違うんじゃないの?
→よくよく見たらユーザー名違ってるw

修正して再度トライ(サンプル)
→OK(「メール送信に成功しました」が出る)

送ったメールを見てみると、
「Failure Notice」っていうタイトルのメールが来てる。

WordPressの方は、→成功。
「[WordPressのサイト名] パスワードのリセット」
というタイトルのメールが届いている。

そのメールに書いてるリンクからパスワードをリセット
→パスワード変更してログインに成功

つまり、メールの設定自体はうまくいってて、
サンプルプログラム自身に何か問題があると。
一旦置いといて、先に進みます。(原因は後述↓↓)

じゃあ、php.iniの設定は必要か?
(SMTP, smtp_port, sendmail_from)
これら3つを元に戻してやってみる
→メール送信成功

sendmail.exeを使うときは、
↑の3つは変更する必要がないと。

まとめ

・php.iniで”sendmail_path”でsendmailのパスを指定
・(日本語のメールを送る場合は、”mbstring.language”も設定)
・sendmail.iniでメールサーバの情報や認証情報を設定

sendmailを使わずに、phpの設定だけでできる方法もあるらしい。
https://teratail.com/questions/67864

気が向いたらやってみます。

●サンプルプログラムで送信失敗した理由

「Failure Notice」メール内
“554 Message not allowed”
https://www.yahoo-help.jp/app/answers/detail/a_id/80870/p/622

「お客様が送信したメール内に、セキュリティー上Yahoo!メールでは受け付けられない内容が含まれている可能性があります。」
らしい。

改めてプログラムを見直してみると。
・・・問題個所がわからん。

他の送信成功したメールを保存して、ソースで見たものと、
「Failure Notice」に書かれてるメールの内容を見比べる。
→Fromヘッダーの記載
 ”From”と”:”の間に半角スペースが入ってる

試しに、サンプルプログラム中の”From :”のスペース消してやってみる

修正前
$headers  = "From : [メールアドレス]\n";
...
mb_send_mail($to, $subject, $body, $headers)

修正後
$headers  = "From: [メールアドレス]\n";
...
mb_send_mail($to, $subject, $body, $headers)

→OK(プログラム通りのメールが受信できた)

メールを送るプログラムを書くときは、
注意が必要です。

独習PHP 第3版

カテゴリーphp

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です