"北海道", "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" => "海外", "99" => "非公開", ); //------------------------------------------------ // 各種設定 $form_html = "form.html"; // 入力フォームのファイル名 $confirm_html = "confirm.html"; // 確認画面のファイル名 $finish_html = "finish.html"; // 終了画面のファイル名 $mail_sys = "info@whatever.co.jp"; // 管理者のメールアドレス $from_name = "ファットエヴァー"; // メール送信者の表示 $from_mail = "info@whatever.co.jp"; // メール送信者のメールアドレス(返信先) $user_mail = "item2"; // 利用者にメールを送る場合のメールアドレス項目 // ユーザー向け $subject = "お問い合わせ受け付けました。\n"; $body = "お問い合わせありがとう御座います。\r\nご記入いただいた内容に応じまして、担当者よりご連絡させて頂きます。\r\n\n"; // 管理者向け $subject_sys = "ホームページからお問い合わせがありました。\n"; $body_sys = "ホームページの問い合わせフォームより\r\n問い合わせがありました。\r\n内容を確認の上、返信して下さい。\n"; // メール本文後ろ $footer = "\n有限会社 ファットエヴァー\r\n〒396-0621\r\n長野県伊那市富県3429番5\r\nTEL 0265-76-5137 FAX 0265-76-5159"; //------------------------------------------------ // magic_quotes_gpc対策(PHP 8以降では削除済み) if (legacyMagicQuotesGpc()) { $_REQUEST = safeStripSlashes($_REQUEST); } $form_input = array( "item1" => array("title" => "お名前", "name" => "item1", "func" => "2", "require" => "1", "check" => "1",), "item2" => array("title" => "メールアドレス", "name" => "item2", "func" => "2", "require" => "1", "check" => "3",), "item3" => array("title" => "電話番号", "name" => "item3", "func" => "2", "require" => "", "check" => "1",), "item4" => array("title" => "ご住所(都道府県)", "name" => "item4", "func" => "5", "require" => "", "check" => "1", "list" => array( "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" => "沖縄県", ) ), "item5" => array("title" => "ご住所(市区町村以下)", "name" => "item5", "func" => "2", "require" => "", "check" => "1",), "item6" => array("title" => "お問い合わせ項目", "name" => "item6", "func" => "4", "require" => "1", "check" => "1", "list" => array( "1" => "解体工事について", "2" => "リフォーム、外構エクステリア工事について", "3" => "廃棄物・資源回収等について", "4" => "その他のお問い合わせ", ) ), "item7" => array("title" => "お問い合わせ内容", "name" => "item7", "func" => "7", "require" => "1", "check" => "1",), ); // CSRF対策:入力→確認、確認→送信、戻る、すべてのPOSTで照合する if ($_SERVER['REQUEST_METHOD'] === 'POST') { $posted_csrf_token = isset($_POST['csrf_token']) ? (string)$_POST['csrf_token'] : ''; $session_csrf_token = isset($_SESSION['csrf_token']) ? (string)$_SESSION['csrf_token'] : ''; if ( $posted_csrf_token === '' || $session_csrf_token === '' || !hash_equals($session_csrf_token, $posted_csrf_token) ) { http_response_code(403); exit( '送信エラー' . '

不正なリクエストです。フォーム画面から再度お試しください。

