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
我使用 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