Как отправлять HTML-форматированные письма с помощью функции wp_mail() в WordPress?

7 сент. 2011 г., 00:08:38
Просмотры: 152K
Голосов: 74

Есть ли action_hook или что-то подобное, что могло бы помочь мне достичь этого?

Я пытался добавить разметку в PHP переменную и просто отправил email с помощью функции wp_mail() таким образом:

$email_to = 'someaddress@gmail.com';
$email_subject = 'Тема письма';
$email_body = "<html><body><h1>Привет, мир!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);

Но оно отобразилось как обычный текст?

Есть идеи?

1
Комментарии

Ознакомьтесь с этой замечательной статьей о wp_mail() https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 окт. 2020 г. 15:34:56
Все ответы на вопрос 5
6
175

В качестве альтернативы вы можете указать заголовок Content-Type HTTP в параметре $headers:

$to = 'sendto@example.com';
$subject = 'Тема письма';
$body = 'Содержимое письма';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );
26 июл. 2015 г. 18:01:32
Комментарии

Этот вариант работает лучше, так как add_filter иногда отображается как вложение. Спасибо, что поделились!

deepakssn deepakssn
17 февр. 2018 г. 20:54:57

Это, как правило, лучший способ сделать это. Ответ выше может конфликтовать с другими плагинами и вызывать проблемы.

Alex Standiford Alex Standiford
6 дек. 2019 г. 21:12:35

Этот ответ должен быть принятым

CaptainNemo CaptainNemo
27 сент. 2020 г. 21:49:20

Этот ответ должен быть принятым!

Fernando Torres Fernando Torres
30 июн. 2021 г. 23:46:10

Из моего прочтения исходного кода wp_mail() следует, что заголовки не могут быть массивом, а должны быть в форме 'to: joe@domain.com'. Все еще пытаюсь это проверить, и я уступлю более опытным разработчикам, чтобы они проверили мою точность.

Rick Hellewell Rick Hellewell
6 авг. 2022 г. 01:37:14

Это намного лучше, так как с техникой add_filter() слишком легко забыть ваш remove_filter('wp_mail_content_type'); и затем оставить вещи в беспорядке для других плагинов.

Brian C Brian C
8 окт. 2023 г. 15:04:17
Показать остальные 1 комментариев
12
79

из страницы wp_mail в codex:

Тип контента по умолчанию — 'text/plain', который не позволяет использовать HTML. Однако вы можете установить тип контента письма с помощью фильтра 'wp_mail_content_type'.

// В functions.php темы или коде плагина:

function wpse27856_set_content_type(){
    return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );

Теперь каждый раз, когда вызывается wp_mail, будь то в вашем коде, коде WordPress, коде плагина или коде темы, MIME-тип будет установлен в text/html. Если есть какие-либо вызовы wp_mail, которые отправляют обычный текст, эти вызовы теперь могут сломаться. Так что будьте осторожны.

7 сент. 2011 г. 00:23:34
Комментарии

Хм, звучит полезно. Просто вопрос: есть ли какая-то особая причина, по которой вы назвали свою функцию wpse27856_set_content_type?

racl101 racl101
7 сент. 2011 г. 00:31:04

Нет, это просто уникальное имя, основанное на id этого конкретного вопроса. wpse = wp stackexchange, 27856 - это id вопроса в URL. Я делаю это, чтобы избежать потенциальных коллизий, если люди копируют/вставляют код отсюда.

Milo Milo
7 сент. 2011 г. 00:45:32

Вы также можете просто включить Content-Type в заголовки вашего email. Посмотрите, как это делает плагин Notifly.

Otto Otto
7 сент. 2011 г. 03:29:46

О да, ха-ха. Какой же я нуб. Наверное, это ID этого поста.

racl101 racl101
7 сент. 2011 г. 10:44:03

Должно ли письмо быть в формате .txt или .html? Я использую этот метод, но если посмотреть исходный код, это .txt файл, и встроенное изображение не обрабатывается.

AlxVallejo AlxVallejo
28 июл. 2012 г. 02:21:08

@AlxVallejo если вы отправляете из файла, вам, вероятно, сначала нужно прочитать файл как строку.

Blowsie Blowsie
28 янв. 2013 г. 14:48:30

Передача заголовков напрямую является более эффективным методом, чем добавление хука. -1

Jeremy Jeremy
2 нояб. 2016 г. 01:05:40

@Jeremy конечно, но прямая передача заголовков не всегда возможна, например, когда вызов wp_mail выполняется не вашим кодом.

Milo Milo
2 нояб. 2016 г. 05:20:54

@Milo Вы правы, но для данного вопроса заголовки являются правильным ответом.

Jeremy Jeremy
2 нояб. 2016 г. 23:12:13

Это нарушит работу письма для сброса пароля, потому что ссылка для сброса обернута в <>.

Simon Josef Kok Simon Josef Kok
24 окт. 2017 г. 09:08:04

Не нарушит ли это работу другого кода, который ожидает, что wp_mail отправляет обычное текстовое письмо, а не HTML-письмо?

Flimm Flimm
4 апр. 2019 г. 15:31:42

@SimonJosefKok, если я правильно понимаю этот баг-репорт, проблема с нарушением работы писем для сброса пароля решена начиная с WordPress 5.4. Похоже, они решили убрать угловые скобки из адреса электронной почты. https://core.trac.wordpress.org/ticket/23578#comment:24

Mark Berry Mark Berry
11 февр. 2020 г. 03:22:47
Показать остальные 7 комментариев
1
14

Не забудьте удалить фильтр типа контента после использования функции wp_mail. Согласно принятому соглашению о наименовании, это следует сделать после выполнения wp_mail:

remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );

Ознакомьтесь с этим тикетом - Сброс content-type во избежание конфликтов -- http://core.trac.wordpress.org/ticket/23578

2 янв. 2015 г. 16:25:25
Комментарии

Это должно быть комментарием, а не ответом, не так ли?

Bob Diego Bob Diego
26 июл. 2017 г. 17:31:07
0

Еще один простой способ, которым я поделюсь ниже. Вы даже можете стилизовать тело письма по своему желанию. Возможно, это будет вам полезно.

$email_to = 'someaddress@gmail.com';
$email_subject = 'Тема письма';

// <<<EOD — это heredoc-синтаксис PHP
$email_body = <<<EOD
Это ваш новый <b style="color: red; font-style: italic;">пароль</b> : {$password}
EOD;

$headers = ['Content-Type: text/html; charset=UTF-8'];

$send_mail = wp_mail( $email_to, $email_subject, $email_body, $headers );

Подробнее о heredoc-синтаксисе PHP https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

5 апр. 2020 г. 08:39:47
0

Используйте ob_start, так как это позволит вам использовать переменные/функции WordPress, такие как bloginfo и другие.

Создайте PHP-файл и вставьте в него ваш HTML (при необходимости используйте переменные WordPress внутри этого файла).

Используйте следующий код:

 $to = 'Email Address'; // Адрес электронной почты
 $subject = 'Your Subject'; // Тема письма

 ob_start();
 include(get_stylesheet_directory() . '/email-template.php'); // Путь к файлу шаблона
 $body = ob_get_contents();
 ob_end_clean();

 $headers = array('Content-Type: text/html; charset=UTF-8','From: Test <test@test.com>');
 wp_mail( $to, $subject, $body, $headers );

Это позволит сохранить ваш код чистым, а благодаря ob_start мы также сэкономим время на загрузке файла.

5 мар. 2020 г. 05:28:13