You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Debian Jessie后PHP Mail函数失效问题求助

解决Debian Jessie升级后PHP mail()函数失效问题

刚巧处理过一模一样的场景——升级到Jessie后,用mpm-itk隔离站点用户,结果PHP mail()跑不起来,报的错和你完全一致。下面给你一步步拆解解决:

问题根源

你的PHP进程是以各个站点的独立用户运行(而非www-data),当调用sendmail(实际是Exim4的软链接)时,Exim默认会尝试切换到gid=33(www-data的组ID)或者uid=0(root),但当前运行PHP的站点用户没有权限做这个身份切换,于是触发了报错。

解决方案

方案1:将站点用户加入Exim的信任列表(推荐)

Exim的trusted_users配置项允许指定的用户调用它时,跳过身份切换的步骤,直接以调用者的身份运行。

  1. 编辑Exim的本地配置文件(Debian Jessie用的是split配置,所以找这个文件):
    nano /etc/exim4/conf.d/main/00_local_settings
    
  2. 添加一行配置,把你的所有站点用户、apache、www-data都加进去(替换成你实际的用户名):
    trusted_users = siteuser1 siteuser2 siteuser3 apache www-data
    
    如果你的站点用户是按域名管理的,也可以用动态查找的方式(比如你有/etc/virtual/domains文件映射域名到用户):
    trusted_users = ${lookup{$sender_address_domain}lsearch{/etc/virtual/domains}{$value} {www-data apache}}
    
  3. 更新Exim配置并重启服务:
    update-exim4.conf
    service exim4 restart
    

方案2:调整PHP的sendmail_path参数

如果不想修改Exim全局配置,也可以给PHP的sendmail命令加参数,强制Exim以调用者身份运行:

  1. 找到你的PHP配置文件(比如/etc/php5/apache2/php.ini),修改sendmail_path为:
    sendmail_path = /usr/sbin/sendmail -t -i -oMrfc2822 -au
    
    其中-au参数告诉Exim使用调用者的UID/GID来运行,跳过身份切换。
  2. 重启Apache生效:
    service apache2 restart
    

验证测试

切换到某个站点用户,手动测试sendmail是否能正常工作:

su - siteuser1
echo -e "To: test@example.com\nSubject: Test Mail\n\nThis is a test from siteuser1" | /usr/sbin/sendmail -t -i

如果能收到邮件,说明配置生效了,再去测试PHP的mail()函数即可。


内容的提问来源于stack exchange,提问作者Yasiru G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:22:28