フォルダ構成
├── contact
│   ├── contact5.php
│   └── style.css
└── libs
    ├── .htaccesss
    ├── functions.php
    └── phpmailvars.php
└── php_mailer
    ├── composer.json
    ├── composer.lock
    └── vendor
        ├── autoload.php
        └── composer
contact5.php
<?php 
//PHPMailer 名前空間の使用(ファイル内の一番外側のスコープで行う)
//ブロック内のスコープではインポートできない
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

//PHPMailer の読み込み  Load Composer's autoloader
require '../php_mailer/vendor/autoload.php';

//エスケープ処理やデータチェックを行う関数のファイルの読み込み
require '../libs/functions.php';

//お問い合わせ日時を日本時間に
date_default_timezone_set('Asia/Tokyo'); 

//POSTされたデータを変数に格納
$name = isset( $_POST[ 'name' ] ) ? $_POST[ 'name' ] : NULL;
$email = isset( $_POST[ 'email' ] ) ? $_POST[ 'email' ] : NULL;
$email_check = isset( $_POST[ 'email_check' ] ) ? $_POST[ 'email_check' ] : NULL;
$tel = isset( $_POST[ 'tel' ] ) ? $_POST[ 'tel' ] : NULL;
$subject = isset( $_POST[ 'subject' ] ) ? $_POST[ 'subject' ] : NULL;
$body = isset( $_POST[ 'body' ] ) ? $_POST[ 'body' ] : NULL;

//POSTされたデータを整形(前後にあるホワイトスペースを削除)
$name = trim( $name );
$email = trim( $email );
$email_check = trim( $email_check );
$tel = trim( $tel );
$subject = trim( $subject );
$body = trim( $body );

