WordPress网站服务器无法发送邮件原因排查

以下是一个简单的测试WordPress邮件发送功能的PHP代码,你可以将其保存为test.php并直接放置在WordPress根目录下:

<?php
/**
 * WordPress邮件发送测试脚本(带详细错误信息)
 * 将此文件放在WordPress根目录下,通过浏览器访问进行测试
 */

// 加载WordPress环境
require_once('./wp-load.php');


// 设置HTML头
header('Content-Type: text/html; charset=utf-8');

// 定义收件人邮箱(修改为你自己的邮箱)
$to_email = 'admin@shopagg.com;
$subject = 'WordPress邮件发送测试 by SHOPAGG.COM';
$message = '<p>这是一封来自WordPress的测试邮件。by SHOPAGG.COM</p>';
$headers = array('Content-Type: text/html; charset=UTF-8');

// 用于存储错误信息
$mail_errors = array();

// 添加 phpmailer_init 钩子捕获错误
add_action('phpmailer_init', function($phpmailer) use (&$mail_errors) {
    $phpmailer->SMTPDebug = 3; // 开启详细调试信息
    $phpmailer->Debugoutput = function($debug_msg) use (&$mail_errors) {
        $mail_errors[] = $debug_msg;
    };
});

echo '<h1>WordPress邮件发送测试</h1>';
echo '<p>正在尝试发送测试邮件到: ' . esc_html($to_email) . '</p>';

// 尝试发送邮件
$result = wp_mail($to_email, $subject, $message, $headers);

if ($result) {
    echo '<p style="color: green;">邮件发送成功!</p>';
    echo '<p>请检查你的收件箱(包括垃圾邮件箱)。</p>';
} else {
    echo '<p style="color: red;">邮件发送失败!</p>';
    echo '<p>可能的原因:</p>';
    echo '<ul>';
    echo '<li>WordPress邮件配置不正确</li>';
    echo '<li>服务器没有正确配置SMTP服务</li>';
    echo '<li>使用了需要身份验证的SMTP但没有正确配置</li>';
    echo '</ul>';
    
    // 显示详细的错误信息
    if (!empty($mail_errors)) {
        echo '<h3>详细错误信息:</h3>';
        echo '<pre>';
        foreach ($mail_errors as $error) {
            echo esc_html($error) . "\n";
        }
        echo '</pre>';
    }
}

// 显示当前邮件配置信息
echo '<h2>当前邮件配置信息</h2>';
echo '<p>mail()函数是否可用: ' . (function_exists('mail') ? '是' : '否') . '</p>';
echo '<p>PHP mail()函数路径: ' . ini_get('sendmail_path') . '</p>';

// 安全提示
echo '<h2>安全提示</h2>';
echo '<p style="color: orange;">测试完成后请立即删除此文件!</p>';
?>

然后访问: https://你的网站域名/test.php

如何出现下面的错误:Could not instantiate mail function.

你的 WordPress 邮件发送失败,错误信息是:

Could not instantiate mail function.

这意味着服务器无法使用 mail()函数发送邮件,通常是因为:

  1. sendmail未正确安装或配置
  2. PHP mail()函数被禁用
  3. 服务器防火墙阻止了邮件发送
  4. sendmail路径不正确

解决方案

1. 检查 sendmail是否安装

在 SSH 中运行:

which sendmail

如果返回 /usr/sbin/sendmail,说明已安装;如果没有返回,则需要安装:

# Ubuntu/Debian
sudo apt update
sudo apt install sendmail sendmail-bin
sudo service sendmail restart

# CentOS/RHEL
sudo yum install sendmail sendmail-cf
sudo systemctl enable sendmail
sudo systemctl start sendmail

2. 检查 mail()函数是否可用

创建一个 mail-test.php文件:

<?php
if (function_exists('mail')) {
    echo "mail() 函数可用!";
} else {
    echo "mail() 函数不可用!";
}
phpinfo();  // 查看 PHP 配置
?>

访问这个文件,检查:

  • 是否显示 mail() 函数可用!
  • 在 phpinfo()里搜索 sendmail_path,确认路径是否正确(应该是 /usr/sbin/sendmail -t -i

3. 测试 sendmail是否能发送邮件

在 SSH 中运行:

echo "Test email body" | mail -s "Test Subject" your-email@example.com
  • 如果收到邮件,说明 sendmail工作正常。
  • 如果失败,可能是服务器防火墙阻止了邮件发送(联系主机商)。

4. 修改 sendmail路径

如果 sendmail路径不对,可以在 php.ini中修改:

sendmail_path = /usr/sbin/sendmail -t -i -f your-email@example.com

然后重启 PHP:

sudo service php-fpm restart  # 或 sudo systemctl restart apache2

5. 使用 SMTP 插件(推荐)​

如果 mail()仍然失败,建议改用 SMTP 方式发送邮件:

  1. 安装 ​WP Mail SMTP​ 插件
  2. 配置 SMTP(如 Gmail、QQ邮箱、阿里云邮件等)
  3. 测试发送邮件

6. 检查服务器防火墙

如果服务器有防火墙(如 iptablesufw、云服务器安全组),确保 ​25 端口(SMTP)​​ 是开放的:

sudo ufw allow 25  # 如果使用 ufw

或联系主机商确认是否允许邮件发送。


最终解决方案

如果仍然无法解决:

  1. 改用 SMTP 插件​(如 ​WP Mail SMTP),避免依赖 mail()
  2. 使用 wp-cli测试邮件​(命令行):wp eval 'wp_mail("test@example.com", "Test", "Hello");'
  3. 联系主机商,询问是否禁用了 mail()或 sendmail

总结

问题解决方案
Could not instantiate mail function检查 sendmail是否安装
mail()不可用检查 php.ini配置
sendmail路径错误修改 sendmail_path
防火墙阻止开放 25 端口
仍然失败改用 SMTP 插件

分享你的喜爱
庄朋龙
庄朋龙

这个人很懒,什么都没有留下~

文章: 70

留下评论