WordPress网站无法发送邮件的原因与解决方案
11
WordPress网站经常需要发送各种系统邮件,例如:用户注册验证邮件、密码重置邮件、评论通知、联系表单提交通知、自动更新通知等。当这些邮件发送失败时,用户会收到”电子邮件未能发送”的错误提示,或者邮件根本没有送达收件箱。
出现这种情况,绝大多数时候可以归结为两大核心原因:
主机不支持 PHP 的 mail() 函数
SMTP 邮件发送配置不正确
下面逐一详细说明。
二、原因一:主机不支持 PHP mail() 函数
2.1 什么是 PHP mail() 函数?
WordPress 默认使用 PHP 内置的 mail() 函数来发送邮件。这个函数直接调用服务器上的邮件发送程序(如 sendmail 或 postfix)来投递邮件。
2.2 为什么不支持?
许多虚拟主机服务商(尤其是国内主机如万网)默认禁用或未配置 mail() 函数,主要原因包括:
防止垃圾邮件:开放 mail() 函数容易被滥用发送垃圾邮件,主机商会选择禁用服务器环境不完整:部分主机未安装或未正确配置 sendmail 等邮件发送服务安全限制:部分主机对相关接口进行了安全保护
2.3 如何判断主机是否支持 mail() 函数?
你可以在 WordPress 中安装 WP Mail SMTP 等插件,进入”邮件测试”页面,如果提示 “您的主机禁用了 Mail 函数”,就说明主机不支持。也可以新建一个 PHP 测试文件查看返回结果。
2.4 解决方案
既然主机不支持 mail() 函数,最可靠的解决办法就是改用 SMTP 协议发送邮件。
三、原因二:SMTP 配置不正确
3.1 什么是 SMTP?
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是专门用于发送邮件的标准协议。通过 SMTP 发送邮件,可以:
绕开主机对 mail() 函数的限制
大幅提升邮件送达率,避免被判定为垃圾邮件使用正规邮件服务商的服务器,邮件可靠性更高
3.2 推荐的 SMTP 邮件服务商
| 服务商 | 适用场景 | 备注 |
|---|---|---|
| 企业邮箱(如网易企业邮、腾讯企业邮) | 有企业域名的网站 | 专业发件域名,送达率高 |
| Gmail / Google Workspace | 海外用户 | 需开启 Less Secure App 或 OAuth |
| QQ邮箱/163邮箱 | 个人测试 | 需开启 SMTP 授权码 |
| SendGrid / Amazon SES / SendinBlue | 大量邮件发送 | 邮件追踪、高送达率 |
3.3 常见配置参数
SMTP 配置通常需要以下参数:
SMTP 服务器地址(如 smtp.example.com)
SMTP 端口(常用 25、465、587)加密方式(SSL 或 TLS)
邮箱账号(发件人邮箱)
邮箱密码/授权码
是否启用 SMTP 认证(SMTPAuth)3.4 常见配置错误
以下配置错误会导致发送失败:
SMTP 服务器地址写错,或多了空格/多余字符
端口写错,或服务器未开放对应端口(如防火墙封锁了 465 端口)邮箱密码错误,尤其是大小写问题加密方式与端口不匹配(例如服务器只支持 TLS 却配成了 SSL)
发送邮箱地址被拒绝:发件人地址不属于该账号邮箱每日发送额度用完邮箱空间已满收件人地址格式不正确
四、详细解决步骤
步骤一:检查主机是否支持 mail() 函数
如果你不确定问题根源,可以先通过插件测试。安装并激活 WP Mail SMTP 插件,进入设置页面查看系统提示。如果提示主机禁用 Mail 函数,就进入下一步。
步骤二:安装并配置 SMTP 插件
推荐使用 WP Mail SMTP 插件,这是最流行的 WordPress SMTP 解决方案。操作步骤如下:
安装插件:后台 → 插件 → 安装插件 → 搜索 “WP Mail SMTP” → 安装并启用进入设置:WP Mail SMTP → 设置
填写发件人信息:设置发件人邮箱地址和发件人名称选择邮件方式:选择 “SMTP”(或其他邮件服务)
填写 SMTP 参数:
SMTP 主机地址
SMTP 端口
加密类型(TLS 或 SSL)
是否启用认证
邮箱用户名和密码
保存设置并点击”发送测试邮件”验证步骤三:验证测试邮件
配置完成后,务必发送一封测试邮件验证是否成功。如果成功收到邮件,说明配置正确。
步骤四:额外问题处理
情况 A:部分国内主机(如万网)仍无法发送
部分国内主机不仅禁用了 mail() 函数,也不支持 WordPress 默认使用的 stream_socket_client 发送函数,需要改用 fsockopen 函数。
解决方法:通过 FTP 打开 /wp-includes/class-smtp.php 文件,找到类似以下代码:
$this->smtp_conn = @stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$socket_context
);
将其替换为:
$this->smtp_conn = @fsockopen($host, $port, $errno, $errstr, $timeout);
重要提醒:这个方法修改了 WordPress 核心代码,一旦 WordPress 升级版本,就需要重新修改。在做此操作前务必备份文件。
情况 B:SMTP 连接超时
如果出现连接超时问题,先在服务器上测试端口连通性:
telnet smtp.example.com 465
curl -v ssl://smtp.example.com:465
如果连接失败,说明是服务器防火墙或主机商安全组封锁了该端口。解决方法:
联系主机服务商请求开放对应端口的出站访问权限切换端口:例如将 465 端口改为 587 端口(TLS 加密)情况 C:配置中也修改核心文件的方式(不推荐)
另外一种做法是直接修改 WordPress 配置文件(如 functions.php 或核心文件),使用 phpmailer_init 钩子配置 SMTP 参数:
function mail_smtp( $phpmailer ){
$phpmailer->From = "your@email.com"; // 发件人
$phpmailer->FromName = "Your Site"; // 发件人昵称
$phpmailer->Host = "smtp.example.com"; // SMTP 服务器地址
$phpmailer->Port = 465; // SMTP 端口(25/465/587)
$phpmailer->SMTPSecure = "ssl"; // 加密方式(ssl/tls)
$phpmailer->Username = "your@email.com"; // 邮箱账号
$phpmailer->Password = "yourpassword"; // 邮箱密码(授权码)
$phpmailer->IsSMTP(); // 使用 SMTP 发送
$phpmailer->SMTPAuth = true; // 启用 SMTP 认证
}
add_action('phpmailer_init', 'mail_smtp');
不过更推荐使用插件方式,便于维护。
五、完整排查清单
当你遇到 WordPress 发不了邮件时,按以下顺序排查:
| 排查项 | 操作 | 说明 |
|---|---|---|
| 1. 主机是否支持 mail() | 用 WP Mail SMTP 插件测试 | 不支持则改用 SMTP |
| 2. SMTP 服务器地址 | 核对是否拼写正确 | 空格、大小写都注意 |
| 3. 端口是否正确 | 确认使用 25/465/587 | 与加密方式匹配 |
| 4. 加密方式 | SSL 还是 TLS | 需与端口匹配 |
| 5. 邮箱账号密码 | 检查大小写、授权码 | 部分邮箱需用授权码 |
| 6. 端口是否被封锁 | telnet/curl 测试 | 联系主机商或换端口 |
| 7. 是否达到发送限额 | 查看服务商配额 | 邮箱日发送量有限制 |
| 8. 是否被反垃圾拦截 | 检查垃圾邮件箱 | 考虑 SPF/DKIM 设置 |
WordPress 无法发送邮件,核心就是两条路:
主机不支持 mail() 函数 → 改用 SMTP 发送
SMTP 配置有误 → 仔细核对服务器、端口、加密、账号、密码
只要通过 WP Mail SMTP 插件正确配置好 SMTP 参数,并完成测试邮件验证,绝大多数邮件发送问题都可以得到解决。若使用国内部分受限主机,可能还需修改核心代码配合,但切记升级后要重新修改。