我试图通过以下代码通过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代码指定的头文件?
答案 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
[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.com
为Return-path
的方式对我来说已经有用了。
但是-如果您想完全更改电子邮件地址,则可以在/etc/email-addresses
中将其配置为
www-data: notifications@example.com
之后,默认情况下使用
发送电子邮件Return-path: <notifications@example.com>