ローカルに入れた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(プログラム通りのメールが受信できた)
メールを送るプログラムを書くときは、
注意が必要です。