せっかく問い合わせがあっても届かなければ機会損失。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週間の迷惑メールに問い合わせが紛れていないかチェック
- エラーログの確認 - サーバーのエラーログで「mail」「contact」関連のエラーを検索
もし技術的な対応が難しい場合や、根本的な改善をお考えの場合は、遠慮なくご相談ください。Fivenine Designでは、Laravel、WordPress、Next.jsそれぞれの特性を活かした、確実に届く問い合わせシステムの構築を得意としています。
小さな改善が、大きな機会損失を防ぎます。