以下是一个简单的测试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()函数发送邮件,通常是因为:
-
sendmail未正确安装或配置 - PHP
mail()函数被禁用 - 服务器防火墙阻止了邮件发送
-
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 方式发送邮件:
- 安装 WP Mail SMTP 插件
- 配置 SMTP(如 Gmail、QQ邮箱、阿里云邮件等)
- 测试发送邮件
6. 检查服务器防火墙
如果服务器有防火墙(如 iptables、ufw、云服务器安全组),确保 25 端口(SMTP) 是开放的:
sudo ufw allow 25 # 如果使用 ufw
或联系主机商确认是否允许邮件发送。
最终解决方案
如果仍然无法解决:
- 改用 SMTP 插件(如 WP Mail SMTP),避免依赖
mail()。 - 使用
wp-cli测试邮件(命令行):wp eval 'wp_mail("test@example.com", "Test", "Hello");' - 联系主机商,询问是否禁用了
mail()或sendmail。
总结
| 问题 | 解决方案 |
|---|---|
Could not instantiate mail function | 检查 sendmail是否安装 |
mail()不可用 | 检查 php.ini配置 |
sendmail路径错误 | 修改 sendmail_path |
| 防火墙阻止 | 开放 25 端口 |
| 仍然失败 | 改用 SMTP 插件 |




