如何使用PHP邮件从地址更改信封?

时间:2008-10-07 15:23:28

标签: php email

我在Linux上使用PHP和Sendmail一起使用PHP。我使用PHP mail函数。电子邮件已发送,但信封中Apache_user@localhostname位于MAIL FROM(例如nobody@conniptin.internal),而某些远程邮件服务器拒绝此邮件,因为该域名不存在(显然)。使用mail,我可以强制它更改信封MAIL FROM吗?

编辑:如果我在mail()函数的第四个字段中添加标题,则会更改邮件正文标题中的From字段,并且不会更改信封MAIL FROM

我可以通过使用sendmail -t -odb -oi -frealname@realhost生成sendmail并将电子邮件内容汇总到它来强制它。这是一种更好的方法吗?

有没有更好,更简单,更适合PHP的方法呢?

编辑:底线是我应该有RTM。谢谢你的回答,第五个参数有效,一切都很顺利。

5 个答案:

答案 0 :(得分:66)

mail()有第4个和第5个参数(可选)。第五个参数是应该作为选项直接传递给sendmail的内容。我使用以下内容:

mail('to@blah.com','subject!','body!','From: from@blah.com','-f from@blah.com');

答案 1 :(得分:2)

PHP Official documentation for mail()

  

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

     

...

     

additional_parameters(可选)

     

additional_parameters 参数可用于传递其他内容   flags作为配置为使用的程序的命令行选项   发送邮件时,由sendmail_path配置定义   设置。例如,这可用于设置信封发件人   将sendmail与-f sendmail选项一起使用时的地址

     

此参数在内部由escapeshellcmd()转义以防止   命令执行。 escapeshellcmd()阻止命令执行,但是   允许添加其他参数。出于安全原因,它是   建议用户清理此参数以避免添加   shell命令的不需要的参数。

     

由于escapeshellcmd()自动应用,因此会有一些字符   允许作为互联网RFC的电子邮件地址不能使用。 邮件()   不能允许这样的字符,所以在程序里面使用这样的字符   字符是必需的,发送电子邮件的替代方式(如   建议使用框架或库。

     

应将Web服务器运行的用户添加为受信任的用户   到sendmail配置以阻止“X-Warning”标头   使用时设置信封发件人(-f)时添加到邮件中   这种方法。对于sendmail用户,此文件为/etc/mail/trusted-users

答案 2 :(得分:1)

你可以试试这个(我不确定):

ini_set("sendmail_from", yourmail@example.com);
mail(...);
ini_restore("sendmail_from");

答案 3 :(得分:1)

我还建议您查看PHPMailer。它非常适合创建和发送电子邮件,使流程更容易,同时支持SMTP。

答案 4 :(得分:-9)

您实际需要做的是更改运行Apache的计算机的主机名,以及正在运行的用户

在目前的情况下,它是:

  • Apache用户: nobody
  • 服务器主机名: conniptin.internal

更改这两个值非常简单,可以解决问题的根源。

虽然如果你需要从PHP那里做,那么也许可以使用system/exec函数。我认为它不会在实践中起作用,因为你需要重新启动Apache,也可能需要重新启动整个主机以便使用新名称。