Фильтры - Как Добавить Заголовки К Исходящей Электронной Почте?

  • Автор темы Anton Golubnichenko
  • Обновлено
  • 21, Oct 2024
  • #1

Я хочу добавить дополнительный заголовок к исходящим электронным письмам на своих сайтах, чтобы можно было легко определить, какой сайт отправил данное письмо. (Я установил плагин стандартной функциональности на все свои сайты, так что это достаточно легко сделать, а настройка моего почтового клиента на фильтрацию и другие действия с этим заголовком могла бы значительно сэкономить время.)

Я думал, что это будет простой вопрос подключения к

add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header($args) {

$new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));

return wp_parse_args($args, $new_header);
}
function, but evidently it isn't.

Сначала я попробовал это:

add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header() {

return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
}

Здесь мой массив имел приоритет над всем остальным, что изменяло настройки почты (скажем, Gravity Forms), поэтому электронные письма в формате HTML начали отображаться как чистый HTML и не отформатированы должным образом. Это имеет смысл, поскольку заголовок Content-type:, добавленный GF, был очищен. Но мой заголовок был добавлен в письмо. Поскольку другие также зависят от получения красивых электронных писем (я уверен, среди всех разработчиков контента и конечных пользователей моих сайтов), это неприемлемо.

Затем один из моих коллег предложил маршрутизировать мои данные через wp_parse_args(), таким образом:

wp_mail

При этом моя функция как будто не существует — мой заголовок не добавляется, но и чужие заголовки и настройки почты не удаляются.

Как правильно добавить заголовок к исходящему электронному письму, не запутывая какие-либо другие фильтры, которые могут существовать?

#фильтры #электронная почта #wp-mail

Anton Golubnichenko


Рег
23 Oct, 2020

Тем
81

Постов
189

Баллов
614
  • 25, Oct 2024
  • #2

Благодаря вышесказанному я осознал свою главную ошибку — я не совсем осознавал, что передаваемые аргументы представляют собой многомерный массив.

На данный момент я повторно реализовал функцию следующим образом:

999

Мое чтение исходного кода wp_mail() (см.: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235) заставляет меня поверить, что компонент заголовков может быть массивом, или большой строкой, или, возможно, какой-то ужасной смесью этих двух, но использование массива, вероятно, является более безопасным/более правильным вариантом.

Мне нравятся различные ответы phpmailer, но мне кажется, что проще попытаться сделать что-то, используя встроенные модули WordPress.

 

Umaxse


Рег
30 Jan, 2006

Тем
71

Постов
190

Баллов
565
  • 25, Oct 2024
  • #3

Вот альтернатива, используя непосредственно

99
method of the
add_filter('wp_mail', 'ws_add_site_header', 99);
function ws_add_site_header($args) {

$args['headers'] .= !empty($args['headers']) ? "\r\n" : '';

$args['headers'] .= 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST);

return $args;
}
пример:

\r\n

Здесь мы видим, что есть два способа его использования:

Пример №1:

Здесь мы передаем только информацию заголовка в

headers
input string, that's seperated with
add_action( 'phpmailer_init', function( $phpmailer )
{   

$phpmailer->AddCustomHeader( 

'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) 

);  
} );

$value

Пример №2:

Вот оба

$name
and
add_action( 'phpmailer_init', function( $phpmailer )
{   

$phpmailer->AddCustomHeader( 

'X-WU-Site: ' . parse_url( get_site_url(), PHP_URL_HOST ) 

);  
} );
непустой:

:



PHP

$name
are strings. You can not parse them as array. You need to add you additional header as string with
/**

* Add a custom header.

* $name value can be overloaded to contain

* both header name and value (name:value)

* @access public

* @param string $name Custom header name

* @param string $value Header value

* @return void

*/
public function addCustomHeader($name, $value = null)
{

if ($value === null) {

// Value passed in as name:value

$this->CustomHeader[] = explode(':', $name, 2);

} else {

$this->CustomHeader[] = array($name, $value);

}
}
чтобы убедиться, что он добавлен в следующей строке.

Пример:

PHPMailer

Также обратите внимание: добавьте дополнительные заголовки, наконец, с приоритетом.

AddCustomHeader
so no other plugin can replace it if it is not checking that headers already present. If needed make it
function ws_add_site_header($email) {

$email['headers'][] = 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST) ;

return $email;               
}
.

 

Toxelornnex


Рег
15 Nov, 2010

Тем
55

Постов
194

Баллов
499
Похожие темы Дата
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно