You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress自定义联系表单无法提交 邮件发送功能持续报错求解

问题根源与修复方案

你的代码存在4处核心错误导致邮件发送失败,以下是具体修复步骤:

  • 未定义邮件主题变量
    wp_mail() 函数的第二个参数为必填的邮件主题,你的代码中直接使用了未赋值的$subject变量,参数校验不通过直接返回发送失败。修复方式:在$headers定义前添加主题赋值即可。
  • 消息文本域缺少name属性
    HTML中的<textarea>标签未添加name="cf-message"属性,提交表单时消息内容不会被POST到后端,$_POST["cf-message"]为空值,也会导致发送参数错误。
  • 复选框value赋值逻辑错误
    复选框的value属性应为固定值,你当前的逻辑是把历史提交值作为value,首次加载时所有复选框value为空,就算用户勾选也只会提交空字符串,无法正确收集选项。修复方式:把每个复选框的value改为固定值,选中状态用checked属性判断即可。
  • 输入框value存在多余空格
    所有输入框的value拼接时前后都加了多余的空格,会导致用户提交的数据前后自动带上空格,比如邮箱末尾多空格会被sanitize_email判定为无效地址,导致发件人参数错误。修复方式:删除所有value属性值前后的多余空格即可。

完整修复后代码

<?php

// FORMULAIRE DE CONTACT HTML
// ##########################
function html_form_code() {

    echo ('
    <section class="section-form d-flex flex-column justify-content-center align-items-center">
        <div class="container text-center mt-5">
            <h2 class="fs-3">Une question, une demande de devis ?</h2>
            <p>Remplissez le formulaire ci-dessous, nous vous recontacterons rapidement !</p>
        </div>
        <form action="'. esc_url( $_SERVER['REQUEST_URI'] ) .'" method="post" class="container mt-3 p-4">
            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["cf-name"] ) ? esc_attr( $_POST["cf-name"] ) : '' ) . '" size="40"/>
                <label for="cf-name">Nom</label>
            </div>
            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="cf-firstname" value="' . ( isset( $_POST["cf-firstname"] ) ? esc_attr( $_POST["cf-firstname"] ) : '' ) . '" size="40" >
                <label for="cf-firstname">Prénom</label>
            </div>
            <div class="form-floating mb-3">
                <input type="email" class="form-control" name="cf-email" value="' . ( isset( $_POST["cf-email"] ) ? esc_attr( $_POST["cf-email"] ) : '' ) .'" size="40" >
                <label for="cf-email">Email</label>
            </div>
            <div class="form-floating mb-3">
                <input type="tel" class="form-control" name="cf-tel" value="' . ( isset( $_POST["cf-tel"] ) ? esc_attr( $_POST["cf-tel"] ) : '' ) . '" size="40" >
                <label for="cf-tel">Téléphone</label>
            </div>
            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="cf-address" value="' . ( isset( $_POST["cf-address"] ) ? esc_attr( $_POST["cf-address"] ) : '' ) . '" size="250" >
                <label for="cf-address">Adresse</label>
            </div>
            <div class="form-floating mb-3">
                <input type="text" class="form-control" name="cf-postal" value="' . ( isset( $_POST["cf-postal"] ) ? esc_attr( $_POST["cf-postal"] ) : '' ) . '" size="10" >
                <label for="cf-postal">Code postal</label>
            </div>
            <div class="form-floating mb-3">
                <input type="text" class="form-control"name="cf-city" value="' . ( isset( $_POST["cf-city"] ) ? esc_attr( $_POST["cf-city"] ) : '' ) . '" size="250" >
                <label for="cf-city">Ville</label>
            </div>
            <div>
                <p class="fs-5 mt-4">Votre demande concerne :</p>
                <div class="form-check">
                    <input class="form-check-input" type="checkbox" name="cf-help" value="Les Aides de l\'État" ' . checked( isset($_POST['cf-help']), true, false ) . '/>
                    <label class="form-check-label" for="cf-help">
                        Les Aides de l\'État
                    </label>
                </div>
                <div class="form-check">
                    <input class="form-check-input" type="checkbox" name="cf-contract" value="Nos Contrats d\'Entretien" ' . checked( isset($_POST['cf-contract']), true, false ) . '>
                    <label class="form-check-label" for="cf-contract">
                        Nos Contrats d\'Entretien
                    </label>
                </div>
                <div class="form-check">
                    <input class="form-check-input" type="checkbox" name="cf-quote" value="Une Demande de Devis" ' . checked( isset($_POST['cf-quote']), true, false ) . '/>
                    <label class="form-check-label" for="cf-quote">
                        Une Demande de Devis
                    </label>
                </div>
                <div class="form-check">
                    <input class="form-check-input" type="checkbox" name="cf-other" value="Autre" ' . checked( isset($_POST['cf-other']), true, false ) . '/>
                    <label class="form-check-label mb-4" for="cf-other">
                        Autre
                    </label>
                </div>
            </div>
            <div class="form-floating mb-3">
                <textarea class="form-control" name="cf-message">' . ( isset( $_POST["cf-message"] ) ? esc_textarea( $_POST["cf-message"] ) : '' ) . '</textarea>
                <label for="cf-message">Votre message</label>
            </div>
            <button type="submit" class="btn button-primary mt-3" name="cf-submitted">Envoyer</button>
        </form>
    </section>') ;

}

