phpでシンプルなお問い合わせフォームを作る方法

Laravel/php

この記事では、phpでシンプルなお問い合わせフォームを作る方法について書いていきます。

お問い合わせフォーム

お問い合わせフォーム

サンプルコード

index.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>お問い合わせフォーム</title>
    <style>
        body {
            font-family: sans-serif;
            max-width: 500px;
            margin: 30px auto;
            padding: 0 20px;
        }
        .form-group {
            margin-bottom: 20px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .required {
            color: red;
            font-size: 0.85em;
            margin-left: 5px;
        }
        input[type="text"],
        input[type="email"],
        textarea {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
            box-sizing: border-box;
        }
        button {
            padding: 10px 20px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }
        button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>

    <h2>お問い合わせ</h2>

    <form action="process.php" method="POST">
        <div class="form-group">
            <label for="name">なまえ<span class="required">(必須)</span></label>
            <input type="text" id="name" name="name" required>
        </div>

        <div class="form-group">
            <label for="email">メールアドレス<span class="required">(必須)</span></label>
            <input type="email" id="email" name="email" required>
        </div>

        <div class="form-group">
            <label for="message">要件<span class="required">(必須)</span></label>
            <textarea id="message" name="message" rows="5" required></textarea>
        </div>

        <button type="submit">送信する</button>
    </form>

</body>
</html>

process.php

<?php
// POSTリクエスト以外で直接アクセスされた場合はフォーム画面(index.php)へリダイレクト
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    header("Location: index.php");
    exit;
}

// ----------------------------------------------------
// 設定項目
// ----------------------------------------------------
// 送信元(From)に使用する自サイトのメールアドレス
$admin_email = "info@yourdomain.com"; // ★ご自身のドメインのメールアドレスに変更してください

// ----------------------------------------------------
// 入力データの受け取りとトリム(前後の余白削除)
// ----------------------------------------------------
$name    = isset($_POST['name']) ? trim($_POST['name']) : '';
$email   = isset($_POST['email']) ? trim($_POST['email']) : '';
$message = isset($_POST['message']) ? trim($_POST['message']) : '';

$errors = [];

// ----------------------------------------------------
// バリデーション(入力チェック)
// ----------------------------------------------------
if ($name === '') {
    $errors[] = '「なまえ」を入力してください。';
}

if ($email === '') {
    $errors[] = '「メールアドレス」を入力してください。';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = '正しい「メールアドレス」の形式で入力してください。';
}

if ($message === '') {
    $errors[] = '「要件」を入力してください。';
}

