こんにちは朱夏です。
今回は、フォームからのメール送信テストが出来る環境を作っていきます。
ここまでMAMPを使って来たので、MAMPで何とかできないか試行錯誤しましたが、私のレベルでは解決できませんでした。
そこで、XAMPPを使用する事にしました。
先ずは以下のサイトを参考にXAMPPをインストールします。
次に、送信テストに使用するフォームを設置します。
前回作った問い合わせフォームを簡略化して使います。
作成したPHPファイルを以下に配置します。
画面表示の確認は以下のURLで確認できます。
これで、問い合わせフォーム側の準備は出来ました。
次に行きます。
続きはこちらのサイトを参考に作業しました。
編集が必要なファイルは以下の2つの様です。
念のため、それぞれコピーからバックアップを取っておきます。
※インストール先は<c:\>として説明していきます。
C:\xampp\sendmail\sendmail.ini > sendmail_bk.ini
php.iniの編集
参考サイトに記載のあった行がそもそも存在していない様です。
私の環境では[mail function]はこのような内容になっていました。
[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 = ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of ; the 5th parameter to mail(). ;mail.force_extra_parameters = ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename mail.add_x_header=Off ; The path to a log file that will log all mail() calls. Log entries include ; the full path of the script, line number, To address and headers. ;mail.log = ; Log mail to syslog (Event Log on Windows). ;mail.log = syslog
存在していないものはどうしようもないので、以下をsmtp_port=25と書かれた行の下に追記しました。
; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder) sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
これでphp.iniの編集は終了です。
sendmail.iniの編集
こちらも編集していきます。
編集後の状態がこちらになります。
gmailのIDとパスワードは伏せています。
[sendmail] smtp_server=smtp.gmail.com smtp_port=587 smtp_ssl=auto error_logfile=error.log auth_username=*****@gmail.com auth_password=password pop3_server= pop3_username= pop3_password= force_sender= force_recipient= hostname=
gmailの場合は送信側(smtp)の設定だけで問題ない様です。
使用するメールサービスによって送信側(pop)の設定も必要になるみたいですね。
ここで、XAMPPの再起動を実施します。
送信テストを実施してみたところ、うまく送られていない様子。
送信成功か失敗かをページに表示する様にコードを書き換えました。
また、原因調査のため、エラーログを確認することにしました。
- C:\xampp\sendmail\error.log
エラー内容は以下のようなものでした。
送信者アドレスが正常に取得出来ていない様です。
これに関しては回避方法が2つありました。
- sendmail.iniの”force_sender”に送信者アドレスを指定する
- index.phpの$header情報を修正する
今後の事を考えると2の方で対応可能にしておかないと不便な気がするので、どの様に書けば認識してくれるのかを調べました。
検証1
- Fromのみ指定した場合 > 成功
この場合はエラーメッセージを回避する事が出来ました。
しかし、新たなエラーとぶつかることになるのですが・・・
一先ずは今回のエラーを回避する方法を探していきます。
検証2
- \r\nを使う(¥はバックスラッシュ) > 失敗
この方法では、From以外を指定した場合はエラーが出ました。
因みに、初期の状態では、前回のままだったので\nが付いていました。
検証3
- arrayで指定してみる > 成功
この検証で成功しました。
MIME-Version、From、Reply-Toの3つともヘッダー要素として取り込めた様です。
CRLF(\r\nを使う方法)だと、使用するメールサービスなどによって\nのみにする必要があるなど、安定して使えないので、arrayで指定するのが良い様ですね。
1つ問題が解決しましたが、次のエラーが出ています。
受信者のアドレスがRFC-5321に違反しているといった内容のメッセージの様です。
また懐かしいエラーですね・・・
しかし、受信者のアドレスとされている</bb/bbr /@>というもの、これが何を指しているのか、文字化けなのか、メールアドレスの取得に失敗しているのかといったところが謎です。
まだ問題解決していませんが、今回はここまでにします。
最後に現在のコードを置いておきます。
<?php // 入力確認部分をコメントアウト // var_dump($_POST); // 変数の初期化 $page_flag = 0; // 日本語設定 mb_language('ja'); mb_internal_encoding('UTF-8'); if( !empty($_POST['btn_confirm']) ) { $page_flag = 1; } elseif( !empty($_POST['btn_submit']) ) { $page_flag = 2; // メール送信 // データ初期化 $header = null; $auto_reply_subject = null; $auto_reply_text = null; $admin_reply_subject = null; $admin_reply_text = null; date_default_timezone_set('Asia/Tokyo'); // ヘッダー情報初期化 $auto_header = [ "MIME-Version" => "1.0", "From" => "xxxxx@gmail.com", "Reply-To" => "xxxxx@gmail.com" ]; // 件名 $auto_reply_subject = 'お問い合わせありがとうございます。'; // 本文 $auto_reply_text = "お問い合わせいただき、ありがとうございます。下記の内容でお問い合わせを受け付けいたしました。(このメールは自動返信で送信しております。回答までしばらくお待ちください。)\n\n"; $auto_reply_text .= "受付日時:" . date("Y-m-d H:i") . "\n"; $auto_reply_text .= "メールアドレス:" . $_POST['mailaddress'] . "\n\n"; $auto_reply_text .= "お問い合わせ内容:" . $_POST['inquiry'] . "\n\n"; $auto_reply_text .= "○○事務局"; // 送信 if(mb_send_mail( $_POST['mailaddress'], $auto_reply_subject, $auto_reply_text, $auto_header)) { echo "送信成功"; }else{ echo "送信失敗"; }; // 自分で受け取るメール // 件名 $admin_reply_subject = "お問い合わせを受け付けました"; // 本文 $admin_reply_text = "お問い合わせを受信しました。\n\n"; $admin_reply_text .= "受付日時:" . date("Y-m-d H:i") . "\n"; $admin_reply_text .= "メールアドレス:" . $_POST['mailaddress'] . "\n"; $admin_reply_text .= "お問い合わせ内容:" . $_POST['inquiry'] . "\n\n"; $admin_reply_text .= "○○事務局"; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>問い合わせフォーム</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link rel="stylesheet" href="css/style.css"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/da0fa6be04.js" crossorigin="anonymous"></script> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script> <![endif]--> <script src="js/sample.js"></script> </head> <body> <!-- 問い合わせフォーム --> <div class="container"> <h3>問い合わせフォーム</h3> <?php if( $page_flag === 1 ): ?> <!-- page_flagが1の時確認ページ --> <form method="post" action=""> <!-- メールアドレス --> <label class="mt-2 mb-0">メールアドレス</label> <div class="form-row align-items-center"> <div class="col-auto"> <p><?php echo $_POST['mailaddress']; ?></p> </div> </div> <!-- メールアドレスここまで --> <!-- 問い合わせ内容 --> <label class="mt-2 mb-0">お問い合わせ内容</label> <div class="form-row align-items-center"> <div class="col-auto"> <p><?php echo $_POST['inquiry']; ?></p> </div> </div> <!-- 問い合わせ内容ここまで --> <!-- ボタン --> <div class="form-row mt-2"> <div class="col-auto"> <button type="submit" name="btn_back" class="btn btn-secondary" value="戻る">戻る</button> <button type="submit" name="btn_submit" class="btn btn-primary" value="送信">送信</button> </div> </div> <!-- ボタンここまで --> <!-- 隠し情報 --> <input type="hidden" name="mailaddress" value="<?php echo $_post['mailaddress'];?>"> <input type="hidden" name="inquiry" value="<?php echo $_post['inquiry'];?>"> <!-- 隠し情報ここまで --> </form> <!-- page_flagが1の時確認ページここまで --> <!-- page_flagが2の完了ページ --> <?php elseif( $page_flag === 2): ?> <p class="text-center">送信が完了しました。</p> <form action=""> <div class="form-row mt-2"> <div class="col-auto"> <button type="submit" name="btn_back" class="btn btn-secondary" value="戻る">戻る</button> </div> </div> </form> <!-- page_flagが2の完了ページここまで --> <?php else: ?> <!-- page_flagが0の入力ページ --> <form method="post" action=""> <!-- メールアドレス --> <label class="mt-2 mb-0">メールアドレス</label> <div class="form-row align-items-center"> <div class="col-auto"> <input type="email" name="mailaddress" class="form-control" id="exampleInputEmail1" placeholder="sample@email.co.jp"> </div> </div> <!-- メールアドレスここまで --> <!-- 問い合わせ内容 --> <label class="mt-2 mb-0">お問い合わせ内容</label> <div class="form-row align-items-center"> <div class="col-auto"> <textarea class="form-control" name="inquiry" id="exampleFormControlTextarea1" cols="100" rows="10" placeholder="問い合わせ内容を入力してください"></textarea> </div> </div> <!-- 問い合わせ内容ここまで --> <!-- 確認ボタン --> <div class="mt-2"> <button type="submit" name="btn_confirm" class="btn btn-primary" value="内容確認へ">確認</button> </div> <!-- 確認ボタンここまで --> </form> <!-- page_flagが0の入力ページここまで --> </div> <!-- 問い合わせフォームここまで --> <?php endif; ?> </body> </html>
今回は以上です。