// ENVOYER LES DONNEES A L ADMIN
// ##############################
function deliver_mail() {

    // if the submit button is clicked, send the email
    if ( isset( $_POST['cf-submitted'] ) ) {

        // sanitize form values
        $name = sanitize_text_field( $_POST["cf-name"] );
        $firstname = sanitize_text_field( $_POST["cf-firstname"] );
        $email   = sanitize_email( $_POST["cf-email"] );
        $tel = sanitize_text_field( $_POST["cf-tel"] );
        $address = sanitize_text_field( $_POST["cf-address"] );
        $postal = sanitize_text_field( $_POST["cf-postal"] );
        $city = sanitize_text_field( $_POST["cf-city"] );
        $message = esc_textarea( $_POST["cf-message"] );

        // 拼接用户选择的咨询类型
        $request_type = [];
        if(isset($_POST['cf-help'])) $request_type[] = "Les Aides de l'État";
        if(isset($_POST['cf-contract'])) $request_type[] = "Nos Contrats d'Entretien";
        if(isset($_POST['cf-quote'])) $request_type[] = "Une Demande de Devis";
        if(isset($_POST['cf-other'])) $request_type[] = "Autre";
        $request_type_str = implode("、", $request_type);

        // 拼接完整邮件内容
        $full_message = "姓名:{$name} {$firstname}\n";
        $full_message .= "邮箱:{$email}\n";
        $full_message .= "电话:{$tel}\n";
        $full_message .= "地址:{$address},{$postal} {$city}\n";
        $full_message .= "咨询类型:{$request_type_str}\n";
        $full_message .= "消息内容:\n{$message}";

        // get the blog administrator's email address
        $to = get_option( 'admin_email' );
        // 定义邮件主题
        $subject = "站点联系表单提交:来自{$name}的咨询";
        $headers = "From: $name <$email>" . "\r\n";

        // If email has been process for sending, display a success message
        if ( wp_mail( $to, $subject, $full_message, $headers ) ) {
            echo '<div>';
            echo '<p>Merci de votre envoi, nous vous recontacterons très vite !</p>';
            echo '</div>';
        } else {
            echo 'Echec lors de la validation du formulaire';
        }
    }

}

// APPELLEE LORSQUE LE SHORTCODE EST ACTIF
// #######################################
function cf_shortcode() {

    ob_start();
    deliver_mail();
    html_form_code();
    return ob_get_clean();

}

add_shortcode( 'sitepoint_contact_form', 'cf_shortcode' );

额外调试建议

如果修改后仍然发送失败,可以在主题的functions.php中临时添加以下代码查看wp_mail的具体错误信息:

add_action('wp_mail_failed', function($wp_error){
    var_dump($wp_error->get_error_messages());
    die;
});

发送测试表单即可看到具体错误原因,排查完成后记得删除这段调试代码。


内容的提问来源于stack exchange,提问作者Alice Mim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:54:10