// ----------------------------------------------------
// エラーがない場合、メール送信処理を実行
// ----------------------------------------------------
if (empty($errors)) {
    // 言語と文字コードの設定
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");

    // ------------------------------------------------
    // 1. 入力されたメールアドレス宛(自動返信メール)
    // ------------------------------------------------
    $user_subject = "【自動返信】お問い合わせありがとうございます";
    $user_body    = $name . " 様\n\n"
                  . "お問い合わせありがとうございます。\n"
                  . "以下の内容で受付いたしました。\n"
                  . "担当者より順次ご連絡いたしますので、今しばらくお待ちください。\n\n"
                  . "--------------------------------------------------\n"
                  . "【なまえ】\n" . $name . "\n\n"
                  . "【メールアドレス】\n" . $email . "\n\n"
                  . "【要件】\n" . $message . "\n"
                  . "--------------------------------------------------\n";

    // 【修正箇所: 68行目周辺】ユーザー宛ヘッダー
    $headers  = "From: " . $admin_email . "\r\n";
    $headers .= "Reply-To: " . $admin_email;

    // ユーザー宛にメール送信
    $user_mail_sent = mb_send_mail($email, $user_subject, $user_body, $headers);

    // ------------------------------------------------
    // 2. 管理者宛(通知メール)
    // ------------------------------------------------
    $admin_subject = "【お問い合わせ】" . $name . " 様より";
    $admin_body    = "Webサイトよりお問い合わせがありました。\n\n"
                   . "--------------------------------------------------\n"
                   . "【なまえ】\n" . $name . "\n\n"
                   . "【メールアドレス】\n" . $email . "\n\n"
                   . "【要件】\n" . $message . "\n"
                   . "--------------------------------------------------\n";

    // 【修正箇所: 86行目周辺】管理者宛ヘッダー
    $admin_headers  = "From: " . $admin_email . "\r\n";
    $admin_headers .= "Reply-To: " . $email; // 管理者が返信すると入力者に届く

    // 管理者宛にメール送信(送信元と同じアドレスに通知)
    $admin_mail_sent = mb_send_mail($admin_email, $admin_subject, $admin_body, $admin_headers);

    if (!$user_mail_sent) {
        $errors[] = '入力されたメールアドレスへの送信処理に失敗しました。アドレスに誤りがないかご確認ください。';
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>送信結果 - お問い合わせ</title>
    <style>
        body {
            font-family: sans-serif;
            max-width: 500px;
            margin: 30px auto;
            padding: 0 20px;
            line-height: 1.6;
        }
        .error-list {
            color: #d9534f;
            background-color: #f2dede;
            border: 1px solid #ebccd1;
            padding: 15px 15px 15px 35px;
            border-radius: 4px;
        }
        .success {
            background-color: #dff0d8;
            border: 1px solid #d6e9c6;
            color: #3c763d;
            padding: 15px;
            border-radius: 4px;
        }
        .detail-box {
            background-color: #f9f9f9;
            border: 1px solid #ddd;
            padding: 15px;
            margin-top: 15px;
            border-radius: 4px;
            color: #333;
        }
        .back-link {
            margin-top: 20px;
            display: inline-block;
            color: #007bff;
            text-decoration: none;
        }
        .back-link:hover {
            text-decoration: underline;
        }
    </style>
</head>
<body>

<?php if (!empty($errors)): ?>
    <h2>送信エラー</h2>
    <ul class="error-list">
        <?php foreach ($errors as $error): ?>
            <li><?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?></li>
        <?php endforeach; ?>
    </ul>
    <a href="javascript:history.back()" class="back-link">← 前の画面に戻る</a>

<?php else: ?>
    <h2>送信が完了しました</h2>
    <div class="success">
        お問い合わせを受け付けました。ご入力いただいたメールアドレス(<?php echo htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); ?>)宛に確認メールを送信いたしました。
    </div>

    <div class="detail-box">
        <p><strong>なまえ:</strong> <?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?></p>
        <p><strong>メールアドレス:</strong> <?php echo htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); ?></p>
        <p><strong>要件:</strong><br><?php echo nl2br(htmlspecialchars($message, ENT_QUOTES, 'UTF-8')); ?></p>
    </div>

    <a href="index.html" class="back-link">フォームへ戻る</a>
<?php endif; ?>

</body>
</html>

コードの解説

html

index.html

required

入力を必須項目にするためのものです。

php

process.php

if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    header("Location: index.php");
    exit;
}

if文で$_SERVER[“REQUEST_METHOD”] のスーパーグローバル変数を使い、POST通信以外(例えば直接アクセスされた場合など)はindex.phpにリダイレクトheader(“Location: ファイル名”)しexitプログラムを終了します。

$admin_email = "info@yourdomain.com"; 

whoisによるとinfo@yourdomain.comというメールアドレスが無償で提供されているのでありがたく使わせてもらいます。

それを変数$admin_emailに入れて後ほどメールを送信します。

$name    = isset($_POST['name']) ? trim($_POST['name']) : '';
$email   = isset($_POST['email']) ? trim($_POST['email']) : '';
$message = isset($_POST['message']) ? trim($_POST['message']) : '';

$errors = [];

前のindex.phpより送られてきた変数$name,$email,$messageにそれぞれisset(値がnullでないか確かめる関数)trim(空白を取り除く関数)を三項演算子を用いて代入しエラーがあれば$errors = [];に格納します。

