どうも、白夜霧(@KiRi_Byakuya)です。
今回は、xamppで構築したローカル環境から、PHPでメールを送信する方法の覚書です。
誰かの参考になれば幸いですm(_ _)m
目次
開発環境 / xamppのローカル開発環境でメールを送信する方法
本記事では、下記の環境で確認しています。
- Windows 11 Home
- XAMPP(Apache + MySQL + PHP)
本記事ではWindows環境を前提としています。
準備するもの / xamppのローカル環境でメールを送信する方法
必要なモノ
- xamppがインストールされている環境
- 送信用のメールアドレス
XAMPP(ザンプ)については、下記記事を参考にして下さい。
【2022年版】Windowsに『XAMPP』をインストールする方法と最低限の設定【無料】
Windowsに「XAMPP」をインストールするための手順と最低限の設定の覚書。
続きを見る
なお、本記事では送信用のメールアドレスに「Gmail」を使用します。
Yahoo!メールやOutlookなど、その他フリーのメールアドレスを利用する場合は、設定内容が微妙に異なるので注意して下さい。
xamppのローカル環境でメールを送信する方法と手順
設定ファイル(.ini)を編集するので、xamppは停止状態でOK。
ステップ1:Googleのアプリ用パスワードを発行する。
Gmailを使用する場合、使用するGmailのアカウント側で「アプリ用パスワード」を発行する必要があります。
また、このパスワードの発行は、Googleアカウントの「2段階認証を有効」にしないと設定できません。
昔は2段階認証に関係なくできたらしいですが、今は2段階認証有効が必須みたい。
とりあえず、二段階認証が無効になっている人は、Googleアカウントページの「セキュリティ」から有効にして下さい。
有効にすると、下記のようになりパスワードの発行が可能になります。
パスワードの発行は、同じくアカウントページの「セキュリティ」→「Googleへのログイン」→「アプリパスワード」をクリック。
「アプリを選択」と「デバイスを選択」して、生成を押せばパスワードが発行されます。
生成されたパスワードが表示されたら、必ず何らかの形で保存して下さい。
後からパスワードを再確認する方法はない?みたいなので要注意
- 「アプリを選択」と「デバイスを選択」はあくまで『任意の名前』用なので、適当でいいっぽい。
- 生成したパスワードの削除、及び再作成はすぐにできるのでご安心を。
私は「アプリを選択」で「その他」→「xampp」と入力してパスワードを生成しました。
ステップ2:xampp側の設定を変更する
「php.ini」を編集して、設定を変更します。※Apacheは停止して下さい。
php.iniは各OSによって保存場所が異なります。※下記はxamppのデフォルト設定
OS | ファイルの位置 |
---|---|
Windows | C:\xampp\php\php.ini |
Mac | /Applications/XAMPP/xamppfiles/etc/php.ini |
Linux | /opt/lampp/etc/php.ini |
「php.ini」の1085行目あたりにある [mail function] の『sendmail_from』と『sendmail_path』を下記のように変更して保存。
; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = "hogehoge@gmail.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"
さらに詳しく
詳細は「PHPマニュアル メール関連の実行時設定」を参照
- sendmail_from:SMTP 経由で直接送信されるメールにおいて "From:" に使用するメールアドレスを指定します(Windows環境のみ)。
- sendmail_path:sendmail プログラムを探すパスを指定します。
sendmailのコマンドラインオプション(-t -i)については下記を参照。
コマンドラインオプションの付け方に注意
php.iniの設定でコメントを頂きました。『sendmail_path』の設定で上記のやり方ではうまくいかない場合があるみたいです。Gmailでうまく動かない場合は試してみて下さい。
php.iniのところ
sendmail_path = “C:\xampp\sendmail\sendmail.exe -t”だと私の環境では動きませんでした。localhost/send_mail.phpでアクセスしてブラウザには「メールを送信しました。」と出ますが、Gmailは届きませんでした。《解決策》
他のサイトで紹介されているように-tオプションを付ける場合は以下のようにしないとダメみたいですね。sendmail_path=”\”C:\xampp\sendmail\sendmail.exe\” -t”
「”C:\xampp\sendmail\sendmail.exe”」の部分の両端のダブルクォートを文字として認識させる必要があるので「\”」でエスケープしてるんだと思います。
私の場合、パスのダブルクォートの部分は気にしないでもGmailで動いている。なんで?
追記:2023/10/21
上記の理由をコメントにて教えて頂きました。有難うございますm(_ _)m
パスをダブルクォーテーションで囲うのは、パスの中に半角スペースや2バイト文字があるとうまく動作しないものがあるからです。(特にsendmailのような古くから開発が継続しているものや海外製のもの)
※例えば「C:\xampp 1\」のように半角スペースをつけたフォルダにインストールすると
「C:\xampp」
「1\sendmail\sendmail.exe」
「-t」
のように、スペースで分割されるので動作しない。※2バイト文字の場合、2バイト目にエスケープシーケンスである「¥」を含んでいるものがある為。
なので2バイト文字の場合、動作する場合と動作しない場合があります。恐らくこれらが原因だと思います。
次に「sendmail.ini」を変更します。ファイルの場所はWindowsの場合「C:\xampp\sendmail\sendmail.ini」。
「sendmail.ini」を開き、各設定を変更して保存。※下記はGmail向けの設定です。
;Gmail
smtp_server=smtp.gmail.com
smtp_port=587
smtp_ssl=auto
auth_username=hogehoge@gmail.com
auth_password=hogehogehogehogehoge
「auth_username」は、送信用のメールアドレス。「auth_password」は、ステップ1で発行したアプリ用のパスワードです。
各メールサービスごとの設定は、各ヘルプ記事を確認して下さい。
サービス名 | リンク先 |
---|---|
Gmail | POP を使用して他のメール クライアントで Gmail のメールを読む |
Yahoo!メール | メールソフトで送受信するには(Yahoo!メールアドレス、@ymail.ne.jpアドレスの場合) |
Outlook | Outlook.com の POP、IMAP、および SMTP の設定 |
「サービス名 + smtp」で検索すれば、大体の情報は出てきます。
ステップ3:サンプルプログラムで実際にメールを送信する
xamppのapatchを起動し、ドキュメントルートに下記を記述したPHPファイルを作成。
<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to = "send_to_address@gmail.com"; // 送信先のアドレス
$subject = "テスト送信"; // 件名
$message = "ただいまメールのテスト中です。"; // 本文
$additional_headers = ""; // ヘッダーオプション
if(mb_send_mail($to, $subject, $message, $additional_headers))
{
print "メールを送信しました。";
}
else
{
print "メール送信に失敗しました。";
}
メールを送信する関数「mb_send_mail」については下記を参照。
上記サンプルでは「Fromヘッダ」は省略しています(※php.iniでデフォルト値を設定しているため)。詳細は「additional_headers(オプション)」を参照。
上記PHPファイルをブラウザ経由で実行して「メールを送信しました。」が表示されれば、メールの送信が成功です。
受信したメールはこんな感じ。
CCやBCCの追加方法
「additional_headers」に下記のように追加すれば、CCやBCCを追加可能です。
<?php
// From:のみ ※CC & BCCなし
$additional_headers = "From: hogehoge@gmail.com";
// CCあり
$additional_headers = "From: hogehoge@gmail.com\r\nCc: cc@example.com";
// CC + BCCあり
$additional_headers = "From: hogehoge@gmail.com\r\nCc: cc@example.com\r\nBcc: bcc@example.com";
以上、有難うございましたm(_ _)m
参考になったらポッチとお願いしますm(_ _)m