フロントエンド 2025.12.26

問い合わせフォームが届かない原因TOP5と確実な対処法

約11分で読めます

せっかく問い合わせがあっても届かなければ機会損失。20年の制作実績から見えた根本原因と、技術者目線での確実な解決方法を解説します。

「問い合わせが来ているはずなのに届かない」その深刻度、理解していますか?

「Webサイトをリニューアルしたのに問い合わせが減った」「お客様から『送ったのに返事がない』と電話があった」

こんな経験はありませんか?問い合わせフォームの不具合は、気づかぬうちに大きな機会損失を生んでいます。実際に、私たちFivenine Designが過去に対応した案件でも、フォーム修正後に月間問い合わせ数が3倍に増えたケースがありました。

今回は、20年以上のWeb制作実績から見えてきた「問い合わせが届かない原因TOP5」と、その確実な対処法をお伝えします。

原因1位:メールサーバーの設定不備(全体の40%)

実際にあったケース

あるクライアント様から「問い合わせフォームを設置したが、一通も届かない」という相談がありました。調査すると、Webサーバーとメールサーバーが異なるホスティング会社にあり、送信設定が適切でなかったのです。

技術的な解決方法

PHPのmail()関数を使用している場合、以下の設定を確認してください:

// 基本的なメール送信(推奨しない方法)
mail($to, $subject, $body, $headers);

// より確実なSMTP認証を使った送信(推奨)
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'your-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

結果: 上記の修正により、そのクライアント様は翌月から月10件の問い合わせを安定して受け取れるようになりました。

よくある失敗

レンタルサーバーの管理画面で「メール機能は有効」と表示されていても、実際にはSPFレコードやDKIM設定が不完全で、相手サーバーに拒否される場合があります。

原因2位:スパムフィルターによる誤判定(全体の25%)

実案件での発見

製造業のクライアント様で「海外からの問い合わせが届かない」という問題がありました。調査の結果、フォームの件名が「Inquiry」という単語のみで、スパムフィルターに引っかかっていることが判明しました。

対策コード例

// 問題のあるパターン
$subject = "Inquiry";

// 改善後のパターン
$company_name = "株式会社○○";
$timestamp = date('Y-m-d H:i');
$subject = "[{$company_name}] お問い合わせ - {$timestamp}";

// さらに、送信者情報も適切に設定
$headers = [
    'From: [email protected]',
    'Reply-To: [email protected]',
    'X-Mailer: PHP/' . phpversion(),
    'Content-Type: text/plain; charset=UTF-8'
];

結果: 件名とヘッダーを改善後、海外からの問い合わせも確実に届くようになり、海外売上が前年比150%に向上しました。

原因3位:JavaScriptエラーによる送信失敗(全体の20%)

Next.jsでの実装例と注意点

最近増えているのが、モダンなフレームワークでの実装ミスです。特にNext.jsのプロジェクトで見かける問題を紹介します。

// よくある問題のあるコード
const handleSubmit = async (e) => {
  e.preventDefault();
  fetch('/api/contact', {
    method: 'POST',
    body: JSON.stringify(formData)
  })
  // エラーハンドリングがない!
};

// 改善版
const handleSubmit = async (e) => {
  e.preventDefault();
  setIsSubmitting(true);
  
  try {
    const response = await fetch('/api/contact', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(formData)
    });
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    const result = await response.json();
    setMessage('送信が完了しました');
    
  } catch (error) {
    console.error('送信エラー:', error);
    setMessage('送信に失敗しました。もう一度お試しください。');
  } finally {
    setIsSubmitting(false);
  }
};

この対策の重要性

ユーザーは送信ボタンを押して画面が変わらないと「送信できていない」と判断し、複数回送信を試みます。結果として、サーバー側でエラーが発生しやすくなり、本来届くはずの問い合わせも失われてしまいます。

原因4位:文字エンコーディングの問題(全体の10%)

LaravelとWordPressでの対処法

特に日本語を含む問い合わせで発生しがちな問題です。

Laravelでの推奨設定:

// config/mail.phpで確認
'charset' => 'utf-8',

// Mailableクラスでの設定
public function build()
{
    return $this->subject('お問い合わせ')
                ->view('emails.contact')
                ->with([
                    'name' => mb_convert_encoding($this->name, 'UTF-8', 'auto'),
                    'message' => mb_convert_encoding($this->message, 'UTF-8', 'auto')
                ]);
}

WordPressでの対処:

// functions.phpに追加
add_filter('wp_mail_charset', function($charset) {
    return 'UTF-8';
});

// メール送信時の処理
$subject = mb_encode_mimeheader($subject, 'UTF-8');
$message = mb_convert_encoding($message, 'UTF-8', 'auto');

原因5位:バリデーションエラーの不適切な処理(全体の5%)

ユーザビリティと確実性を両立させる方法

// フロントエンド側での事前チェック
const validateForm = (data) => {
  const errors = {};
  
  if (!data.email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email)) {
    errors.email = '有効なメールアドレスを入力してください';
  }
  
  if (!data.message || data.message.trim().length < 10) {
    errors.message = 'お問い合わせ内容は10文字以上で入力してください';
  }
  
  return errors;
};
// PHP側でのダブルチェック
function validateContactForm($data) {
    $errors = [];
    
    if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = 'メールアドレスの形式が正しくありません';
    }
    
    if (strlen(trim($data['message'])) < 10) {
        $errors['message'] = 'お問い合わせ内容を詳しく記入してください';
    }
    
    // 重要:エラーがあっても、管理者には通知を送る
    if (!empty($errors)) {
        error_log('問い合わせフォームエラー: ' . print_r($errors, true));
        // 管理者向けにアラートメール送信
        wp_mail('[email protected]', '【要確認】フォームエラー発生', print_r($data, true));
    }
    
    return $errors;
}

問題を未然に防ぐ監視体制の構築

自動テストの実装

問い合わせフォームは「動いて当たり前」の機能だからこそ、定期的な監視が重要です。

# crontabで毎日自動テスト
0 9 * * * /usr/bin/curl -X POST https://yoursite.com/contact-test
// テスト用エンドポイント
// /contact-test にアクセスがあったら、ダミーデータで送信テスト
if (isset($_GET['test']) && $_GET['test'] === 'daily-check') {
    $test_data = [
        'name' => 'テスト送信',
        'email' => '[email protected]',
        'message' => 'システム監視用の自動送信です - ' . date('Y-m-d H:i:s')
    ];
    
    $result = send_contact_mail($test_data);
    
    if (!$result) {
        // 失敗時は管理者にアラート
        wp_mail('[email protected]', '【緊急】問い合わせフォーム障害', '送信テストに失敗しました');
    }
}

まとめ:まず今日すべきこと

問い合わせフォームの信頼性向上は、売上に直結する重要な改善です。

今すぐ確認すべき3つのポイント:

  1. テスト送信 - 自分のスマートフォンから実際に問い合わせを送信してみる
  2. 迷惑メールフォルダの確認 - 過去1週間の迷惑メールに問い合わせが紛れていないかチェック
  3. エラーログの確認 - サーバーのエラーログで「mail」「contact」関連のエラーを検索

もし技術的な対応が難しい場合や、根本的な改善をお考えの場合は、遠慮なくご相談ください。Fivenine Designでは、Laravel、WordPress、Next.jsそれぞれの特性を活かした、確実に届く問い合わせシステムの構築を得意としています。

小さな改善が、大きな機会損失を防ぎます。

この記事をシェア