Почему wp_mail () не разрешает мне устанавливать заголовок From: когда это делает старая старая PHP mail ()?

32

Когда я использую wp_mail( $to, $subject, $message, $headers )(со значениями на месте, конечно), электронное письмо отправляется с именем и адресом электронной почты, которые не установлены нигде, где я могу найти (даже в настройках PHP или Apache). Однако использование mail( $to, $subject, $message, $headers )вместо этого работает просто отлично. Что могло случиться, wp_mail()чтобы вызвать это?

helenhousandi
источник

Ответы:

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';
}
MikeSchinkel
источник
Я просто смотрел на фильтры, и вы правы, это решает проблему. Я полагаю, Кодекс должен быть обновлен? codex.wordpress.org/Function_Reference/wp_mail Также связано: похоже, это влияет на множество плагинов форм, в том числе на мощные GravityForms. В настоящее время я пишу пользовательскую форму, но если именно так и должен себя вести WP, почему настройка заголовков с помощью обычного старого метода работает для других (и даже для некоторых других моих сайтов)?
helenhousandi
@helenyhou - чтобы не влиять на другие формы, вам нужно добавить фильтры в свой плагин непосредственно перед вызовом, wp_mail()а затем удалить их сразу после. Что касается того, почему настройка заголовков работает, я не знаю, каковы ваши другие варианты использования, но я был бы удивлен, если wp_mail()бы работал так.
MikeSchinkel
2
Ааааа, я обнаружил, что происходит - другой плагин добавляет глобально фильтры для чего-то, чего я не просил и от которого не могу отказаться - плохо, плохо, плохо. Так что теперь обычные заголовки все-таки работают. Похоже, что использование этих фильтров было бы наилучшей практикой, если они там есть.
helenhousandi,
Просто обратите внимание, что любой фильтр, добавляемый плагином, можно удалить с помощью remove_filter (HOOK, FUNCTION).
Джейсон Колман
это работает только в том случае, если домен электронной почты совпадает с сайтом.
Омер
4

Что ж, если вы используете From: "Your Name" <youremail@example.com>\r\nформат в своих заголовках, у вас не должно быть проблем (если у вас не установлен плагин, который переопределяет функцию wp_mail).

Однако, как сказал Майк, вы можете фильтровать конечные значения с помощью этих фильтров, или вы можете просто установить этот плагин:

Отправлено из

Это даст вам настройки параметров, чтобы определить, какое имя и адрес электронной почты использовать в 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 ().

Brady
источник
2
Я не установил фильтр, другой плагин сделал. Фильтр имеет приоритет над заголовком. Кроме того, вы действительно должны использовать site_url()вместоget_bloginfo('wpurl')
helenhousandi
Но тогда, конечно, этот плагин плох для того, чтобы не очистить после себя .... не много, вы можете с этим поделать, хотя :( в этом случае я лучше поменяю свой плагин, чтобы использовать фильтр на случай, если другой плагин сломал его.
Брейди
@helenyhou - +1 за напоминание о site_url (). Я также изменил свой плагин, чтобы использовать фильтры, а не $ заголовки. Кроме того, я позаботился об удалении этих фильтров, как только отправил электронное письмо, чтобы не мешать чему-либо еще :)
Брэди,
да, это то, что плагин плох тем, что не дает мне возможность не использовать эти фильтры, но, к счастью, комментирует фильтры, разработанные для моего случая. Я, вероятно, спрошу вокруг, чтобы увидеть, что лучше использовать в будущем - фильтр для каждого использования или более знакомые заголовки. Заголовки, вероятно, более эффективны, но тогда почему эти фильтры там? Всегда больше вопросов :)
helenhousandi
Начиная с текущей версии, это полностью приемлемо для использования get_bloginfo('wpurl'): это site_url()уже возвращается . get_bloginfo('home')и get_bloginfo('siteurl')устарели. developer.wordpress.org/reference/functions/get_bloginfo
Джеймс М
1

Это немного хак, но вы также можете использовать Reply Toтег заголовка:

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

К сожалению, это добавляет адрес электронной почты в список От, и ответ означает, что вам придется вручную удалить адрес, настроенный в wp_mail_fromфильтре.

Сьорс Хейгенаар
источник
Это исправило это для меня. Вы спасли жизнь, приятель! ;)
user382738
0

У меня такая же проблема. Для меня выяснилось, что хостинг-провайдер (BlueHost) не позволяет изменить поле from. Здесь они объясняют это https://my.bluehost.com/cgi/help/206 .

Я исправил проблему, добавив письмо в почтовые ящики cPanel, как они говорят.

Тигран
источник