if ($name === '') {
    $errors[] = '「なまえ」を入力してください。';
}

if ($email === '') {
    $errors[] = '「メールアドレス」を入力してください。';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = '正しい「メールアドレス」の形式で入力してください。';
}

if ($message === '') {
    $errors[] = '「要件」を入力してください。';
}

$name,$email,$messageそれぞれ空(null)でないか確認しエラーがあれば $errors[]に格納します。

また、(!filter_var($email, FILTER_VALIDATE_EMAIL)) でメールアドレスが正しいものか確認します。

filter_var 関数は、指定したフィルタを使って変数を検証(バリデーション)または無害化(サニタイズ)する関数です。

基本情報と使い方

  • 構文: filter_var(mixed $variable, int $filter = FILTER_DEFAULT, mixed $options = 0)
  • 第一引数 $variable: フィルタリングする値。
  • 第二引数 $filter: 適用するフィルタの種類(例: FILTER_VALIDATE_EMAIL, FILTER_VALIDATE_INT)。
  • 第三引数 $options: オプションの配列やフラグ(例: FILTER_NULL_ON_FAILURE)。
  • 戻り値: 成功時はフィルタリングされたデータ、失敗時は false(フラグにより null も可)。

主なフィルタの種類

  • 検証フィルタ (FILTER_VALIDATE_*):
    • FILTER_VALIDATE_EMAIL: メールアドレスとして正しいか検証します。
    • FILTER_VALIDATE_URL: URLとして正しいか検証します。
    • FILTER_VALIDATE_INT: 整数か検証します(範囲指定も可能)。
    • FILTER_VALIDATE_BOOLEAN: ブール値(真偽値)として判定します。
if (empty($errors)) {
    // 言語と文字コードの設定
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");

    // ------------------------------------------------
    // 1. 入力されたメールアドレス宛(自動返信メール)
    // ------------------------------------------------
    $user_subject = "【自動返信】お問い合わせありがとうございます";
    $user_body    = $name . " 様\n\n"
                  . "お問い合わせありがとうございます。\n"
                  . "以下の内容で受付いたしました。\n"
                  . "担当者より順次ご連絡いたしますので、今しばらくお待ちください。\n\n"
                  . "--------------------------------------------------\n"
                  . "【なまえ】\n" . $name . "\n\n"
                  . "【メールアドレス】\n" . $email . "\n\n"
                  . "【要件】\n" . $message . "\n"
                  . "--------------------------------------------------\n";

    // 【修正箇所: 68行目周辺】ユーザー宛ヘッダー
    $headers  = "From: " . $admin_email . "\r\n";
    $headers .= "Reply-To: " . $admin_email;

    // ユーザー宛にメール送信
    $user_mail_sent = mb_send_mail($email, $user_subject, $user_body, $headers);

    // ------------------------------------------------
    // 2. 管理者宛(通知メール)
    // ------------------------------------------------
    $admin_subject = "【お問い合わせ】" . $name . " 様より";
    $admin_body    = "Webサイトよりお問い合わせがありました。\n\n"
                   . "--------------------------------------------------\n"
                   . "【なまえ】\n" . $name . "\n\n"
                   . "【メールアドレス】\n" . $email . "\n\n"
                   . "【要件】\n" . $message . "\n"
                   . "--------------------------------------------------\n";

    // 【修正箇所: 86行目周辺】管理者宛ヘッダー
    $admin_headers  = "From: " . $admin_email . "\r\n";
    $admin_headers .= "Reply-To: " . $email; // 管理者が返信すると入力者に届く

    // 管理者宛にメール送信(送信元と同じアドレスに通知)
    $admin_mail_sent = mb_send_mail($admin_email, $admin_subject, $admin_body, $admin_headers);

    if (!$user_mail_sent) {
        $errors[] = '入力されたメールアドレスへの送信処理に失敗しました。アドレスに誤りがないかご確認ください。';
    }
}

最後に$errors[]に値がないか確認し、エラーがなければメールを送信します。

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