2024年PHP开发者大会日本站

运行时配置

这些函数的行为受php.ini中的设置影响。

邮件配置选项
名称 默认值 可更改 变更日志
mail.add_x_header "0" INI_PERDIR  
mail.log NULL INI_SYSTEM|INI_PERDIR  
mail.force_extra_parameters NULL INI_SYSTEM|INI_PERDIR  
SMTP "localhost" INI_ALL  
smtp_port "25" INI_ALL  
sendmail_from NULL INI_ALL  
sendmail_path "/usr/sbin/sendmail -t -i" INI_SYSTEM  
有关INI_*模式的更多详细信息和定义,请参见配置设置的位置

以下是配置指令的简短说明。

mail.add_x_header bool

添加包含脚本UID和文件名后缀的X-PHP-Originating-Script

mail.log string

将记录所有mail()调用的日志文件的路径。日志条目包括脚本的完整路径、行号、To地址和标头。

mail.force_extra_parameters string

强制添加指定参数作为额外参数传递给sendmail二进制文件。这些参数将始终替换mail()的第五个参数的值。

SMTP string

仅在Windows下使用:PHP应使用的SMTP服务器的主机名或IP地址,用于使用mail()函数发送的邮件。

smtp_port int

仅在Windows下使用:使用mail()发送邮件时连接到使用SMTP设置指定的服务器的端口号;默认为25。

sendmail_from string

直接通过SMTP发送邮件时应使用哪个"From:"邮件地址(仅限Windows)。此指令还设置"Return-Path:"标头。

sendmail_path string

可以找到sendmail程序的位置,通常是/usr/sbin/sendmail/usr/lib/sendmailconfigure会尽力为您找到它并设置默认值,但如果失败,您可以在此处设置。

不使用sendmail的系统应将此指令设置为其邮件系统提供的sendmail包装器/替换程序(如果有)。例如,» Qmail用户通常可以将其设置为/var/qmail/bin/sendmail /var/qmail/bin/qmail-inject

qmail-inject不需要任何选项即可正确处理邮件。

此指令也适用于Windows。如果设置,则忽略smtpsmtp_portsendmail_from,并执行指定的命令。

添加注释

用户贡献的注释 4条注释

elitescripts2000 at yahoo dot com
10年前
在Ubuntu 13.04上,不确定其他发行版。

如果您只是取消默认注释

sendmail_path = "sendmail -t -i"

您的mail()函数都会失败。这是因为,您应该放置完整路径(即/usr/sbin/sendmail -t -i)

文档说明PHP尽力找到正确的sendmail路径,但它显然对我失败了。

因此,始终输入sendmail的完整路径,否则您可能会得到意外的失败结果。

作为次要说明:那些只想强制使用-f参数的人,可以使用php.ini中的以下方法:

mail.force_extra_parameters = [email protected]

您可以将sendmail路径注释掉,它仍然会使用默认值(在UNIX下-t -i选项,如果您查找它们,它们非常重要)....

但是,现在无法更改此设置,即使使用mail()函数的第五个参数也不行。-f很重要,因为如果没有设置,它将设置为运行PHP脚本的任何用户,而您可能不希望这样。

此外,-f设置Return-Path:标头,该标头用作错误发生时的退回地址,以便您可以处理它们。由于某种原因,您无法在mail()标头中设置Return-Path: ... 以前您可以。
jscholz at wisc dot edu
2年前
文档应明确说明,当仅使用/usr/sbin/sendmail时,sendmail不会默认为-t -i。您实际上需要指定选项。

我知道这看起来可能显而易见,但我浪费了数小时试图让mail()工作,只是发现sendmail程序并没有像文档中规定的那样默认传递-t和-i。
php dot net at ii0 dot net
8年前
如果任何人在PHP错误日志中收到此神秘的错误消息
"sh: -t: command not found"
从PHP 5.4升级后,这可能是您的解决方案。

我将PHP从5.4升级到5.6,我们所有的mail()功能突然中断,没有有用的错误日志。

如果这是您遇到的情况,并且您一直在使用ini_set()设置“sendmail_path”,请注意,即使升级文档中(或我在php.net(或十几个论坛)上找到的任何其他地方)似乎没有提到这一点——您现在需要在php.ini文件中设置sendmail_path;如果您使用ini_set()动态指定sendmail二进制文件的路径,它现在将被忽略。

因此,只需在php.ini中指定“sendmail_path”即可。就这么简单——这修复了我们所有的mail()功能。

希望这条小注释能为其他人节省与我解决问题和研究时一样多的时间。干杯!
Mark Simon
5年前
值得重申的是,如上所述,sendmail_path也适用于Windows,覆盖其他Windows SMTP设置。

php.ini中的注释“仅限Unix”没有明确说明这一点。

这使得替换虚假的sendmail程序甚至shell脚本/批处理文件以将邮件保存到文本文件相对容易。

我在教学或PHP测试时使用此技术。
To Top