2026年11月13日
2026年11月13日
WordPressのお問い合わせフォームが送信できない問題を解決する方法
はじめに
WordPressのContact Form 7でフォームを送信しても「送信に失敗しました」と表示されメールが届かない・フォームの送信ボタンを押しても何も起こらない・reCAPTCHAのバッジが表示されずバリデーションが通らない・スパムフィルターに引っかかって正規の問い合わせがスパムフォルダに入るといった問題は、PHPメール設定の不備・SMTPサーバーの設定ミス・JavaScriptの競合・reCAPTCHAのAPIキー誤設定が原因です。
症状・原因
- レンタルサーバーの
mail()関数が制限されておりWordPressからメールを送信できない - Contact Form 7の送信先メールアドレスがサーバーのドメインと異なるためスパム判定される
- reCAPTCHA v3のサイトキー・シークレットキーが正しく設定されていない
- フォームのJavaScript(
cf7スクリプト)がテーマや他プラグインと競合している
解決手順
ステップ1:メール送信の状態を診断する
# WordPressからメールが送信できるか確認
wp eval "
\$result = wp_mail(
'test@example.com',
'WordPress メールテスト',
'このメールが届けばwp_mail()は正常です。'
);
echo 'wp_mail result: ' . (\$result ? 'SUCCESS' : 'FAILED') . PHP_EOL;
"
# PHPのmail()関数が使えるか確認
wp eval "
echo 'mail() function: ' . (function_exists('mail') ? 'available' : 'DISABLED') . PHP_EOL;
echo 'sendmail_path: ' . ini_get('sendmail_path') . PHP_EOL;
echo 'SMTP: ' . ini_get('SMTP') . PHP_EOL;
echo 'smtp_port: ' . ini_get('smtp_port') . PHP_EOL;
"
# Contact Form 7のバージョンと設定を確認
wp eval "
if (defined('WPCF7_VERSION')) {
echo 'CF7 Version: ' . WPCF7_VERSION . PHP_EOL;
}
\$forms = get_posts(['post_type' => 'wpcf7_contact_form', 'numberposts' => -1]);
foreach (\$forms as \$form) {
echo 'Form: ' . \$form->post_title . ' (ID: ' . \$form->ID . ')' . PHP_EOL;
}
"
ステップ2:WP Mail SMTPでメール送信を安定させる
// functions.php: SMTPを使った確実なメール送信設定(プラグイン不使用の場合)
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.gmail.com'; // SMTPサーバー
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587; // TLS: 587, SSL: 465
$phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$phpmailer->Username = 'yourmail@gmail.com';
$phpmailer->Password = 'your_app_password'; // Gmailはアプリパスワードを使用
$phpmailer->From = 'yourmail@gmail.com';
$phpmailer->FromName = 'サイト名';
});
// 送信元アドレスを固定する(スパム判定対策)
add_filter('wp_mail_from', fn(): string => 'noreply@example.com');
add_filter('wp_mail_from_name', fn(): string => 'サイト名 お問い合わせ');
# WP Mail SMTPプラグインのSMTP設定を確認
wp eval "
\$options = get_option('wp_mail_smtp');
if (\$options) {
echo 'SMTP Host: ' . (\$options['mail']['host'] ?? 'not set') . PHP_EOL;
echo 'SMTP Port: ' . (\$options['mail']['port'] ?? 'not set') . PHP_EOL;
echo 'Auth: ' . (\$options['mail']['auth'] ? 'enabled' : 'disabled') . PHP_EOL;
}
"
ステップ3:Contact Form 7のメール設定を修正する
// functions.php: Contact Form 7のメール送信をカスタマイズ
// CF7送信前にバリデーションを追加
add_filter('wpcf7_validate', function(WPCF7_Validation $result, array $tags): WPCF7_Validation {
foreach ($tags as $tag) {
if ($tag->name === 'your-email') {
$value = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
if (!is_email($value)) {
$result->invalidate($tag, 'メールアドレスの形式が正しくありません。');
}
}
}
return $result;
}, 10, 2);
// CF7送信成功時のフック(DBに保存など)
add_action('wpcf7_mail_sent', function(WPCF7_ContactForm $form): void {
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return;
}
$data = $submission->get_posted_data();
// 送信データをカスタムポストタイプに保存
wp_insert_post([
'post_type' => 'inquiry',
'post_title' => sanitize_text_field($data['your-name'] ?? '無名'),
'post_content' => sanitize_textarea_field($data['your-message'] ?? ''),
'post_status' => 'private',
'meta_input' => [
'_inquiry_email' => sanitize_email($data['your-email'] ?? ''),
],
]);
});
ステップ4:reCAPTCHAとスパム対策を設定する
// functions.php: reCAPTCHA v3の動作確認とスパム対策
// reCAPTCHAキーの設定確認
add_action('admin_init', function(): void {
$v3_key = get_option('wpcf7-recaptcha-sitekey');
$v3_secret = get_option('wpcf7-recaptcha-secret');
if (!$v3_key || !$v3_secret) {
// キーが未設定の場合は管理画面に通知
add_action('admin_notices', function(): void {
echo '<div class="notice notice-warning"><p>Contact Form 7: reCAPTCHAキーが設定されていません。</p></div>';
});
}
});
// Akismetと連携したスパムチェック
add_filter('wpcf7_spam', function(bool $spam): bool {
if ($spam) {
return $spam;
}
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return $spam;
}
$data = $submission->get_posted_data();
$email = $data['your-email'] ?? '';
// Akismetが有効な場合のスパムチェック
if (function_exists('akismet_http_post') && !empty($email)) {
// 簡易メールブラックリストチェック
$blacklist = get_option('disallowed_keys', '');
if (!empty($blacklist) && str_contains($blacklist, $email)) {
return true;
}
}
return $spam;
});
ステップ5:フォームのデバッグとパフォーマンス改善
# CF7のデバッグモードを有効化
wp eval "
// CF7の送信ログを有効化(wp-config.phpに追記が必要)
// define('WPCF7_DEBUG', true);
echo 'WP_DEBUG: ' . (defined('WP_DEBUG') && WP_DEBUG ? 'true' : 'false') . PHP_EOL;
"
# フォーム送信後のメールヘッダーを確認
wp eval "
add_filter('wp_mail', function(\$args) {
error_log('wp_mail to: ' . print_r(\$args['to'], true));
error_log('wp_mail subject: ' . \$args['subject']);
error_log('wp_mail headers: ' . print_r(\$args['headers'], true));
return \$args;
});
echo 'Mail debug filter added.' . PHP_EOL;
"
// functions.php: CF7のスクリプトを必要なページのみ読み込む(パフォーマンス最適化)
add_filter('wpcf7_load_js', '__return_false');
add_filter('wpcf7_load_css', '__return_false');
add_action('wp_enqueue_scripts', function(): void {
// お問い合わせページのみCF7スクリプトを読み込む
if (is_page('contact')) {
wpcf7_enqueue_scripts();
wpcf7_enqueue_styles();
}
});
注意事項
- Contact Form 7の送信先メールアドレスはWordPressのインストールドメインと一致するメールアドレス(
info@example.com等)を使用してください。Gmailなどの外部アドレスを送信先にするとSPFチェックで失敗しスパム判定されやすくなります - reCAPTCHA v3は閾値(デフォルト0.5)未満のスコアの送信をスパムとして扱います。正規ユーザーが弾かれる場合は閾値を下げるか、v2チェックボックス方式に変更してください
- SMTPのパスワードは
wp-config.phpに直接書かず、環境変数または専用の設定テーブルに保存することを推奨します
まとめ
WordPressお問い合わせフォーム不動作の解決は①wp_mail()のテスト送信・mail()関数の有効確認・CF7のバージョンとフォームIDを確認、②phpmailer_initフックでSMTPを設定・wp_mail_fromフィルターで送信元アドレスを固定・WP Mail SMTPプラグインの設定確認、③wpcf7_validateフィルターでカスタムバリデーション・wpcf7_mail_sentフックで送信データをDB保存・送信先アドレスをサイトドメインと一致させる、④reCAPTCHAキーの設定確認と管理画面通知・wpcf7_spamフィルターでAkismetと連携したスパムチェック、⑤wpcf7_load_js/cssフィルターでフォームページ以外のスクリプトを無効化・wp_mailフィルターでメールヘッダーをデバッグの手順で解決します。