宝塔面板邮件发送失败主因是系统未安装mta(如postfix),且php的mail()函数受disable_functions限制或sendmail_path配置错误;需安装postfix并配置smtp中继,同时修正php.ini中mail()相关设置。

宝塔面板发不了邮件?默认没启用 sendmail 服务
宝塔面板安装后 systemctl status sendmail 显示 inactive,不是配置错了,是根本没装或没启。CentOS 7/8、Ubuntu 20.04+ 默认都不带 sendmail,连服务单元文件都没有,mail 命令直接报 command not found 或 Connection refused。
实操建议:
- 先确认系统是否真有 sendmail:运行
which sendmail,没输出就说明没装; - CentOS 7/8 推荐装
postfix(更轻量、兼容性好),执行yum install -y postfix后systemctl enable --now postfix; - Ubuntu/Debian 用
apt install -y mailutils,它会自动依赖并配置postfix; - 别碰
sendmail—— 宝塔官方文档里提它,但实际在新系统上编译麻烦、端口冲突多、日志难查。
宝塔后台「邮箱」设置填了 SMTP 却收不到测试邮件
这里有个关键混淆:宝塔的「系统邮件」和「网站监控/告警邮件」走的是两套路径。你在「面板设置 → 邮箱」里填的 SMTP 地址、账号密码,只影响「面板自身触发的邮件」(比如登录通知、证书到期提醒),不控制 mail 命令、PHP 的 mail() 函数或 cron 脚本发信。
常见错误现象:
- 点「发送测试邮件」成功,但 PHP
mail()仍失败; - 用
echo "test" | mail -s "test" your@xx.com没反应,查/var/log/mail.log发现连接被拒绝; - SMTP 账号密码正确、端口也开了(如 587),但就是超时。
原因很简单:宝塔没动你的 MTA(邮件传输代理)配置,它只是自己另起一套调用逻辑。要让 PHP/cron 正常发信,必须确保系统级 MTA(如 postfix)已正确指向你的 SMTP 中继。
让 PHP mail() 和命令行 mail 走腾讯企业邮/阿里云邮件推送
Postfix 本身不支持直接填第三方 SMTP 账号,得靠 sasl_passwd + smtp_sasl_auth_enable = yes 中继出去。以腾讯企业邮箱为例(SMTP 地址 smtp.exmail.qq.com,端口 587):
实操步骤:
- 编辑
/etc/postfix/sasl_passwd,写入:smtp.exmail.qq.com your@domain.com:your_app_password
(注意:不是邮箱登录密码,是「开启 SMTP 时生成的专用密码」); - 运行
postmap /etc/postfix/sasl_passwd生成 db 文件; - 在
/etc/postfix/main.cf末尾追加:smtp_sasl_auth_enable = yes<br>smtp_sasl_security_options = noanonymous<br>smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd<br>smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt<br>smtp_use_tls = yes<br>relayhost = [smtp.exmail.qq.com]:587
; - 重启:
systemctl restart postfix; - 测试:
echo "body" | mail -s "subject" test@xx.com,再看tail -f /var/log/mail.log是否出现status=sent。
阿里云邮件推送同理,把 relayhost 改成 [smtpdm.aliyun.com]:80 或 :465(注意:465 要配 smtp_tls_security_level = encrypt)。
宝塔 PHP 邮件函数失败:disable_functions 拦了 mail(),或 sendmail_path 指向错误
即使 postfix 跑起来了,PHP 还是发不出邮件,大概率卡在这两个地方:
-
mail()在php.ini的disable_functions里被禁用了(宝塔默认会加)—— 查phpinfo()页面确认; -
sendmail_path没指向真实可执行文件:默认值可能是/usr/sbin/sendmail -t -i,但你装的是 postfix,该路径下其实是空的或软链失效;应改成/usr/sbin/sendmail -t -i(postfix 兼容这个路径)或显式写/usr/bin/sendmail -t -i; - 改完记得重载 PHP:宝塔后台「软件商店 → PHP → 设置 → 重载配置」,别只改 ini 就以为完事。
另外,mail() 不返回具体错误,要用 error_get_last() 或开 log_errors = On + error_log = /var/log/php-mail.log 才能看到底层拒信原因。
最易忽略的一点:腾讯/阿里 SMTP 要求发信人地址(From: 头)必须和认证账号完全一致,PHP mail() 如果没显式设 From,会用 www 用户名拼出 www@hostname,直接被拒绝 —— 必须在第五个参数传 -f your@domain.com。










