PHP邮件问题与www-data

时间:2011-04-14 16:18:00

标签: php sendmail

我试图通过以下代码通过PHP的邮件功能调用sendmail:

$to      = 'blah@email.state.edu';
    $subject = 'test';
    $message = 'test';
    $headers = 'From: mail@smartrek.blah.me' . "\r\n" .
               'Reply-To: mail@smartrek.blah.me' . "\r\n" .
                'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);

但是在我的mail.log中,我收到一条消息,指出from不是我在标题中指定的地址:

<www-data@Name>: Sender address rejected: Domain not found

这是为什么?我在ubuntu上运行PHP的fast-cgi 为什么sendmail不使用我通过PHP代码指定的头文件?

6 个答案:

答案 0 :(得分:25)

www-data@Name看起来像是“来自”地址的信封。信封“发件人”地址与电子邮件“发件人:”标题中显示的地址不同。这是sendmail在其“MAIL FROM / RCPT TO”中与接收邮件服务器交换使用的内容。它被称为“信封”地址的主要原因是在邮件标题和正文中出现外部,在邮件服务器之间的原始SMTP交换中。

unix上的默认信封“from”地址取决于您使用的sendmail实现。但通常会将其设置为正在运行的进程的用户名,后跟“@”和计算机的主机名。在典型配置中,这看起来像username@example.com

如果您的电子邮件被接收邮件服务器拒绝,或者您需要更改发送回邮电子邮件的地址,您可以更改信封“从”地址以解决您的问题。

要更改unix上的“from”地址信封,请为sendmail二进制文件指定“-r”选项。您可以通过在“sendmail_path”命令行中添加“-r”选项在php.ini中全局执行此操作。您也可以通过将-r mail@smartrek.blah.me作为附加参数参数传递给mail()函数(第5个参数),在PHP中以编程方式执行此操作。如果在两个位置都指定了一个地址,则将使用两个“-r”选项调用sendmail二进制文件,这可能具有未定义的行为,具体取决于您的sendmail实现。使用Postfix MTA,以后的“-r”选项会静默覆盖先前的选项,从而可以设置全局默认值,并且当您尝试在本地覆盖它时仍然可以获得合理的行为。

修改

关于可以传递给sendmail的可选标志: -f将设置发件人地址,-r将覆盖sendmail生成的默认返回路径(通常为From地址被使用)。如果您希望退回到与地址不同的地址,请尝试同时使用两个标记:-f mail@smartrek.blah.me -r bounced-mail@smartrek.blah.me

我的php.ini

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log =

答案 1 :(得分:8)

虽然这是一个老问题,但我正在添加这个答案,以防它对某人有所帮助:

我遇到了同样的问题,From:标头被重写为www-data@host...我最终将其跟踪到ssmtp桥接服务,该服务将来自我们的Web服务器的邮件传送到我们的邮件服务器。我在文件FromLineOverride=YES中添加了行/etc/ssmtp/ssmtp.conf,问题就消失了。

答案 2 :(得分:5)

在我的情况下,我有一个托管服务器,所以我需要编辑这个文件:

  

/etc/ssmtp/ssmtp.conf

然后取消注释这一行:

  

FromLineOverride = YES

完成后,个人标题正在运行。

答案 3 :(得分:0)

这对我有用:

$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto; 

答案 4 :(得分:0)

在发送和接收所有带有此标头的邮件时,我也遇到了www-data的类似问题:

From: www-data <www-data@example.com>

我将-f info@example.com标志用作PHP email()函数的第五个参数(如已接受的答案所述),但我仍收到以下电子邮件:

From: www-data <info@example.com>

因此,我又添加了一个标志-f info@example.com -F info来设置电子邮件的全名,最后我得到了想要的电子邮件:

From: info <info@example.com>

我正在发布此答案,因为这里没有人提及它,我对此有些卡住。

答案 5 :(得分:0)

我在使用 exim4 smarthost 时遇到了这个问题。邮件使用

发送
Return-path: <www-data@servername>

被ISP拒绝。我需要将其至少更改为www-data@example.com(假设“ example.com”是服务器的公共域名)。我可以通过从{p>更改/etc/mailname来实现

servername

example.com

www-data@example.comReturn-path的方式对我来说已经有用了。

但是-如果您想完全更改电子邮件地址,则可以在/etc/email-addresses中将其配置为

www-data: notifications@example.com

之后,默认情况下使用

发送电子邮件
Return-path: <notifications@example.com>