使用JavaScript调用WP SMTP Mail发送邮件失败,请求排查代码问题
你的前端JS调用WP SMTP Mail发送邮件失败的原因及修复方案
核心问题分析
你的代码存在几个关键问题,导致请求失败:
插件未公开
wp_smtp_mail_send这个AJAX动作
WP SMTP Mail插件的测试邮件功能是后台内部调用的,多数情况下不会直接把发送邮件的接口暴露为公开的AJAX动作。你直接调用这个不存在的动作,自然会返回失败。缺少WordPress CSRF验证(Nonce)
WordPress的AJAX接口默认要求携带nonce参数做安全验证,防止跨站请求伪造。你的请求没有包含这个参数,会被WordPress直接拒绝。前端直接调用邮件接口的安全限制
即使插件有公开接口,直接在前端发送邮件也存在被滥用的风险,绝大多数插件会限制这类请求必须经过后端权限验证或中转。
修复方案
正确的做法是通过自定义后端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
相关产品推荐
相关产品推荐