' ); } } // 入力値の取得 $msg = array(); $mail = array(); $mail_value = array(); $mail_field = array(); $mail_title = array(); foreach ($form_input as $val) { $value = 0; if ($val["func"] == 6) { if (is_array($_REQUEST[$val["name"]])) { foreach ($_REQUEST[$val["name"]] as $k => $v) { $form[$val["name"]][$k] = htmlspecialchars($v); if ($v) { $value = 1; } } } else { $form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]); if ($form[$val["name"]]) { foreach ($form[$val["name"]] as $v) { if ($v != "") { $value = 1; } } } } } else if ($val["func"] == 10) { $form[$val["name"] . "_pref"] = htmlspecialchars($_REQUEST[$val["name"] . "_pref"]); $form[$val["name"] . "_address"] = htmlspecialchars($_REQUEST[$val["name"] . "_address"]); if ($form[$val["name"] . "_pref"] && $form[$val["name"] . "_address"]) { $value = 1; } } else if ($val["func"] == 11) { $form[$val["name"] . "_year"] = htmlspecialchars($_REQUEST[$val["name"] . "_year"]); $form[$val["name"] . "_month"] = htmlspecialchars($_REQUEST[$val["name"] . "_month"]); $form[$val["name"] . "_day"] = htmlspecialchars($_REQUEST[$val["name"] . "_day"]); if ($form[$val["name"] . "_year"] && $form[$val["name"] . "_month"] && $form[$val["name"] . "_day"]) { $value = 1; } } else if ($val["func"] == 12) { $form[$val["name"] . "_month"] = htmlspecialchars($_REQUEST[$val["name"] . "_month"]); $form[$val["name"] . "_day"] = htmlspecialchars($_REQUEST[$val["name"] . "_day"]); if ($form[$val["name"] . "_month"] && $form[$val["name"] . "_day"]) { $value = 1; } } else if ($val["func"] == 13) { if ($_FILES[$val["name"]]["name"]) { $handle = fopen($_FILES[$val["name"]]["tmp_name"], 'r'); $attachFile = fread($handle, filesize($_FILES[$val["name"]]["tmp_name"])); fclose($handle); $attachEncode = base64_encode($attachFile); $form[$val["name"] . "_value"] = $attachEncode; $form[$val["name"] . "_file"] = $_FILES[$val["name"]]["name"]; $form[$val["name"] . "_type"] = $_FILES[$val["name"]]["type"]; $value = 1; } else if ($_REQUEST[$val["name"] . "_value"]) { $form[$val["name"] . "_value"] = $_REQUEST[$val["name"] . "_value"]; $form[$val["name"] . "_file"] = $_REQUEST[$val["name"] . "_file"]; $form[$val["name"] . "_type"] = $_REQUEST[$val["name"] . "_type"]; $value = 1; } } else { if (is_array($_REQUEST[$val["name"]])) { foreach ($_REQUEST[$val["name"]] as $k => $v) { $form[$val["name"]][$k] = htmlspecialchars($v); if ($v) { $value = 1; } } } else { $form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]); if ($form[$val["name"]]) { $value = 1; } } } // 入力のチェック if (($_REQUEST["mode"] == "form") || ($_REQUEST["mode"] == "confirm")) { if ($val["require"] && ($value == 0)) { $msg[$val["name"]] = $val["title"] . "が入力されていません。"; } if ($val["check"] && $value) { if ($val["check"] == 2) { if (!preg_match("/^[0-9\-]+$/", $form[$val["name"]])) { $msg[$val["name"]] = $val["title"] . "が正しくありません"; } } if (($val["check"] == 3) || ($val["check"] == 4)) { if (!filter_var($form[$val["name"]], FILTER_VALIDATE_EMAIL)) { $msg[$val["name"]] = $val["title"] . "が正しくありません"; } else { $mail_value[] = $form[$val["name"]]; $mail_field[] = $val["name"]; $mail_title[] = $val["title"]; } } if ($val["check"] == 5) { if (!preg_match("/^(http|https):\/\/[0-9a-zA-Z_\.\-\/]+$/", $form[$val["name"]])) { $msg[$val["name"]] = $val["title"] . "が正しくありません"; } } } } } // メール一致チェック if (count($mail_value) == 2) { if ($mail_value[0] != $mail_value[1]) { $msg[$mail_field[0]] = $mail_title[0] . "が一致していません"; $msg[$mail_field[1]] = $mail_title[0] . "が一致していません"; } } if (!$_REQUEST["mode"]) { $mode = "form"; } else if ($_REQUEST["mode"] == "reinput") { $mode = "form"; } else if ($_REQUEST["mode"] != "confirm") { if ($msg) { $mode = "form"; } else { $mode = "confirm"; } } else if ($msg) { $mode = "form"; } else { // ============================================ // ★ reCAPTCHA v3 検証(メール送信前) // ============================================ $recaptcha_secret = recaptchaSecret(); $recaptcha_token = $_POST['recaptcha_token'] ?? ''; if ($recaptcha_secret === '') { error_log('reCAPTCHA secret is not configured.'); echo '

