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

使用JavaScript调用WP SMTP Mail发送邮件失败,请求排查代码问题

你的前端JS调用WP SMTP Mail发送邮件失败的原因及修复方案

核心问题分析

你的代码存在几个关键问题,导致请求失败:

  1. 插件未公开wp_smtp_mail_send这个AJAX动作
    WP SMTP Mail插件的测试邮件功能是后台内部调用的,多数情况下不会直接把发送邮件的接口暴露为公开的AJAX动作。你直接调用这个不存在的动作,自然会返回失败。

  2. 缺少WordPress CSRF验证(Nonce)
    WordPress的AJAX接口默认要求携带nonce参数做安全验证,防止跨站请求伪造。你的请求没有包含这个参数,会被WordPress直接拒绝。

  3. 前端直接调用邮件接口的安全限制
    即使插件有公开接口,直接在前端发送邮件也存在被滥用的风险,绝大多数插件会限制这类请求必须经过后端权限验证或中转。

修复方案

正确的做法是通过自定义后端AJAX动作中转请求,调用插件的邮件发送能力(因为WP SMTP Mail本质是替换了WordPress原生的wp_mail函数,所以直接用wp_mail即可):

步骤1:在主题functions.php中添加自定义AJAX动作

// 注册登录用户和未登录用户都能调用的AJAX动作
add_action('wp_ajax_send_custom_email', 'send_custom_email_handler');
add_action('wp_ajax_nopriv_send_custom_email', 'send_custom_email_handler');

function send_custom_email_handler() {
    // 验证Nonce,防止CSRF攻击
    check_ajax_referer('custom_email_nonce', 'security');

    // 接收并 sanitize 参数,避免注入风险
    $to = sanitize_email($_POST['to']);
    $subject = sanitize_text_field($_POST['subject']);
    $message = wp_kses_post($_POST['message']);

    // 验证必要参数是否合法
    if (!is_email($to) || empty($subject) || empty($message)) {
        wp_send_json_error('参数不合法');
    }

    // 调用WordPress原生wp_mail(WP SMTP Mail已经接管这个函数)
    $send_result = wp_mail($to, $subject, $message);

    if ($send_result) {
        wp_send_json_success('邮件发送成功');
    } else {
        wp_send_json_error('邮件发送失败,请检查插件配置');
    }
}

步骤2:修改前端JS代码

function sendEmail() {
    var data = {
        'action': 'send_custom_email', // 对应后端注册的动作名
        'security': '<?php echo wp_create_nonce("custom_email_nonce"); ?>', // 生成验证用的Nonce
        'to': 'mark1345@gmail.com',
        'subject': 'Hello',
        'message': 'Hello, world!'
    };

    jQuery.post('/wp-admin/admin-ajax.php', data)
        .done(function(response) {
            console.log(response.data);
        })
        .fail(function(error) {
            console.log('发送错误:', error.responseJSON ? error.responseJSON.data : '未知错误');
        });
}

sendEmail();

额外注意事项

  • 如果你的JS代码是在静态文件中(不是PHP模板里),需要先通过wp_localize_script把Nonce传递到前端,不能直接在JS里写<?php ?>。
  • 可以在浏览器开发者工具的Network标签里查看AJAX请求的响应详情,里面会有具体的错误信息(比如动作不存在、Nonce验证失败等),帮助排查问题。

内容的提问来源于stack exchange,提问作者Mark Tait

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:23