如何使用 PHP 邮件从地址更改信封?
Posted
技术标签:
【中文标题】如何使用 PHP 邮件从地址更改信封?【英文标题】:How to change envelope from address using PHP mail? 【发布时间】:2010-09-15 19:02:59 【问题描述】:我在 Linux 上使用 php 和 Apache,以及 Sendmail。我使用 PHP mail
函数。电子邮件已发送,但信封在MAIL FROM
中有Apache_user@localhostname
(例如nobody@conniptin.internal),并且一些远程邮件服务器拒绝此,因为域不存在(显然)。使用mail
可以强制换信封MAIL FROM
吗?
编辑:如果我在mail
() 函数的第四个字段中添加标题,则会更改邮件正文标题中的From
字段,并且不会更改信封MAIL FROM
。
我可以通过使用sendmail -t -odb -oi -frealname@realhost
生成 sendmail 并将电子邮件内容传送给它来强制它。这是更好的方法吗?
有没有更好、更简单、更适合 PHP 的方法来做到这一点?
编辑:底线是我应该有 RTM。谢谢大家的回答,第五个参数有效,一切都很好。
【问题讨论】:
【参考方案1】:mail() 有第 4 和第 5 个参数(可选)。第 5 个参数应该作为选项直接传递给 sendmail。我使用以下内容:
mail('to@blah.com','subject!','body!','From: from@blah.com','-f from@blah.com');
【讨论】:
注意:您可能还需要将发件人添加到 /etc/mail/trusted-users。 在我的机器上找不到受信任的用户:/ @Lucas Oman:+1 你的答案是对的,只是想警告任何可能感兴趣的人,在几乎所有共享托管服务(cPanel/WHM)上,PHP 邮件功能第 5 参数-f ...
已禁用由SAFE MODE Restriction in effect
提供,并且只会在不更改默认信封的情况下显示 PHP 警告,因此在这些情况下您的答案将不是一个选项。关于德文评论,/etc/mail/trusted-users
不能在共享主机上更改,因为属于主服务器配置。
添加到我的最后一条评论 safe_mode
自 PHP 5.3.0 起已弃用 [ref. php.net/manual/en/features.safe-mode.php] 因此,如果您的共享托管服务仍然有它,您可以向其技术支持投诉。当 PHP safe_mode
是 Off
时,Lucas Oman 的答案非常有效。
这在 Windows 上不起作用(通过 SMTP 发送)。仅在使用 sendmail 时。对于 Windows,您需要修改 PHP 配置或调用 ini_set('sendmail_from', 'yourmail@example.com');
。【参考方案2】:
PHP Official documentation for mail()
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
...
附加参数(可选)
additional_parameters 参数可用于传递额外的 标记为配置为使用的程序的命令行选项 发送邮件时,由
sendmail_path
配置定义 环境。例如,这可用于设置信封发件人 使用带有-f
sendmail 选项的sendmail 时的地址。这个参数在内部被
escapeshellcmd()
转义以防止 命令执行。escapeshellcmd()
阻止命令执行,但是 允许添加其他参数。出于安全原因,它是 建议用户清理此参数以避免添加 shell 命令中不需要的参数。由于
escapeshellcmd()
是自动应用的,一些字符 不允许使用互联网 RFC 的电子邮件地址。 邮件() 不能允许这样的字符,所以在程序里使用这样的 字符是必需的,发送电子邮件的替代方式(例如 建议使用框架或库)。应将运行网络服务器的用户添加为受信任用户 到 sendmail 配置以防止“
X-Warning
”标头 当使用设置信封发件人 (-f
) 时将其添加到邮件中 这种方法。对于 sendmail 用户,此文件为/etc/mail/trusted-users
。
【讨论】:
知道在像共享主机这样的非 unix 环境中我在哪里可以找到与/etc/mail/trusted-users
等效的东西吗?【参考方案3】:
你可以试试这个(我不确定):
ini_set("sendmail_from", yourmail@example.com);
mail(...);
ini_restore("sendmail_from");
【讨论】:
好主意,我在共享主机上试过这个,但不幸的是这不是一个解决方法,因为当safe_mode=On
甚至ini_set("sendmail_from"
被忽略时。而当safe_mode=Off
Lucas Oman 的回答更简单、更快捷 [***.com/questions/179014/…
这仅适用于 Windows 服务器(如 PHP.ini 中所述),但非常有用。【参考方案4】:
我还建议您查看PHPMailer。它非常适合创建和发送电子邮件,简化了流程,并且支持 SMTP。
【讨论】:
PHPMailer 似乎完全使用了 PHP 邮件第 5 参数-f ...
,正如 Lucas Oman 在上面的回答中所建议的那样。你可以在PHPMailer源文件class.phpmailer.php
中的function MailSend
中看到它@【参考方案5】:
您真正需要做的是更改运行 Apache 的机器的 主机名,以及运行 Apache 的 用户。
在你目前的情况下是:
Apache 用户:没有人 服务器主机名:conniptin.internal更改这两个值非常简单,可以解决问题的根源。
虽然如果您需要从 PHP 中执行此操作,那么也许可以使用 system/exec
函数。但我认为它在实践中不会起作用,因为您需要重新启动 Apache,并且可能还需要重新启动整个主机才能使用新名称。
【讨论】:
更改主机名并以不同的用户身份运行 Apache 会产生深远的影响(在后一种情况下会造成严重的安全后果),并且通常是组织政策或您的共享主机提供商不允许的。 嗯,这确实解决了我的问题(经过一些谷歌搜索)......但我在 VPS 上。以上是关于如何使用 PHP 邮件从地址更改信封?的主要内容,如果未能解决你的问题,请参考以下文章