Чому wp_mail () не дозволить мені встановити заголовок From: коли звичайна стара пошта PHP () буде?


32

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

Відповіді:


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, чому встановлення заголовків за допомогою старого звичайного методу працює для інших (і навіть для деяких інших моїх сайтів)?
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 ().


2
Я не встановив фільтр, інший плагін зробив. Фільтр має перевагу над заголовком. Крім того, ви дійсно повинні використовувати site_url()замістьget_bloginfo('wpurl')
helenhousandi

Але тоді, безумовно, цей плагін поганий тим, що він не очищається після себе .... не багато ви можете з цим зробити, хоча :( в такому випадку я краще міняю свій плагін, щоб використовувати фільтр на випадок, якщо інший плагін його зламав.
Брейді

@helenyhou - +1 для нагадування про site_url (). Я також змінив свій плагін, щоб використовувати фільтри, а не використовувати заголовки $. Плюс я переконався видалити ці фільтри, як тільки надіслав електронний лист, щоб не
Brady

так, саме цей плагін поганий тим, що він не дав мені можливості не використовувати ці фільтри, але, на щастя, коментуючи фільтри, розроблені для мого випадку. Я, мабуть, поцікавлюся, щоб побачити, що краще використовувати в майбутньому - фільтр за використання або більш звичні заголовки. Заголовки, ймовірно, ефективніші, але чому тоді такі фільтри? Завжди більше питань :)
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фільтрі.


Це зафіксувало це для мене. Ти врятував життєвого товариша! ;)
користувач382738

0

У мене була така ж проблема. Для мене з’ясувалося, що хостинг-провайдер (BlueHost) заважав змінювати поле з поля. Ось вони пояснюють це https://my.bluehost.com/cgi/help/206 .

Я вирішив проблему, додавши електронну пошту до поштових скриньок cPanel так само, як вони кажуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.