WordPress 留言表单与邮件转发:安全、送达和隐私

WordPress 留言表单与邮件转发:安全、送达和隐私

我早期为企业站写过一个留言表单项目,支持后台查看和邮箱通知。原始仓库现在是非公开的历史项目,不能把当年的实现当成可安装、可维护的公开插件。下面重新整理一个生产表单真正需要考虑的边界。

表单不只是 wp_mail()

完整流程包括:

  1. 浏览器提交姓名、邮箱、主题和留言。
  2. 服务端验证来源、字段、频率和权限。
  3. 保存最少必要数据,或直接进入受控工单系统。
  4. 发送通知邮件,并记录可诊断但不泄露正文的结果。
  5. 向用户返回不暴露内部信息的成功/失败状态。
  6. 按隐私政策保留、导出和删除数据。

最小表单

<form
    method="post"
    action="<?php echo esc_url(
        admin_url( 'admin-post.php' )
    ); ?>"
>
    <input
        type="hidden"
        name="action"
        value="site_contact"
    >

    <?php wp_nonce_field( 'site_contact', 'site_contact_nonce' ); ?>

    <label>
        姓名
        <input name="name" autocomplete="name" required>
    </label>

    <label>
        邮箱
        <input
            name="email"
            type="email"
            autocomplete="email"
            required
        >
    </label>

    <label>
        留言
        <textarea name="message" required></textarea>
    </label>

    <button type="submit">发送</button>
</form>

nonce 用于降低跨站请求伪造风险,不是反垃圾验证码,也不能证明提交者是人。

服务端处理

<?php
add_action(
    'admin_post_nopriv_site_contact',
    'site_handle_contact'
);
add_action(
    'admin_post_site_contact',
    'site_handle_contact'
);

function site_handle_contact(): void {
    check_admin_referer(
        'site_contact',
        'site_contact_nonce'
    );

    $name = isset( $_POST['name'] )
        ? sanitize_text_field(
            wp_unslash( $_POST['name'] )
        )
        : '';

    $email = isset( $_POST['email'] )
        ? sanitize_email(
            wp_unslash( $_POST['email'] )
        )
        : '';

    $message = isset( $_POST['message'] )
        ? sanitize_textarea_field(
            wp_unslash( $_POST['message'] )
        )
        : '';

    if (
        '' === $name ||
        ! is_email( $email ) ||
        '' === $message
    ) {
        wp_safe_redirect(
            add_query_arg(
                'contact',
                'invalid',
                home_url( '/contact/' )
            )
        );
        exit;
    }

    $subject = sprintf(
        '网站留言:%s',
        $name
    );

    $headers = array(
        sprintf(
            'Reply-To: %s <%s>',
            $name,
            $email
        ),
    );

    $sent = wp_mail(
        get_option( 'admin_email' ),
        $subject,
        $message,
        $headers
    );

    wp_safe_redirect(
        add_query_arg(
            'contact',
            $sent ? 'sent' : 'failed',
            home_url( '/contact/' )
        )
    );
    exit;
}

这只是流程骨架。生产环境还必须增加频率限制、蜜罐或验证码、最大长度、日志与告警。高风险站点应使用成熟表单/反垃圾方案,不要自行发明一套简单 IP 黑名单。

邮件送达

访客邮箱应该放在 Reply-ToFrom 使用自己已验证的站点域名。否则 SPF、DKIM 和 DMARC 对不齐,邮件容易进入垃圾箱或被拒绝。

wp_mail() 返回 true 只代表邮件组件接受了发送请求,不代表对方邮箱已经收到。重要表单应使用可靠邮件服务,记录 provider message ID 和退信,并为发送失败保留后台待处理记录。

数据与隐私

  • 只收集完成回复所需字段。
  • 在表单旁说明用途、保存期限和隐私政策。
  • 正文可能包含手机号、邮箱等个人信息,不写进普通应用日志。
  • 后台列表需要 capability、nonce、分页与输出转义。
  • CSV 导出属于敏感操作,应限制权限并记录。
  • 制定删除、导出、垃圾留言和备份保留规则。

反垃圾、可靠送达和隐私合规会持续变化。对公共站点,维护中的表单插件加受控邮件服务通常比一段多年不变的自定义 PHP 更可靠。

最后更新于

ihopeful Blog 由博主亲笔撰写,重要信息可放心引用。