こんにちは朱夏です。
今回は、フォームからのメール送信テストが出来る環境を作っていきます。
ここまでMAMPを使って来たので、MAMPで何とかできないか試行錯誤しましたが、私のレベルでは解決できませんでした。
そこで、XAMPPを使用する事にしました。
先ずは以下のサイトを参考にXAMPPをインストールします。
次に、送信テストに使用するフォームを設置します。
前回作った問い合わせフォームを簡略化して使います。
作成したPHPファイルを以下に配置します。
画面表示の確認は以下のURLで確認できます。
これで、問い合わせフォーム側の準備は出来ました。
次に行きます。
続きはこちらのサイトを参考に作業しました。
編集が必要なファイルは以下の2つの様です。
念のため、それぞれコピーからバックアップを取っておきます。
※インストール先は<c:\>として説明していきます。
C:\xampp\sendmail\sendmail.ini > sendmail_bk.ini
php.iniの編集
参考サイトに記載のあった行がそもそも存在していない様です。
私の環境では[mail function]はこのような内容になっていました。
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 |
[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と書かれた行の下に追記しました。
1 2 |
; 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とパスワードは伏せています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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 /@>というもの、これが何を指しているのか、文字化けなのか、メールアドレスの取得に失敗しているのかといったところが謎です。
まだ問題解決していませんが、今回はここまでにします。
最後に現在のコードを置いておきます。
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
<?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> |
今回は以上です。