无需插件在WordPress中用wp_mail发邮件遇500错误求助
WordPress中wp_mail函数触发500错误的排查与修复
核心错误定位
你的mail.php里调用wp_mail时用了未定义的$body变量,这会直接触发PHP致命错误,导致500状态码——你只获取了$mensaje变量,但没把它赋值给$body。
修复后的完整代码
修正后的mail.php代码
<?php // 确认wp-load.php路径正确,根据实际目录层级调整 require_once('../../../../wp-load.php'); // 开发环境开启错误调试,上线后请注释掉 error_reporting(E_ALL); ini_set('display_errors', 1); if (isset($_POST['submitted'])) { // 过滤用户输入,避免XSS和注入风险 $nombre = sanitize_text_field($_POST['nombre']); $email = sanitize_email($_POST['email']); $asunto = sanitize_text_field($_POST['asunto']); $mensaje = wp_kses_post($_POST['mensaje']); $from = 'info@tuweb.es'; $emailTo = $from; // 接收邮件的邮箱,可按需修改 // 构建邮件内容 $body = "Nombre: $nombre\n"; $body .= "Email: $email\n"; $body .= "Asunto: $asunto\n"; $body .= "Mensaje:\n$mensaje"; // 修正Headers格式,移除可能引发服务器限制的Sender字段 $headers = array( "Content-Type: text/plain; charset=UTF-8", // 若需HTML邮件,改为text/html并确保内容合法 "From: Tuwebeconomica.es <$from>", "Reply-To: $nombre <$email>" ); // 发送邮件并判断结果 $mailSent = wp_mail($emailTo, 'Nuevo mensaje de contacto desde tuweb.es', $body, $headers); if ($mailSent) { // 用WordPress函数重定向,更规范 wp_redirect(add_query_arg('success', 'true', wp_get_referer())); exit; } else { // 发送失败的处理逻辑 wp_redirect(add_query_arg('error', 'true', wp_get_referer())); exit; } }
关键修改说明
- 补全
$body变量:把用户提交的表单字段拼接成邮件内容,解决未定义变量的致命错误。 - 输入安全过滤:用WordPress内置函数过滤用户输入,避免恶意代码注入。
- Headers优化:移除可能被服务器拦截的
Sender头部,确保每个头部格式符合邮件规范。 - 重定向优化:用
wp_redirect和wp_get_referer替代原生PHP方法,更适配WordPress环境,避免路径问题。 - 调试辅助:添加错误输出代码(仅开发环境用),方便排查后续问题。
额外排查点
- 验证wp-load.php路径:可以用
var_dump(file_exists('../../../../wp-load.php'));检查文件是否存在,路径不对也会触发500错误。 - 服务器邮件配置:虽然之前
mail()可用,但wp_mail依赖PHP的邮件配置,可在WordPress后台「设置-常规」里检查发件人邮箱设置。 - 文件权限检查:确保mail.php所在目录权限正确,避免PHP无法读取wp-load.php或执行邮件发送操作。
内容的提问来源于stack exchange,提问作者Javier Muñoz Sánchez
相关产品推荐
相关产品推荐

