mail()在Web服务器执行时不起作用

时间:2014-05-09 14:29:29

标签: php email postfix-mta

详细说明:

  • OS:CentOS
  • Web服务器:apache 2.2
  • PHP版本:5.3.3
  • MTA:Postfix

sendmail.php

<?php
    mail('example@example.com','subject','message');
?>

当我输入命令php sendmail.php时,此功能正常工作,但当由Web服务器通过浏览器执行时,mail()无效。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

通常情况下,在Centos上工作时,我遇到的问题是命令行而不是浏览器,这是一个SELinux问题。尝试通过键入

来检查SELinux的状态
  

getenforce

如果SELinux正在执行,请通过键入

暂时将其设置为许可模式
  

setenforce 0

重试邮件功能。如果成功,您就会遇到SELinux标签问题。

以下是两个可以帮助您的链接。

https://wiki.gentoo.org/wiki/SELinux/Tutorials/Permissive_versus_enforcing http://wiki.centos.org/HowTos/SELinux

基本上,您需要将浏览器尝试使用的进程重新标记为“httpd_sys_content_t”,您可以通过列出php文件所在的目录来检查当前标签。使用Z选项

cd /var/www/html/    
ls -lahZ

你的标签应该是这样的:

-rwxrwx-rx. root apache(whatever your apache user  group is) unconfined_u:object_r:httpd_sys_content_t:s0

如果它看起来不像那样,apache就无法执行该文件,这就是它不发送的原因。

要更改标签,您需要对导致问题的文件执行chcon:

cd /var/www/html/project_directory
chcon -v --type=httpd_sys_content_t sendmail.php

另请注意,setenforce 0不会持续重启,您应该将SELinux恢复为强制执行

setenforce 1

在证明邮件将以SELinux许可模式发送后,如果上述问题无法解决您的问题,则下一个问题可能是SELinux布尔值。您可以使用此命令查看所有布尔值的列表:

getsebool -a

这是一个非常令人生畏的列表,我们只想要处理apache,httpd的布尔值。因此,让grep为此,并通过更少的管道。

getsebool -a | grep 'httpd' | less

这为我们提供了一个更易于管理的列表。你应该看到一个名为

的布尔值
httpd_can_sendmail

可能看起来像这样:

httpd_can_sendmail --> off

我们希望打开它。您可以使用此命令

执行此操作
setsebool -P httpd_can_sendmail on

请注意-P,这使得此更改在计算机重新启动时仍然存在。 http://wiki.centos.org/TipsAndTricks/SelinuxBooleans