PHPフォームの送信処理(mb_send_mail関数)

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"