【問題解決】メールフォームの送信テストが失敗する件 その1

HTML
スポンサーリンク

こんにちは朱夏です。

今回は、フォームからのメール送信テストが出来る環境を作っていきます。
ここまでMAMPを使って来たので、MAMPで何とかできないか試行錯誤しましたが、私のレベルでは解決できませんでした。
そこで、XAMPPを使用する事にしました。

 

XAMPPのセットアップ

先ずは以下のサイトを参考にXAMPPをインストールします。

 

テスト環境準備

次に、送信テストに使用するフォームを設置します。
前回作った問い合わせフォームを簡略化して使います。
作成したPHPファイルを以下に配置します。

配置先
<インストール先>\xampp\htdocs
例)C:\xampp\htdocs ※デフォルト設定の場合、こちらになります。

 

画面表示の確認は以下のURLで確認できます。

URL:http://localhost/<表示したいファイルのパス>

※htdocsディレクトリ直下に配置したindexファイルを表示したい場合は、
~localhostまででOKです。

 

これで、問い合わせフォーム側の準備は出来ました。
次に行きます。

.iniファイルの編集

続きはこちらのサイトを参考に作業しました。

編集が必要なファイルは以下の2つの様です。
念のため、それぞれコピーからバックアップを取っておきます。
※インストール先は<c:\>として説明していきます。

C:\xampp\php\php.ini > php_bk.ini
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を使用して検証しています。

 

編集後の状態がこちらになります。
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

エラー内容は以下のようなものでした。

Message is missing sender’s address

送信者アドレスが正常に取得出来ていない様です。
これに関しては回避方法が2つありました。

  1. sendmail.iniの”force_sender”に送信者アドレスを指定する
  2. 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つ問題が解決しましたが、次のエラーが出ています。

The recipient address </bb/bbr /@> is not a valid RFC-5321 address. z30sm8534697pff.131 – gsmtp

受信者のアドレスが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>



 

今回は以上です。

タイトルとURLをコピーしました