XAMPPを使ってローカル環境でWebアプリを開発している時、ある問題に遭遇しました。
それはPHPから mb_send_mail などを使ってメール送信できないという問題
例えば次のようなコードを書いた場合、常に false ( = 失敗)が返ってきます。
1 |
mb_send_mail( 'xxx@hoge.com', 'メールの送信テスト', 'こんにちは、メール本文です。' ); |
「メール送信のテストができないのは困ったな~」と思い、試行錯誤している内にこの問題を解決できる2つの方法を見つけました。
ここでは自分への忘備録も兼ね、メール送信できないときの解決策をまとめようと思います。
このページの目次
解決策1.XAMPPのメール設定を変更する
まず1つめの解決策は XAMPPのメール送信の設定を変更する こと
自分が実際に試した手順は次の通りです。
1.php.iniのメール機能設定を編集
まず初めに php.ini を開いてメール設定を変更しましょう。
XAMPPコントロールパネルからなら「Apache」ー>「Config」ー>「php.ini」をクリックすれば開けます。
もしWindows環境なら C:\xampp:\php\php.ini に直接アクセスして開いても可です。
そして php.ini を開いたらエディタで「mail function」で検索
すると [mail function] から始まるメール設定が書かれた箇所が見つかるので、次のように書き換え(ハイライトした部分が変更箇所)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[mail function] ; For Win32 only. ; http://php.net/smtp ;SMTP=localhost ; http://php.net/smtp-port ;smtp_port=25 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t" |
まず SMTP と smtp_port が有効になっているならコメントアウトし、 sendmail_path にsendmail.exeのあるファイルパスを指定すればOKです。
ちなみにXAMPPに sendmail.exe がない場合は次からダウンロード可
URL : https://www.glob.com.au/sendmail/
上のサイトから sendmail.zip をダウンロード・解凍し、xamppのインストール先の一番上にフォルダごと貼り付ければOKです。そのまま使えます。
2.sendmail.iniにメール送信元情報を追加
そうしたら次に sendmail.ini を編集していきます。
これは C:\xampp\sendmai 以下にあるので適当なエディタで開けばOK
開いたら sendmail.ini にテスト送信で使いたいメルアドを設定します。
その書き方をテンプレートで示すとするなら次のような感じ(【】内は各自の設定で置き換え)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
;smtp_server=mail.mydomain.com smtp_server=【サーバホスト名】 ;smtp_port=25 smtp_port=【ポート番号】 ; ここはautoが最適 smtp_ssl=auto ;auth_username= ;auth_password= auth_username=【送信元メールアドレス】 auth_password=【送信元メルアドのパスワード】 ;force_sender= force_sender=【送信元メールアドレス】 |
まず smtp_server にサーバーのホスト名を設定。これはGmailを使うなら smtp.gmail.com 、Yahooメールを使うなら smtp.mail.yahoo.co.jp のようになります。
次に smtp_port から適切なポート番号を指定
そして最後に auth_username と auth_password にメルアドとそのパスワードを設定すれば完了
ちなみに force_sender にも念のためにメルアドを設定しておくと良いみたいです。
一応 Gメール と Yahooメールを使う場合の設定例を載せておくと次の通り
Gメールを送信元に使う場合の sendmail.ini の書き方
例えば次が送信元に hoge@gmail.com というGメールを使う場合の sendmail.ini の書き方
1 2 3 4 5 6 7 8 9 10 |
smtp_server=smtp.gmail.com smtp_port=587 smtp_ssl=auto auth_username=hoge@gmail.com auth_password=【パスワード】 force_sender=hoge@gmail.com |
SMTPサーバーに smtp.gamil.com を使う場合はポート番号 587 を使う必要があります。(詳しくは公式マニュアルを参照)
あとはメルアドとパスワードを設定するだけ・・・なんですが実はGメールはセキュリティ上の理由でそのままのパスワードは使用不可です。
なので予め使用するGメールアドレスで二段階認証を有効にし、アプリパスワードを作成しておきましょう。詳しい作り方については次記事が参考になるはずです。
参考記事 : https://oxynotes.com/?p=5970
Gメールをメール送信テスト用に使うのは結構面倒ですね・・・
Yahooメールを送信元に使う場合の sendmail.ini の書き方
例えば次が送信元メルアドに hoge@yahoo.co.jp を使う場合の sendmail.ini の書き方
1 2 3 4 5 6 7 8 9 10 |
smtp_server=smtp.mail.yahoo.co.jp smtp_port=587 smtp_ssl=auto auth_username=hoge auth_password=【ヤフーメールのパスワード】 force_sender=hoge@yahoo.co.jp |
SMTPサーバー smtp.mail.yahoo.co.jp を使う場合、ポート番号は 587 になります。
また auth_username にはメルアド全体でなく、ユーザー名だけでOKです。(この例だと hoge のみ)
3.最後にXAMPPのapacheを再起動
ここまでの設定ができたらXAMPPコントロールパネルから「Apache」を再起動します。
▼「Apache」の横にある Stopボタン を押して再度 Startボタン を押せばおk
これでPHPからメール送信元として設定したメルアドから送信したメールが届くようになるはずです。
解決策2.メール送信ライブラリ(PHPMailer)を使う
もし上の手順を試してもメール送信でエラーが出て送れない・・・
そういう場合には メール送信用のライブラリを使う 、という手もあります。
PHPなら PHPMailer というライブラリが便利ですね。その導入手順と使い方は次の通りです。
まず次の GitHubページにアクセスし、PHPMailer をダウンロード
https://github.com/PHPMailer/PHPMailer
ダウンロードして解凍したら src という名前のディレクトリがあります。それをライブラリディレクトリなどにコピペして配置すればすぐに使用可能です。
例えば次がPHPMailerを使った簡単なメール送信のテストをしているコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
require '/lib/PHPMailer-master/Exception.php'; require '/lib/PHPMailer-master/PHPMailer.php'; require '/lib/PHPMailer-master/SMTP.php'; use PHPMailer\PHPMailer\PHPMailer; /** メールの送信テスト */ /// メーラーインスタンス作成 $mailer = new PHPMailer(); /// 文字コード $mailer->CharSet = 'UTF-8'; $mailer->Encoding = '7bit'; /// SMTPサーバーを利用する $mailer->IsSMTP(); $mailer->SMTPAuth = true; /// SMTPサーバー $mailer->Host = 'smtp.mail.yahoo.co.jp'; /// 送信元のユーザー名 $mailer->Username = 'tester'; /// 送信元のパスワード $mailer->Password = 'xxxxxxxx'; /// ポート番号 $mailer->Port = 587; /// 送信元メルアド $mailer->From = 'tester@yahoo.co.jp'; /// 送信者名 $mailer->FromName = 'テスト送信'; /// 送信先と件名・本文を設定してテスト送信 /// 送信先アドレス $mailer->addAddress( 'example@example.com' ); /// メール件名 $mailer->Subject = 'テスト送信'; /// メール本文 $mailer->Body = 'こんにちは、テスト送信です。'; /// メール送信 $result = $mailer->send(); if ( $result ) { print_r('送信成功!!'); } else { print_r('送信エラー'); /// エラー内容全出力 var_export($mailer->ErrorInfo); } |
上の例では送信元アドレスを tester@yahoo.co.jp 、送信先アドレスを example.@example.com にして送信テストを行っています。
SMTPサーバーとかポート番号の設定などは先ほどの sendmail.ini の内容に合わせれば問題ありません。
あと送信に失敗すると $mailer->ErrorInfo から詳細なエラー内容が確認できるのも便利ですね。
もし php.ini とか sendmail.ini をゴチャゴチャ編集したくない、という場合はPHPMailerなどのライブラリを使う方が楽だと思います。
XAMPP関連なら次の記事も役に立つかも
こういう風にXAMPPを使ってると結構頻繁に問題にぶち当たります。
なので、これ以外のトラブルやエラーについても次記事で色々まとめてみました。
100%解決できるとは限らないですが、手助けにはなるかもしれません。良ければご覧ください。
また本当に解決できないときは テラテイル(teratail) や Stack Overflow などで質問するのが最終手段です。
万策を尽くしてもダメだったときはそういう質問サイトを使うと貴重な時間を浪費しなくてすみます。(もちろん回答者の方も時間を使っているので、お礼を言うのも忘れずに!)
ここまでのまとめ
ということでXAMPP環境でメール送信できないときの解決策まとめ
- XAMPP設定を見直す
先で紹介したように php.ini から sendmail.exe へのパス、sendmail.ini で送信先メルアドの設定をしてあげればOK。ただし手順が少し(かなり?)面倒
- メール送信ライブラリを使う
個人的に使いやすいと思ったのは PHPMailer というライブラリ。エラー内容とかも細かく分かるのでこっちを使う方が便利かも
基本的にはこのどちらかを試せばメール送信できるようになるはずです。
以上、XAMPPでPHPからメール送信できない場合の対処法についてでした。ではでは($・・)/~~~