详细说明:
sendmail.php
:
<?php
mail('example@example.com','subject','message');
?>
当我输入命令php sendmail.php
时,此功能正常工作,但当由Web服务器通过浏览器执行时,mail()
无效。
为什么会这样?
答案 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