带有 www-data 的 PHP 邮件问题编辑我的 php.ini

2022-08-30 16:38:25

我正在尝试通过以下代码通过PHP的mail函数调用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);

但是,在我的邮件中.log我收到一条消息,指出发件人不是我在标头中指定的地址:

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

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


答案 1

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

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

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

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

编辑

关于可以传递给 sendmail 的可选标志:将设置 From 地址,将覆盖 sendmail 生成的默认 Return 路径(通常使用 From 地址)。如果您希望退回邮件转到与发件人地址不同的地址,请尝试同时使用这两个标志:-f-r-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 =

答案 2

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

我在将标头重新写入时遇到了同样的问题,我最终将其跟踪到ssmtp桥接服务,该服务正在将邮件从我们的Web服务器管道传输到我们的邮件服务器。我在文件中添加了该行,问题消失了。From:www-data@host...FromLineOverride=YES/etc/ssmtp/ssmtp.conf


推荐