【问题标题】:PHP mail() works from command line but not apachePHP mail() 从命令行工作,但不是 apache
【发布时间】:2010-11-30 13:56:47
【问题描述】:

我试图弄清楚为什么 PHP 中的邮件函数在通过 Web 浏览器(即 apache)调用时会失败,但我可以使用命令行从命令行运行相同的脚本

php -f 邮件测试.php

这是我客户的 Fedora 服务器之一,所以我并不完全了解它,但如果我需要更改任何内容,我确实具有 root 访问权限。

来自 php.ini:

sendmail_path = /usr/sbin/sendmail -t -i

不确定这是否重要,但 /usr/sbin/sendmail 是指向 /etc/alternatives/mta 的符号链接,它是返回 /usr/sbin/sendmail.sendmail 的符号链接。 FWIW apache 用户确实有权运行 sendmail(直接从命令行测试 sendmail)。

OS: Fedora Core 7 Linux (kernel 2.6.23.17)  
Apache: 2.2.8  
PHP: 5.2.6

这里的任何帮助将不胜感激!

【问题讨论】:

  • 您可能想在 serverfault.com 上发布此内容

标签: php apache email command-line sendmail


【解决方案1】:

我发现了问题。 SELinux 阻止 apache 使用 sendmail。为了诊断,我使用了

$ sestatus -b | grep sendmail  
httpd_can_sendmail                   off

然后实际解决问题:

$ restorecon /usr/sbin/sendmail
$ setsebool -P httpd_can_sendmail 1

阅读更多相关信息here

【讨论】:

  • 很高兴你知道了。您应该接受自己的答案——授予您代表、徽章,并让其他人知道问题已得到解答。
  • 谢谢,你把我引向了正确的方向:我遇到了类似的问题,在阅读了你的帖子后,我想到它可能与我的 apparmor 安装有关......确实,这是问题。
  • 告诉我为什么默认设置为关闭??
  • setsebool -P httpd_can_sendmail 1 对我不起作用。我尝试了-V 选项,它就像一个魅力。
【解决方案2】:

是用户权限错误吗?您的帐户和用于执行 PHP 脚本的帐户可能具有不同的权限。

【讨论】:

  • 所有用户都有执行sendmail的权限。我通过以 apache 用户身份运行 sendmail 确认。
【解决方案3】:

apache 的 error_log 中有什么内容吗? PHP 是作为 apache 模块还是 CGI 二进制文件运行?

编辑:嗯...错误日志中没有任何内容。对mail(...) 的调用返回什么?邮件日志中有什么有趣的事情吗?这将取决于 MTA,通常是 /var/log/maillog

编辑 2:safe_mode 是否已打开,您是否正在使用 mail() 函数的additional_parameters

【讨论】:

  • 错误日志中没有任何内容。 PHP 正在作为 apache 模块运行。
  • 我也打开了所有错误(即 error_reporting(E_ALL); ),也没有看到任何错误或警告。
【解决方案4】:

这是我在 StackOverflow 上的第一个答案! :o

所以我和你有同样的问题,马特!我使用 OpenSuse。我发现postfix check 结果是

postfix/postfix-script: warning: not owned by group maildrop: /usr/sbin/postqueue
postfix/postfix-script: warning: not owned by group maildrop: /usr/sbin/postdrop
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop

所以我运行了下一个命令:

# my postfix user is postfix and postfix group is maildrop
sudo chown 'postfix:maildrop' /usr/sbin/post{drop,queue}
sudo chmod g+s /usr/sbin/post{queue,drop}

然后,我尝试从浏览器中编写简单的 PHP 脚本来测试一切是否正常:(假设您要发送邮件至 abc@gmail.com)

<?php
$ret = mail('abc@gmail.com', 'subject', 'message');
if ($ret === true)
  echo 'Success'.PHP_EOL;
else
  echo 'Error'.PHP_EOL;

没关系!我希望你能用这个方法解决问题

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2015-08-01
    • 2012-02-12
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2011-05-11
    • 2018-12-25
    相关资源
    最近更新 更多