当普通的旧PHP mail()可以使用时,为什么wp_mail()不让我设置From:标头?


32

当我使用wp_mail( $to, $subject, $message, $headers )(当然有适当的值)时,将使用发自名称的电子邮件和未在我能找到的任何地方设置的电子邮件(即使在PHP或Apache设置中也是如此)发送电子邮件。但是,使用mail( $to, $subject, $message, $headers )替代方法就可以了。会发生什么wp_mail()导致这种情况?

Answers:


44

@helenyhou:

您可以设置标题,而不必使用参数。WordPress使用“挂钩”,您需要使用的挂钩'wp_mail_from''wp_mail_from_name'挂钩。

这是您可能添加到主题functions.php文件中的钩子,用于"From:"在使用wp_mail()电子邮件地址时修改标题Helen Hou-Sandi <helenyhou@example.com>

add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
  return 'helenyhou@example.com';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
  return 'Helen Hou-Sandi';
}

我只是看过滤器,而您说的对,它确实可以解决问题。我想应该更新食典?codex.wordpress.org/Function_Reference/wp_mail 也相关:这似乎影响了许多表单插件,包括强大的GravityForms。我当前正在编写一个自定义表单,但是如果这就是WP的行为方式,为什么使用常规的old方法设置标头对其他人(甚至是我的某些其他网站)有效?
helenhousandi 2011年

@helenyhou-为避免影响其他形式,您需要在调用之前在插件中添加过滤器wp_mail(),然后在之后将其删除。至于为什么设置标头起作用,我不知道您的其他用例是什么,但是如果wp_mail()能以这种方式起作用,我会感到惊讶。
MikeSchinkel '02

2
我发现发生了什么-另一个插件正在全局添加过滤器,以解决我没有要求也不能选择退出的问题-糟糕,糟糕,糟糕。因此,现在常规标头毕竟可以工作。不过,似乎最好使用这些过滤器,如果它们在其中的话。
helenhousandi 2011年

此处仅需注意,可以通过remove_filter(HOOK,FUNCTION)删除插件添加的任何过滤器。
杰森·科尔曼

仅当发件人电子邮件域与站点相同时才有效。
Omer

4

好吧,如果您From: "Your Name" <youremail@example.com>\r\n在标题中使用格式,则应该没有问题(除非您安装了覆盖wp_mail函数的插件)。

但是,正如Mike所说,您可以使用这些过滤器过滤最终值,也可以只安装此插件:

从发送

它会为您提供一个选项设置,以确定在wp_mail中使用的名称和电子邮件。


1

抱歉,您可以重新回答一个老问题,但是通过标题设置这样不是更好吗:

$subject  = "MyPlugin: Alert (".get_bloginfo('wpurl').")";
$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=".get_bloginfo('charset')."" . "\r\n";
$headers .= "From: MyPlugin <".$this->settings['from_address'].">" . "\r\n";
wp_mail($this->settings['notify_address'], $subject, $alertMessage, $headers);

这样,您不必担心使用过滤器,然后在wp_mail()之后将其删除。


2
我没有设置过滤器,另一个插件做了。过滤器优先于标头。此外,您确实应该使用site_url()代替get_bloginfo('wpurl')
helenhousandi 2011年

但是,那么可以肯定的是插件是坏后本身不清理....不是很多,你可以做些什么,虽然:(在这种情况下我更好地改变我的插件来使用过滤器,以防万一其它插件已经打破它。
布雷迪

@helenyhou-+1提醒我有关site_url()的信息。我还更改了插件以使用过滤器,而不是使用$ header。另外,一旦发送电子邮件,我就确保删除了这些过滤器,以免造成其他问题:)
Brady

是的,这是该插件的弊端,因为它没有给我选择不使用这些过滤器的选项,而是幸运地注释掉为我的案例设计的过滤器。我可能会问周围,看看将来使用哪个更好-每次使用的过滤器或更熟悉的标题。标头可能更有效,但是为什么那些过滤器在那里?总是有更多问题:)
helenhousandi 2011年

从当前版本开始,完全可以接受get_bloginfo('wpurl')site_url()已经返回。get_bloginfo('home')get_bloginfo('siteurl')已弃用。developer.wordpress.org/reference/functions/get_bloginfo
詹姆斯中号

1

这有点hack,但是您也可以使用Reply Toheader标记:

$headers = 'Reply-To: "Aaren A. Aarenson" <aaron@somemail.com>';

遗憾的是,这会将电子邮件地址添加到“发件人”列表中,而答复意味着您将必须手动删除wp_mail_from过滤器中配置的地址。


这为我解决了。你救了一个命伴!;)
user382738

0

我有同样的问题。对我来说,托管服务提供商(BlueHost)阻止更改from字段。他们在这里对其进行了解释https://my.bluehost.com/cgi/help/206

我通过将电子邮件添加到cPanel邮箱中来解决问题,就像他们说的那样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.