if (isset($_POST['submitted'])) {

  //POSTされたデータをチェック  
  $_POST = checkInput( $_POST ); 

  //エラーメッセージを保存する配列の初期化
  $error = array();
  
  //値の検証
  if ( $name == '' ) {
    $error['name'] = '*お名前は必須項目です。';
    //制御文字でないことと文字数をチェック
  } else if ( preg_match( '/\A[[:^cntrl:]]{1,30}\z/u', $name ) == 0 ) {
    $error['name'] = '*お名前は30文字以内でお願いします。';
  }
  if ( $email == '' ) {
    $error['email'] = '*メールアドレスは必須です。';
  } else { //メールアドレスを正規表現でチェック
    $pattern = '/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/uiD';
    if ( !preg_match( $pattern, $email ) ) {
      $error['email'] = '*メールアドレスの形式が正しくありません。';
    }
  }
  if ( $email_check == '' ) {
    $error['email_check'] = '*確認用メールアドレスは必須です。';
  } else { //メールアドレスを正規表現でチェック
    if ( $email_check !== $email ) {
      $error['email_check'] = '*メールアドレスが一致しません。';
    }
  }
  if ( preg_match( '/\A[[:^cntrl:]]{0,30}\z/u', $tel ) == 0 ) {
    $error['tel'] = '*電話番号は30文字以内でお願いします。';
  }
  if ( $tel != '' && preg_match( '/\A\(?\d{2,5}\)?[-(\.\s]{0,2}\d{1,4}[-)\.\s]{0,2}\d{3,4}\z/u', $tel ) == 0 ) {
    $error['tel_format'] = '*電話番号の形式が正しくありません。';
  }
  if ( $subject == '' ) {
    $error['subject'] = '*件名は必須項目です。';
    //制御文字でないことと文字数をチェック
  } else if ( preg_match( '/\A[[:^cntrl:]]{1,100}\z/u', $subject ) == 0 ) {
    $error['subject'] = '*件名は100文字以内でお願いします。';
  }
  if ( $body == '' ) {
    $error['body'] = '*内容は必須項目です。';
    //制御文字(タブ、復帰、改行を除く)でないことと文字数をチェック
  } else if ( preg_match( '/\A[\r\n\t[:^cntrl:]]{1,1050}\z/u', $body ) == 0 ) {
    $error['body'] = '*内容は1000文字以内でお願いします。';
  }
  
  //エラーがなく且つ POST でのリクエストの場合
  if (empty($error) && $_SERVER['REQUEST_METHOD']==='POST') {
    
    //メール本文の組み立て
    $mail_body = 'コンタクトページからのお問い合わせ' . "\n\n";
    $mail_body .=  date("Y年m月d日 D H時i分") . "\n\n";
    $mail_body .=  "お名前: " .h($name) . "\n";
    $mail_body .=  "Email: " . h($email) . "\n"  ;
    $mail_body .=  "お電話番号: " . h($tel) . "\n\n" ;
    $mail_body .=  "<お問い合わせ内容>" . "\n" . h($body);

    //--------PHPMailer------------
    
    //メールアカウント情報(パスワード等)の読み込み PHPMailer用
    require '../libs/phpmailvars.php';

    //mbstring の日本語設定
    mb_language( "japanese" );
    mb_internal_encoding( "UTF-8" );

    //PHPMailer のインスタンスを生成 Instantiation and passing `true` enables exceptions
    $mail = new PHPMailer( true );

    //送信結果の真偽値の初期化
    $result = false;
    $result2 = false;

    try {
      //サーバ設定
      //$mail->SMTPDebug = SMTP::DEBUG_SERVER; // デバグの出力を有効に
      $mail->isSMTP(); // SMTP を使用
      $mail->Host = MAIL_HOST; // SMTP サーバーを指定(phpmailvars.phpで定義)
      $mail->SMTPAuth = true; // SMTP authentication を有効に
      $mail->Username = MAIL_USER; // SMTP ユーザ名(phpmailvars.phpで定義)
      $mail->Password = MAIL_PASSWORD; // SMTP パスワード(phpmailvars.phpで定義)
      $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS を有効に
      $mail->Port = 587; // TCP ポートを指定(TLS の場合のポート番号)

      //日本語用
      $mail->CharSet = "iso-2022-jp";
      $mail->Encoding = "7bit";

      //Recipients
      $mail->setFrom( $email, mb_encode_mimeheader( $name ) ); //差出人アドレス, 差出人名 
      $mail->AddAddress(SEND_TO, mb_encode_mimeheader(SEND_TO_NAME)); //送信先アドレス・宛先名(phpmailvars.phpで定義)
      $mail->AddBcc( BCC ); //Bcc アドレス(phpmailvars.phpで定義) 

      $mail->isHTML( false ); // Set email format to plain text
      $mail->Subject = mb_encode_mimeheader( $subject ); //件名
      $mail->WordWrap = 70; //70 文字で改行(好みで)

      $mail->Body = mb_convert_encoding( $mail_body, "JIS", "UTF-8" );
      //$mail->AltBody = mb_convert_encoding($mail_body,"JIS","UTF-8"); //テキスト表示の本文

      //メール送信の結果(真偽値)を $result に代入
      $result = $mail->send();


    } catch ( Exception $e ) {
      //PHPMailer のエラーメッセージ
      //echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }

    //メール送信の結果判定
    if ( $result ) {

      //自動返信メール
      $autoresponder = new PHPMailer( true );
      try {
        //サーバ設定
        //$autoresponder->SMTPDebug = SMTP::DEBUG_SERVER; // デバグの出力を有効に
        $autoresponder->isSMTP(); // SMTP を使用
        $autoresponder->Host = MAIL_HOST; // SMTP サーバーを指定(phpmailvars.phpで定義)
        $autoresponder->SMTPAuth = true; // SMTP authentication を有効に
        $autoresponder->Username = MAIL_USER; // SMTP ユーザ名(phpmailvars.phpで定義)
        $autoresponder->Password = MAIL_PASSWORD; // SMTP パスワード(phpmailvars.phpで定義)
        $autoresponder->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; //TLS を有効に
        $autoresponder->Port = 587; // TCP ポートを指定 

        //日本語用
        $autoresponder->CharSet = "iso-2022-jp";
        $autoresponder->Encoding = "7bit";

        //Recipients
        $autoresponder->setFrom( AR_SEND_FROM, mb_encode_mimeheader( AR_SEND_FROM_NAME ) ); //差出人アドレス, 差出人名 
        $autoresponder->AddAddress( $email, mb_encode_mimeheader( $name ) ); //送信先・宛先(phpmailvars.phpで定義) 

        $autoresponder->isHTML( false ); // Set email format to plain text
        $autoresponder->Subject = mb_encode_mimeheader( "自動返信メール" ); //件名
        //返信用アドレス(差出人以外に別途指定する場合)
        $autoresponder->addReplyTo( MAIL_USER, mb_encode_mimeheader("お問い合わせ")); 
        $autoresponder->WordWrap = 70; //70 文字で改行(好みで)
        $ar_body = $name." 様\n\n";
        $ar_body .= "この度は、お問い合わせ頂き誠にありがとうございます。" . "\n\n";
        $ar_body .= "下記の内容でお問い合わせを受け付けました。\n\n";
        $ar_body .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n";
        $ar_body .= "お名前:" . $name . "\n";
        $ar_body .= "メールアドレス:" . $email . "\n";
        $ar_body .= "お電話番号: " . $tel . "\n\n" ;
        $ar_body .="<お問い合わせ内容>" . "\n" . $body;
        $autoresponder->Body = mb_convert_encoding( $ar_body, "JIS", "UTF-8" );
        
        //自動送信メールの送信結果(真偽値)を result2 に代入
        $result2 = $autoresponder->send();        
        
      } catch ( Exception $e ) {
        //PHPMailer のエラーメッセージ
        //echo "Auto Response Message could not be sent. Mailer Error: {$autoresponder->ErrorInfo}";
      }
      
      //空の配列を代入し、すべてのPOST変数を消去
      $_POST = array(); 
      //変数の値も初期化
      $name = '';
      $email = '';
      $email_check = '';
      $tel = '';
      $subject = '';
      $body = '';
      
      $params = '?result='. $result .'&result2=' . $result2;
      $url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; 
      header('Location:' . $url . $params);
      exit;
    } 
  }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>コンタクトフォーム</title>
<link href="../bootstrap.min.css" rel="stylesheet">
<link href="style.css" rel="stylesheet">
</head>
<body>
<div class="container">
  <h2 class="">お問い合わせフォーム</h2>
  <?php  if ( isset($_GET['result']) && $_GET['result'] ) : ?>
  <h4>送信完了!</h4>
  <p>送信完了いたしました。</p>
  <?php  if ( isset($_GET['result2']) && $_GET['result2'] ) : ?>
  <p>確認の自動返信メールをお送りいたしました。</p>
  <?php elseif (isset($_GET['result2']) && !$_GET['result2']): ?>
  <p>確認の自動返信メールが送信できませんでした。</p>
  <?php endif; ?>
  <hr>
  <?php elseif (isset($result) && !$result ): ?>
  <h4>送信失敗</h4>
  <p>申し訳ございませんが、送信に失敗しました。</p>
  <p>しばらくしてもう一度お試しになるか、メールにてご連絡ください。</p>
  <p>メール:<a href="mailto:info@example.com">Contact</a></p>
  <hr>
  <?php endif; ?>
  <p>以下のフォームからお問い合わせください。</p>
  <form id="form" method="post">
    <div class="form-group">
      <label for="name">お名前(必須) 
        <span class="error"><?php if ( isset( $error['name'] ) ) echo h( $error['name'] ); ?></span>
      </label>
      <input type="text" class="form-control validate max50 required" id="name" name="name" placeholder="氏名" value="<?php echo h($name); ?>">
    </div>
    <div class="form-group">
      <label for="email">Email(必須) 
        <span class="error"><?php if ( isset( $error['email'] ) ) echo h( $error['email'] ); ?></span>
      </label>
      <input type="text" class="form-control validate mail required" id="email" name="email" placeholder="Email アドレス" value="<?php echo h($email); ?>">
    </div>
    <div class="form-group">
      <label for="email_check">Email(確認用 必須) 
        <span class="error"><?php if ( isset( $error['email_check'] ) ) echo h( $error['email_check'] ); ?></span>
      </label>
      <input type="text" class="form-control validate email_check required" id="email_check" name="email_check" placeholder="Email アドレス(確認のためもう一度ご入力ください。)" value="<?php echo h($email_check); ?>">
    </div>
    <div class="form-group">
      <label for="tel">お電話番号(半角英数字) 
        <span class="error"><?php if ( isset( $error['tel'] ) ) echo h( $error['tel'] ); ?></span>
        <span class="error"><?php if ( isset( $error['tel_format'] ) ) echo '<br>'. h( $error['tel_format'] ); ?></span>
      </label>
      <input type="text" class="validate max30 tel form-control" id="tel" name="tel" value="<?php echo h($tel); ?>" placeholder="お電話番号(半角英数字でご入力ください)">
    </div>
    <div class="form-group">
      <label for="subject">件名(必須) 
        <span class="error"><?php if ( isset( $error['subject'] ) ) echo h( $error['subject'] ); ?></span> 
      </label>
      <input type="text" class="form-control validate max100 required" id="subject" name="subject" placeholder="件名" value="<?php echo h($subject); ?>">
    </div>
    <div class="form-group">
      <label for="body">お問い合わせ内容(必須) 
        <span class="error"><?php if ( isset( $error['body'] ) ) echo h( $error['body'] ); ?></span>
      </label>
      <span id="count"> </span>/1000
      <textarea class="form-control validate max1000 required" id="body" name="body" placeholder="お問い合わせ内容(1000文字まで)をお書きください" rows="3"><?php echo h($body); ?></textarea>
    </div>
    <button name="submitted" type="submit" class="btn btn-primary">送信</button>
  </form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<script>
jQuery(function($){
  
  function show_error(message, this$) {
    text = this$.parent().find('label').text() + message;
    this$.parent().append("<p class='error'>" + text + "</p>")
  }
  
  $("form#form").submit(function(){  
    //エラー表示の初期化
    $("p.error").remove();
    $("div").removeClass("error");
    var text = "";
    $("#errorDispaly").remove();
    
    //メールアドレスの検証
    var email =  $.trim($("#email").val());
    if(email && !(/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/gi).test(email)){
      $("#email").after("<p class='error'>メールアドレスの形式が異なります</p>")
    }
    //確認用メールアドレスの検証
    var email_check =  $.trim($("#email_check").val());
    if(email_check && email_check != $.trim($("input[name="+$("#email_check").attr("name").replace(/^(.+)_check$/, "$1")+"]").val())){
      show_error("が一致しません", $("#email_check"));
    }
    //電話番号の検証
    var tel = $.trim($("#tel").val());
    if(tel && !(/^\(?\d{2,5}\)?[-(\.\s]{0,2}\d{1,4}[-)\.\s]{0,2}\d{3,4}$/gi).test(tel)){
      $("#tel").after("<p class='error'>電話番号の形式が異なります(半角英数字でご入力ください)</p>")
    }
    
    //1行テキスト入力フォームとテキストエリアの検証
    $(":text,textarea").filter(".validate").each(function(){
      
      $(this).filter(".required").each(function(){
        if($(this).val()==""){
          show_error(" は必須項目です", $(this));
        }
      })
        
      //文字数の検証
      $(this).filter(".max30").each(function(){
        if($(this).val().length > 30){
          show_error(" は30文字以内です", $(this));
        }
      })
      $(this).filter(".max50").each(function(){
        if($(this).val().length > 50){
          show_error(" は50文字以内です", $(this));
        }
      })
      //文字数の検証
      $(this).filter(".max100").each(function(){
        if($(this).val().length > 100){
          show_error(" は100文字以内です", $(this));
        }
      })
      //文字数の検証
      $(this).filter(".max1000").each(function(){
        if($(this).val().length > 1000){
          show_error(" は1000文字以内でお願いします", $(this));
        }
      })
    })
    //error クラスの追加の処理
    if($("p.error").length > 0){
      $("p.error").parent().addClass("error");
      $('html,body').animate({ scrollTop: $("p.error:first").offset().top-180 }, 'slow');
      return false;
    }
  }) //ここまでが submit イベントを使った検証
  //テキストエリアに入力された文字数を表示
  $("textarea").on('keydown keyup change', function() {
    var count = $(this).val().length;
    $("#count").text(count);
    if(count > 1000) {
      $("#count").css({color: 'red', fontWeight: 'bold'});
    }else{
      $("#count").css({color: '#333', fontWeight: 'normal'});
    }
  });
})
</script>
</body>
</html>
functions.php
<?php
//エスケープ処理を行う関数
function h($var) {
  if(is_array($var)){
    //$varが配列の場合、h()関数をそれぞれの要素について呼び出す(再帰)
    return array_map('h', $var);
  }else{
    return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
  }
}

//入力値に不正なデータがないかなどをチェックする関数
function checkInput($var){
  if(is_array($var)){
    return array_map('checkInput', $var);
  }else{
    //NULLバイト攻撃対策
    if(preg_match('/\0/', $var)){  
      die('不正な入力です。');
    }
    //文字エンコードのチェック
    if(!mb_check_encoding($var, 'UTF-8')){ 
      die('不正な入力です。');
    }
    //改行、タブ以外の制御文字のチェック
    if(preg_match('/\A[\r\n\t[:^cntrl:]]*\z/u', $var) === 0){  
      die('不正な入力です。制御文字は使用できません。');
    }
    return $var;
  }
}
phpmailvars.php
<?php
//SMTP サーバー(サーバーの場合:localhost でも可)
define('MAIL_HOST', 'mail.xxxxxx.com');
 
//PHPMailer を使って送信するための E-mail アカウント
define('MAIL_USER', 'xxxxx@xxxxxxx.com');
 
//パスワード
define('MAIL_PASSWORD', 'xxxxxxxxxx');
 
//送信先
define('SEND_TO', 'xxxx@xxxxxx.com');
 
//送信先の名前
define('SEND_TO_NAME', '送信先名前');
 
//Bcc アドレス
define('BCC', 'xxxx@xxxxxx.com');
 
//自動返信をする場合の送信元アドレス
define('AR_SEND_FROM', 'xxxx@xxxxxxxx.com');
 
//自動返信をする場合の送信元名前
define('AR_SEND_FROM_NAME', '自動返信送信元名前');
.htaccess
deny from all
style.css
@charset "utf-8";
.container {
  width: 100%;
  max-width: 760px;
  margin: 50px auto;
}
/* input 要素 */
#name, #email, #subject, #email_check, #tel {
  max-width:400px;
}
#body {
  max-width: 640px;
}
/* エラー表示 */
p.error, span.error {
  color: red;
}
/* フォーム要素(Bootstrap4 のスタイルを上書き) */
.form-control {
  border-radius: 0px;
  background-color: #fdfdfd;
  font-size: 14px;
}
.form-control:focus {
  border-color: #aadbe8;
  outline: 0;
  -webkit-box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.4);
  box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.4);
  background-color:#fff;
}
/* Google Chrome, Safari, Opera 15+, Android, iOS */
::-webkit-input-placeholder {
  font-size: 13px; 
}
/* Firefox 18- */
:-moz-placeholder {
  font-size: 13px; }
/* Firefox 19+ */
::-moz-placeholder {
  font-size: 13px; }
/* IE 10+ */
:-ms-input-placeholder {
  font-size: 13px; }
::placeholder{ 
  font-size: 13px;
}
textarea.form-control {
  height: 200px;
}
#send {
  margin-top: 30px;
}
/* この他に Bootstrap4 のCSSも読み込む */