PHP 的 mail() 函数在 CLI 中有效,但在 Apache 中无效

PHP 的 mail() 函数在 CLI 中有效,但在 Apache 中无效

我在用着邮件传输协议作为中继并尝试使用 mail() 函数发送电子邮件。它在 CLI 中运行良好,但在 Apache 中却无能为力。我的 cli 和 apache 的 PHP 配置相同,任何日志中都没有错误,我真的没有主意了。

知道这可能是什么原因造成的吗?

答案1

我找到了这个问题的解决方案。我正在使用邮件传输协议,它是一个 SMTP 代理,工作方式与 sendmail 类似,因此,当尝试发送邮件时,会从 php 调用 msmtp 命令,其语法与 sendmail 类似。

现在,msmtp 命令将由运行 apache2 的同一用户运行。在我的例子中是 www-data。

有一个 msmtp 配置文件(在我的情况下是 /etc/.msmtp_php),需要 www-data 用户可读。

CLI 可以工作而 Apache PHP 不工作的原因是,我在 root 下运行 CLI,它具有该文件的正确权限,但 apache2 在 www-data 下运行,它没有这些权限。

所以解决方案是: chown/etc/.msmtp_php 文件 www-数据:www-数据并将同一文件 chmod 为0600,否则,msmtp 将会抱怨权限松散。

答案2

您可以在 exec() 函数中使用它来发送邮件。

exec('usr/bin/mail <parameter>', $output); //$output for debugging

检查输出的响应,但您仍然必须解决使用 phpmail()函数的设置。

答案3

首先:检查您是否确实正在使用php.ini您认为的文件。

例如,php.ini如果启用了 ,Apache 可以为每个用户使用不同的位置mod_suphp。使用 suPHP,位置由suPHP_ConfigPath指令设置mods-enabled/suphp.conf,即使PHPIniDir为全局配置设置了不同的位置,它也会默认为 PHP 的编译默认路径。(PHP:配置文件php.ini提供有关搜索顺序的更多信息。)

  1. 您可以php.ini通过使用<?php phpinfo(); ?>同一目录来获取位置。
  2. mail()您可以使用以下函数直接获取当前使用的 SMTP 服务器ini_get()

    <?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>

如果 SMTP 服务器正确,则mail()函数应返回TRUE邮件是否成功接收并投递,否则返回FALSE。在这两种情况下,如果函数能够连接 SMTP 服务器,则可以在以下位置找到有关连接的更多信息:SMTP 服务器日志文件

如果mail()返回FALSE未连接到 SMTP,请检查您是否有启用 safe_mode 并mail()设置 additional_parameters. 来自更新日志(PHP 版本 4.2.3):

附加参数参数在 safe_mode 下被禁用,并且 mail()函数在使用时将显示警告消息并返回FALSE

相关内容