25端口被云厂商默认封禁是宝塔邮件发送失败的主因;需用telnet验证后改用465/587端口并重配postfix中继,同时禁用php mail()函数、停用系统mta、清理sendmail软链。

25 端口被阿里云、腾讯云、华为云等默认封禁,是宝塔面板安装后发不出邮件的最常见原因——不是你配错了,是根本连不出去。
为什么 telnet smtp.qq.com 25 失败就基本确定是端口问题
宝塔后台点“发送测试邮件”成功,不代表系统级 mail() 或 PHP 脚本能发;但 telnet smtp.qq.com 25 直接超时或返回 Connection refused,说明出站 25 已被底层拦截。国内云厂商对新购轻量/ESC实例几乎 100% 封 25,且不开放解封入口(尤其个人认证用户)。
- 阿里云:仅企业认证可提工单申请,且需声明用于自建邮件服务器
- 腾讯云:安全组放行
25后仍可能被拦截,必须同步提交工单 - 华为云:需在安全组放行 + 单独申请“邮件端口白名单”,审批要 1–3 个工作日
- 别试了:2026 年起,阿里云轻量应用服务器、腾讯云 CVM 新购实例已彻底关闭
25解封通道
改用 465/587 端口时 Postfix 必须重配 relayhost 和 TLS 级别
换端口不是改个数字就行。Postfix 默认走 25 且不带认证,直接填 smtp.qq.com:465 会报 connection refused 或 no route to host。
- 必须启用中继:
relayhost = [smtp.exmail.qq.com]:465(注意方括号,绕过 DNS MX 查找) - TLS 必须设为强制:
smtp_tls_security_level = encrypt,不能用may或none - 认证凭据存于
/etc/postfix/sasl_passwd,格式:[smtp.exmail.qq.com]:465 user@domain.com:password - 执行
postmap /etc/postfix/sasl_passwd && systemctl reload postfix才生效
宝塔邮局插件和系统 Postfix 冲突会导致静默失败
装了宝塔邮局插件还手动启 postfix,两个 MTA 会抢 /usr/sbin/sendmail 这个路径,结果 PHP 的 mail() 调用被随机转发到错误服务,日志里只显示 temporary failure,没具体错误。
- 先停系统级服务:
systemctl stop postfix sendmail,再systemctl disable postfix sendmail - 删冲突软链:
rm -f /usr/sbin/sendmail,让宝塔插件自己提供轻量 MTA - 检查是否干净:
which sendmail应无输出;ls -l /usr/sbin/sendmail应报错“no such file” - 最后重启宝塔:
bt restart,再测
PHP mail() 函数本身被禁用,和端口无关
很多人查了一圈端口、DNS、防火墙,却漏掉最基础的一环:mail() 在 PHP 禁用函数列表里。宝塔默认就把 mail 加进去了,哪怕你 Postfix 配得再完美,mail() 也压根不会调用它。
- 进宝塔 → 网站 → 对应 PHP 版本 → 禁用函数,删掉
mail - 确认
sendmail_path没被注释,值类似:/usr/sbin/sendmail -t -i -f webmaster@yourdomain.com - 重启 PHP(不是面板),然后跑测试脚本:
<?php var_dump(function_exists('mail'));,输出true才算过关
mail 命令、还是 PHP mail()、还是 WordPress 插件封装的 PHPMailer——每条路径依赖的组件、端口、认证方式都不同,混在一起查日志只会互相干扰。











