Отправка HTML-письма с вложением через wp_mail()
Это должно быть просто, но я не могу разобраться. Я хочу отправить письмо в HTML-формате, которое также содержит вложение. Вложение отправляется корректно, но сообщение доставляется как обычный текст, вот так:
<p>Здравствуйте!</p>
<p> </p>
<p>Некоторый текст.</p>
<p> </p>
<p>С наилучшими пожеланиями,</p>
<p>Команда</p>
Если бы это было письмо без вложения, я бы принудительно отправил его как html, изменив заголовок, как описано здесь. Но теперь мне нужно, чтобы тип содержимого был multipart/mixed (верно?). Итак, мой вопрос: как заставить wp_mail()
отправлять мои сообщения в формате html и включать вложение?

Ссылка для справки нажмите здесь.
Используя приведенный ниже код, вы можете отправить письмо в 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 );

Я считаю, что ответ в вашем конкретном случае не связан с ошибкой, упомянутой в указанной ветке обсуждения. Нет необходимости устанавливать пользовательские заголовки для достижения того, что вы хотите сделать.
Вместо этого вы просто устанавливаете альтернативное текстовое тело письма, используя $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-теле письма. Насколько мне известно, они не будут доступны в текстовой версии.

как указано в вашей ссылке:
Тип контента по умолчанию — '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';
}
Должно сработать.
