confilm.phpのHTML/CSS/PHPを作成後、最後の送信処理のプログラムを作成します。php-contact/ フォルダの中にsend.phpを作成します。send.phpは処理を行うプログラムですので表示はしません。
send.phpの作成
<?php
// 日本語メールを扱うときのおまじない
mb_language('Japanese');
mb_internal_encoding('UTF-8');
// 不正アクセス防止:POST以外は form.php に戻す
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: form.php');
exit;
}
// サイト情報(変更する)
$site_name = 'サイトの名前';
$to_admin = 'admin@example.com';
$from_addr = 'no-reply@example.com';
// 件名
$subject_adm = "【お問い合わせ】{$site_name}";
$subject_usr = "【自動返信】{$site_name} へのお問い合わせありがとうございます";
// フォームからの値を取得
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$tel = trim($_POST['tel'] ?? '');
$message = trim($_POST['message'] ?? '');
$gender = $_POST['gender'] ?? '';
$agree = $_POST['agree'] ?? '';
$company = trim($_POST['company'] ?? '');
// スパムボット対策:ハニーポットが埋まっていたら中止
if ($company !== '') {
header('Location: form.php');
exit;
}
// お問い合わせの日時
$datetime = date('Y-m-d H:i:s');
// 管理者宛の本文
$body_admin = <<<EOT
{$site_name}にお問い合わせが届きました。
日時:{$datetime}
氏名:{$name}
メール:{$email}
電話:{$tel}
性別:{$gender}
--- お問い合わせ内容 ---
{$message}
EOT;
// ユーザー宛の本文
$body_user = <<<EOT
このメールは {$site_name} からの自動返信です。
以下の内容でお問い合わせを受け付けました。
日時:{$datetime}
氏名:{$name}
メール:{$email}
電話:{$tel}
性別:{$gender}
--- お問い合わせ内容 ---
{$message}
※本メールに心当たりがない場合は、このまま破棄してください。
EOT;
// 管理者宛メールヘッダー
$headers_admin = [];
$headers_admin[] = "From: {$site_name} <{$from_addr}>";
$headers_admin[] = "Reply-To: {$email}";
$headers_admin[] = "X-Mailer: PHP/" . phpversion();
$headers_admin_str = implode("\r\n", $headers_admin);
// ----------------------------
// デバッグ:var_dumpで確認
// ----------------------------
$result_admin = mb_send_mail($to_admin, $subject_adm, $body_admin, $headers_admin_str, "-f {$from_addr}");
var_dump($result_admin);
if ($email !== '') {
$headers_user = "From: {$site_name} <{$from_addr}>";
$result_user = mb_send_mail($email, $subject_usr, $body_user, $headers_user, "-f {$from_addr}");
var_dump($result_user);
}
// ----------------------------
// 最後に thanks.php にリダイレクト
// ----------------------------
header('Location: thanks.php');
exit;
コードの補足
mb_language('Japanese'); / mb_internal_encoding('UTF-8');
- 日本語メールを扱うときのおまじない。
mb_language('Japanese')
→ メール送信で日本語を使うことを指定。mb_internal_encoding('UTF-8')
→ 内部文字コードを UTF-8 に指定。文字化けを防ぐため。
date('Y-m-d H:i:s');
- PHPの 日付関数。
'Y-m-d H:i:s'はフォーマット指定(例:2025-08-27 15:30:45 のような形)。- お問い合わせが届いた「日時」を記録するのに利用。
ヒアドキュメント(<<<EOT ... EOT;)
- 複数行の文字列をまとめて書くための構文。
<<<EOTで始め、EOT;で終える。- 中に書いた改行や変数がそのまま展開される。
$body = <<<TEXT
これは1行目
これは2行目
変数の値:{$name}
TEXT;
通常の文字列リテラル(”…” や ‘…’)と比べて、ヒアドキュメントは長文のメール本文などに便利です
implode(区切り文字, 配列)
- 配列の要素を 区切り文字でつないで、ひとつの文字列にする関数。
- 今回は
"\r\n"(改行コード)でつないでいる。 $headers_adminには「From」「Reply-To」「X-Mailer」などメールヘッダが配列で入っている。- これを改行でつなげて1本の文字列にして、
mb_send_mail()に渡す必要がある。
"\r\n"エスケープシーケンス一覧表
| エスケープ文字 | 意味 | 説明・用途例 |
|---|---|---|
\n | 改行(LF) | UnixやmacOSなどで使われる改行コード |
\r | 復帰(CR) | 古いMac OS(~OS 9)で使われていた改行 |
\r\n | 改行+復帰(CR+LF) | Windows環境での改行コード(メールにも多い) |
\t | タブ | 水平方向のタブ文字(インデントなどに) |
\\ | バックスラッシュ \ | バックスラッシュそのものを出力したいとき |
\" | ダブルクォート " | 文字列内で ” を使いたいとき |
\' | シングルクォート ' | 文字列内で ‘ を使いたいとき |
mb_send_mail() 関数とは?
PHPで日本語メール(マルチバイト文字)を正しく送信するための関数です。
通常の mail() 関数では、日本語が文字化けしやすいため、日本語サイトでは mb_send_mail() を使用します。
mb_send_mail(
string $to, // 宛先のメールアドレス
string $subject, // メールの件名
string $body, // メール本文(テキスト)
string $additional_headers = "", // 任意のヘッダー(From, Reply-Toなど)
string $additional_parameter = "" // 任意の追加パラメータ(Return-Pathなど)
): bool
戻り値:送信成功で true、失敗で false
| 引数名 | 内容と補足 |
|---|---|
$to_admin | 宛先メールアドレス(例:admin@example.com) |
$subject_adm | メールの件名。UTF-8の日本語を含めてもOK(内部で自動エンコード) |
$body_admin | メール本文(改行・日本語も含めてOK)。ヒアドキュメント構文が便利 |
$headers_admin | 追加のヘッダー情報(From, Reply-To, X-Mailerなどを\r\nで区切って渡す) |
-f {$from_addr} | エラー時の**Return-Path(MAILER-DAEMONなどの通知先)**を指定。 迷惑メール扱いを避けるのに有効 |
"-f {$from_addr}"
- メールが送信失敗になったときに届く「エラーメール(バウンスメール)」の返送先。
- 通常
From:ヘッダーとは異なり、SMTPレベルの送信元アドレスを明示できます。 - 迷惑メール防止・スパムフィルタ回避にも役立ちます。
よく使われるヘッダーの例
$headers = [];
$headers[] = "From: サイト名 <no-reply@example.com>";
$headers[] = "Reply-To: {$email}"; // ユーザーの入力したメールアドレス
$headers[] = "X-Mailer: PHP/" . phpversion();
$headers_str = implode("\r\n", $headers);
- From:送信元として表示される名前とアドレス
- Reply-To:返信ボタンを押した時の宛先
- X-Mailer:使われたソフトウェア情報(任意)
注意:ローカル環境(XAMPP)ではメールは送信されません
実際に送信するには、サーバーの設定や外部SMTPが必要です。
参考までに、XAMPPの php.ini では以下の部分を確認します。
実際に送信するには本番サーバーの環境で試してみてください。
[mail function] ; Windows の場合 SMTP = smtp.example.com smtp_port = 587 sendmail_from = no-reply@example.com
Linux/Mac の場合は sendmail_path を設定します
; Mac/Linux の例 sendmail_path = "/usr/sbin/sendmail -t -i"
