我在用着邮件传输协议作为中继并尝试使用 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
提供有关搜索顺序的更多信息。)
- 您可以
php.ini
通过使用<?php phpinfo(); ?>
同一目录来获取位置。 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
。