Postfix 忽略 PHP mail() 函数

Postfix Ignores PHP mail() function

我使用 PHP 使用 mail() 函数成功发送邮件,但发送显示为服务器地址,而不是我在脚本中配置的地址。 Postfix 安装在 apache 服务器上。在 ServerFault answer 上,我阅读了使用 -f 和 -r 标志的方法,但这也不起作用:

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r mybounceemail@example.com");

我能做的最好的事情就是将本地机器名称 hostname 的 Postfix myorigin 更改为机器名称的父域。

这让我相信 Postfix 正在忽略或剥离 From: 元素?

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r mybounceemail@example.com");

无法工作,因为 mail() 只接受 5 个参数:bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

对我来说

mail($to, $subject, $message, null, "-r sender@example.com");
mail($to, $subject, $message, 'Name <something@example.com>', "-r sender@example.com");

工作(我在 postfix 中没有任何可能重写发件人的额外限制)。还要确保发件人的格式正确(没有空格或任何其他内容)。

但是,我建议调整 php.ini 中的 sendmail_path 设置以包含“-r mybounceemail@example.com”参数。

如果它对您不起作用,您应该 post 邮件 headers 并检查您的日志文件以查找 warnigns/errors。

PS:请确保不要将用户输入的数据直接传递给 mail(),因为如果用户可以插入换行符(例如 \nCC: something@example.com 在主题、邮件或来自邮件)您的服务器可能被用于发送垃圾邮件。

您的 mail() 调用中有 header 参数两次,因此您的 $additional_parameters 参数未被使用,因为它是函数中的第 6 个参数,仅接受 5。您应该将 header 移动到 header 的其余部分:

//Be mindful to protect from email injection attacks.
$fromname = str_replace("\n", "", $fromname);
$from = str_replace("\n", "", $from);

//This assumes that $headers is already set, containing your other headers
$headers .= 'From: ' . $fromname . ' <'.$from.">\n";

mail($to, $subject, $message, $headers, "-f $from -r mybounceemail@example.com");

使用这个,我希望你的第 5 个参数现在是多余的并且可以简化为:

$fromname = str_replace("\n", "", $fromname);
$from = str_replace("\n", "", $from);

$headers .= 'From: ' . $fromname . ' <'.$from.">\n";

mail($to, $subject, $message, $headers);

在PHP中,mail函数的语法如下:

mail($to, $subject, $message, $headers, $parameters);

所以在你的情况下,如果你想指定一个不同的 "From" 地址和一个不同的 "Return path" 你的代码应该如下:

$to = "john@example.com";
$subject = "Your reset email";
$message = "<message text / html>";
$from = "support@example.com";
$bounceEmail = "bouncey@example.com";
$headers = array(
    "From: " . $from
);
$headers = implode("\r\n", $headers);
$parameters = "-r" . $bounceEmail;

// Send it!
mail($to, $subject, $message, $headers, $parameters);

希望对您有所帮助!

您可以让 Postfix 重写 headers 并添加适当的 From: 地址。为此,Postfix 有 sender_canonical_maps.

假设您的 Web 服务器(或进程管理器)在名为 username 的用户下运行,并且您希望在 From: header 中包含 support@example.com电子邮件而不是不清楚 username@servername.example.com。然后,规范地图将包含:

#/etc/postfix/canonical
username support@example.com

配置 Postfix 以使用它再简单不过了:

postmap /etc/postfix/canonical
postconf -e sender_canonical_maps=hash:/etc/postfix/canonical

另一个选项是告诉 postfix 通过 luser_relay:

将所有从您的服务器发送的电子邮件标记为从 support@example.com 发送
postconf -ev luser_relay=support@example.com

如果您做不到,很可能有人已经为您做了这个,但做错了那个。这可能是您无法更改 From: 地址的原因,因为它已被 Postfix 强制覆盖。

在我的例子中,cron 使用了错误的 php 实例。

因此您可以通过执行以下操作来指定 php 实例:

33 * * * * /usr/bin/php /location/of/file/filename.php >> /var/log/syslog