送信設定に問題があります。お手数ですが時間をおいて再度お試しください。

'; exit; } if (empty($recaptcha_token)) { echo '

送信エラーが発生しました。お手数ですが再度お試しください。

'; exit; } $rc_response = file_get_contents( 'https://www.google.com/recaptcha/api/siteverify', false, stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n", 'content' => http_build_query([ 'secret' => $recaptcha_secret, 'response' => $recaptcha_token, 'remoteip' => $_SERVER['REMOTE_ADDR'], ]), 'timeout' => 10, ], ]) ); if ($rc_response === false) { error_log('reCAPTCHA verification request failed.'); echo '

送信エラーが発生しました。お手数ですが時間をおいて再度お試しください。

'; exit; } $rc_result = json_decode($rc_response, true); if ( !isset($rc_result['success'], $rc_result['score'], $rc_result['action']) || $rc_result['success'] !== true || $rc_result['score'] < RECAPTCHA_THRESHOLD || $rc_result['action'] !== 'mail' // confirm.htmlのaction名と合わせる ) { echo '

ボットと判定されたため送信できませんでした。
お手数ですが再度お試しください。

'; exit; } // ============================================ // ★ reCAPTCHA 検証ここまで // ============================================ // メールの送信 foreach ($form_input as $key => $val) { if ($val["func"] == 13) { $mail_body .= "●" . $val["title"] . ":" . $form[$val["name"] . "_file"] . "\n"; } else if ($val["func"] == 10) { $mail_body .= "●" . $val["title"] . ":" . $pref_list[$form[$val["name"] . "_pref"]] . $form[$val["name"] . "_address"] . "\n"; } else if ($val["func"] == 11) { $mail_body .= "●" . $val["title"] . ":" . $form[$val["name"] . "_year"] . "年" . $form[$val["name"] . "_month"] . "月" . $form[$val["name"] . "_day"] . "日\n"; } else if ($val["func"] == 12) { $mail_body .= "●" . $val["title"] . ":" . $form[$val["name"] . "_month"] . "月" . $form[$val["name"] . "_day"] . "日\n"; } else if ($val["func"] == 3) { $mail_body .= "●" . $val["title"] . ":" . $form_input[$val["name"]]["list"][$form[$val["name"]]] . "\n"; } else if ($val["func"] == 4) { if ($form[$val["name"]]) { $ary = array(); foreach ($form[$val["name"]] as $val2) { $ary[] = $form_input[$val["name"]]["list"][$val2]; } $mail_body .= "●" . $val["title"] . ":" . implode("、", $ary) . "\n"; } } else if ($val["func"] == 5) { $mail_body .= "●" . $val["title"] . ":" . $form_input[$val["name"]]["list"][$form[$val["name"]]] . "\n"; } else if ($val["func"] == 6) { $mail_body .= "●" . $val["title"] . ":\n"; foreach ($form_input[$val["name"]]["list"] as $key => $val2) { $mail_body .= " " . $val2 . ":" . $form[$val["name"]][$key] . "\n"; } } else { $mail_body .= "●" . $val["title"] . ":" . $form[$val["name"]] . "\n"; } } $mail_body .= $footer; $attach = array(); foreach ($form_input as $val) { if ($val["func"] == 13) { if ($_REQUEST[$val["name"] . "_value"]) { $attach[] = array( "filebody" => $_REQUEST[$val["name"] . "_value"], "filename" => $_REQUEST[$val["name"] . "_file"], "filetype" => $_REQUEST[$val["name"] . "_type"]); } } } // ★ 管理者用にIPアドレスを追加 $mail_body_sys = $mail_body . "\n●送信者IPアドレス:" . $_SERVER['REMOTE_ADDR']; if ($mail_sys) { // 管理者向け(IPあり) sendmail($from_mail, $mail_sys, $subject_sys, $body_sys . $mail_body_sys, $attach, $from_name); } if (isset($user_mail) && $_REQUEST[$user_mail]) { // 利用者向け(IPなし) sendmail($from_mail, $_REQUEST[$user_mail], $subject, $body . $mail_body, $attach, $from_name); } // CSRF対策:送信済みの確認画面からの再送信を防ぐ unset($_SESSION['csrf_token']); $mode = "finish"; } // HTML出力 if ($mode == "confirm") { include($confirm_html); } else if ($mode == "finish") { include($finish_html); } else { include($form_html); } /* * メール送信処理 */ function sendmail($mail_from, $mail_to, $mail_subject, $body, $attach, $from_name = null) { $mail_from = trim($mail_from); $mail_to = trim($mail_to); $mail_subject = trim($mail_subject); $body = html_entity_decode(trim($body)); $from_name = trim($from_name); if ($from_name) { $header = "From: "; $header .= (MAIL_ENCODING == "UTF8") ? '=?utf-8?B?' : '=?iso-2022-jp?B?'; $header .= base64_encode(mb_convert_encoding($from_name, MAIL_ENCODING, SCRIPT_ENCODING)) . '?= <' . $mail_from . ">"; } else { $header = "From: " . $mail_from; } if ($attach) { $uniq_id = uniqid('boundary'); $header .= "\r\nMIME-Version: 1.0"; $header .= "\r\nContent-Type: multipart/mixed; boundary=\"" . $uniq_id . "\"\r\n"; $mailMessage = $body; $body = "--" . $uniq_id . "\r\n"; $body .= (MAIL_ENCODING == "UTF8") ? "Content-Type: text/plain; charset=\"UTF-8\"\r\n" : "Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n"; $body .= "\r\n"; $body .= $mailMessage . "\r\n"; foreach ($attach as $val) { $body .= "--" . $uniq_id . "\r\n"; $body .= "Content-Type: {$val['filetype']}; name=\"{$val['filename']}\"\r\n"; $body .= "Content-Transfer-Encoding: base64\r\n"; $body .= "Content-Disposition: attachment; filename=\"{$val['filename']}\"\r\n\r\n"; $body .= chunk_split($val['filebody']) . "\r\n"; } $body .= "--" . $uniq_id . "--\r\n"; } else { $header .= (MAIL_ENCODING == "UTF8") ? "\r\nContent-Type: text/plain;\r\n\tformat=flowed;\r\n\tcharset=\"utf-8\";\r\n\treply-type=original" : "\r\nContent-Type: text/plain;\r\n\tcharset=\"iso-2022-jp\"\r\nContent-Transfer-Encoding: 7bit"; } $subject_str = ''; while ($mail_subject) { if ($subject_str) { $subject_str .= "\r\n\t"; } $chunk = (mb_strlen($mail_subject, SCRIPT_ENCODING) < 20) ? $mail_subject : mb_substr($mail_subject, 0, 20, SCRIPT_ENCODING); $subject_str .= (MAIL_ENCODING == "UTF8") ? '=?utf-8?B?' : '=?iso-2022-jp?B?'; $subject_str .= base64_encode(mb_convert_encoding($chunk, MAIL_ENCODING, SCRIPT_ENCODING)) . '?='; $mail_subject = (mb_strlen($mail_subject, SCRIPT_ENCODING) < 20) ? '' : mb_substr($mail_subject, 20, mb_strlen($mail_subject, SCRIPT_ENCODING) - 20, SCRIPT_ENCODING); } $body = str_replace("\r", "", $body); $header = str_replace("\r", "", $header); return @mail($mail_to, $subject_str, mb_convert_encoding($body, MAIL_ENCODING, SCRIPT_ENCODING), $header); } function safeStripSlashes($var) { if (is_array($var)) { return array_map('safeStripSlashes', $var); } else { if (legacyMagicQuotesGpc()) { $var = stripslashes($var); } return $var; } } function legacyMagicQuotesGpc() { return function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); } function recaptchaSecret() { $secret = getenv('RECAPTCHA_SECRET'); if (!$secret && isset($_SERVER['RECAPTCHA_SECRET'])) { $secret = $_SERVER['RECAPTCHA_SECRET']; } if (!$secret) { $secret_file = __DIR__ . '/recaptcha_secret.php'; if (is_readable($secret_file)) { $secret = include $secret_file; } } return $secret ? trim($secret) : ''; } function value($key) { if (is_array($_REQUEST[$key])) { return join(",", $_REQUEST[$key]); } return $_REQUEST[$key]; } ?>