Отправка HTML-письма с вложением через wp_mail()

23 мая 2016 г., 14:46:21
Просмотры: 29.3K
Голосов: 1

Это должно быть просто, но я не могу разобраться. Я хочу отправить письмо в HTML-формате, которое также содержит вложение. Вложение отправляется корректно, но сообщение доставляется как обычный текст, вот так:

<p>Здравствуйте!</p>
<p>&nbsp;</p>
<p>Некоторый текст.</p>
<p>&nbsp;</p>
<p>С наилучшими пожеланиями,</p>
<p>Команда</p>

Если бы это было письмо без вложения, я бы принудительно отправил его как html, изменив заголовок, как описано здесь. Но теперь мне нужно, чтобы тип содержимого был multipart/mixed (верно?). Итак, мой вопрос: как заставить wp_mail() отправлять мои сообщения в формате html и включать вложение?

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

каков результат, если вы установите тип содержимого в text/html с помощью предоставленного фильтра? https://developer.wordpress.org/reference/hooks/wp_mail_content_type/

majick majick
23 мая 2016 г. 15:41:39

Вы наткнулись на баг своего рода, который ещё не исправлен официально в ядре. К счастью, есть патч, который можно применить, но в целом вас ждёт серьёзная головная боль (huvudvärk). К счастью, я уменьшил ваши страдания, объяснив, как работают multipart-сообщения с wp_mail() в моём вопросе: http://wordpress.stackexchange.com/questions/191923/sending-multipart-text-html-emails-via-wp-mail-will-likely-get-your-domain-b — Удачи!

Christine Cooper Christine Cooper
23 мая 2016 г. 17:11:29

@majick : это multipart / mixed сообщение. Оно не может иметь тип содержимого 'text/html'.

Maija Vilkina Maija Vilkina
23 мая 2016 г. 18:32:02

@ChristineCooper : да, я читал эту ветку, просто надеялся, что к настоящему моменту есть более удачное решение. Фу. :( Пожалуй, пока буду использовать простой текст для содержимого.

Maija Vilkina Maija Vilkina
23 мая 2016 г. 18:32:59

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

majick majick
25 мая 2016 г. 10:22:49

Обратитесь к этой статье https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 окт. 2020 г. 15:40:47
Показать остальные 1 комментариев
Все ответы на вопрос 3
1

Ссылка для справки нажмите здесь.

Используя приведенный ниже код, вы можете отправить письмо в HTML-формате.

$to = 'sendto@example.com';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );

// Для вложения 

$attachments = array( WP_CONTENT_DIR . '/uploads/file_to_attach.zip' );
$headers = 'From: My Name <myname@example.com>' . "\r\n";

wp_mail( 'test@example.org', 'subject', 'message', $headers, $attachments );
23 мая 2016 г. 17:00:46
Комментарии

Если внимательно прочитать, то видно, что это не ответ на мой вопрос.

Maija Vilkina Maija Vilkina
23 мая 2016 г. 18:30:05
0

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

Вместо этого вы просто устанавливаете альтернативное текстовое тело письма, используя $phpmailer->AltBody. Это автоматически устанавливает тип контента multipart/alternative (не multipart/mixed), и вы позволяете классу phpmailer позаботиться обо всём остальном без необходимости вручную устанавливать пользовательские заголовки.

add_action('phpmailer_init','wp_mail_set_text_body');
function wp_mail_set_text_body($phpmailer) {
     $phpmailer->AltBody = strip_tags($phpmailer->Body);
}

$to = 'me@example.com';
$headers = array();
$attachments = array(dirname(__FILE__).'/test.txt');
wp_mail($to,$subject,$message,$headers,$attachments);

Если вы добавляете вложения, общий тип контента автоматически становится multipart/mixed с multipart/alternative внутри, который содержит части text/plain и text/html, а затем следуют вложения.

Вы также можете добавить встроенные вложения (например, изображения) типа multipart/related, передав их в wp_mail через $attachements (с пятым параметром 'inline') — или даже объявив их непосредственно в HTML-теле письма. Насколько мне известно, они не будут доступны в текстовой версии.

24 мая 2016 г. 17:35:27
1

как указано в вашей ссылке:

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

Добавление этого в functions.php, как указано в wp_mail_content_type:

add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
    return 'text/html';
}

Должно сработать.

23 мая 2016 г. 15:43:28
Комментарии

Не то, о чём я спрашивал.

Maija Vilkina Maija Vilkina
23 мая 2016 г. 18:30:18