如何使用 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_modeOff 时,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=OffLucas 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 邮件从地址更改信封?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改后缀的默认电子邮件地址? [关闭]

如何使用php从xampp发送具有匿名名称的电子邮件

使用 PHP 和图像跟踪电子邮件

php imap 从电子邮件地址获取

如何使用 PHP 检查电子邮件地址是不是真实或有效

当使用 PHP 在后端验证电子邮件时,如何将输入提交从禁用更改为启用?