wp_mail() — функция отправки email

Практическое использование этой функции вы можете найти в моём видеоуроке.

Функция возвращает true в случае успешной отправки email, однако это не означает, что письмо будет получено и прочтено.

wp_mail( $to, $subject, $message, $headers = '', $attachments = array() )
$to
(строка|массив) получатель или получатели письма (в виде массива или через запятую). Обратите внимание, если вы укажете их через запятую, то каждый получатель письма увидит все email-адреса, на которые было выслано это письмо
$subject
(строка) тема сообщения
$message
(строка) текст сообщения, по умолчанию text/plain, это значит, что HTML-теги не поддерживаются, о том, как включить их поддержку, смотрите в примерах
$headers
(строка|массив) заголовки сообщения
$attachments
(строка|массив) вложения к письму, нужно указывать полный путь к файлам на сервере. Для того, чтобы вложить несколько файлов, используйте массив, либо строку, где путь к каждому файлу начинается с новой строки

Пример. Обычная отправка письма

Самый просто пример:

wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение');

Изменение имени и email отправителя

В WordPress по умолчанию в качестве отправителя письма выставляется «WordPress»,а в качестве его email «wordpress@truemisha.ru».

Я уже писал пост о том, как изменить стандартное имя и email отправителя для всех писем, отправляемых с блога на WordPress, а сейчас рассмотрим пример только для конкретного письма:

$headers = 'From: Миша <misha@truemisha.ru>' . "\r\n"; // в виде строки
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers);

Использование HTML-тегов в письме

Для того, чтобы использовать HTML-теги в тексте сообщения, нужно изменить content-type письма на text/html, а это можно сделать двумя способами.

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

add_filter('wp_mail_content_type', create_function('', 'return "text/html";'));

Через заголовки. HTML-теги будут разрешены только для конкретного письма.

$headers[] = 'Content-type: text/html; charset=utf-8'; // в виде массива
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers);

Изменение кодировки письма

Кодировка письма по умолчанию соответствует кодировке блога, но ее тоже можно изменить через заголовки (предыдущий пример) или через фильтр:

add_filter('wp_mail_charset', create_function('', 'return "utf-8";'));

В предыдущем примере (и по умолчанию тоже) WordPress отправляет письма юникодом, но таким способом вы спокойно можете изменить кодировку например на Windows-1251.

Отправка письма с измененными заголовками и вложениями

В данном случае обе переменные: $attachments и $headers — заданы в виде массива.

$attachments[] = WP_CONTENT_DIR . '/uploads/file_1.zip';
$attachments[] = WP_CONTENT_DIR . '/uploads/file_2.zip';
 
$headers[] = 'From: Миша <misha@truemisha.ru>';
$headers[] = 'Content-type: text/html; charset=utf-8';
 
wp_mail('true@truemisha.ru', 'Какая-то тема', 'Какое-то сообщение', $headers, $attachments);

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 14

  • Евгений 5 ноября 2014 #

    Здравствуйте! очень полезный у Вас сайт! Я делетан в этом деле, но очень нравится! Подскажите правильный путь

    Я написал плагин интернет магазина, есть две проблемы, решаются они одинаково - это wp_update_post и wp_mail.

    Мне нужно что бы при оформлении заказа создавалась статья с контентентом состоящим из корзины товаров:

    Решение которое работает но не устраивает

    if (isset($_POST['buy'])) {
     	foreach ($_SESSION['goods'] as $key => $value) {
     	 	$array[] = get_the_post_thumbnail($key, 'thumbnail');
     	 	$array[] = get_the_title($key);
     	 	 }
     	 $content = serialize($array);
          $buy_post = array(
         'post_title' => '',
         'post_content' => $content,
         'post_status' => 'draft',
         'post_type' => 'orders'
          );
     
        $buy_ID = wp_insert_post( $buy_post );
     
          // Создаем массив данных
            $my_post = array();
            $my_post['ID'] = $buy_ID;
            $my_post['post_title'] = 'Заказ № '.$buy_ID;
          // Обновляем данные в БД
            wp_update_post( $my_post );
     
     }

    если так

    if (isset($_POST['buy'])) {
     	foreach ($_SESSION['goods'] as $key => $value) 
          // Создаем массив данных
            $my_post = array();
            $my_post['ID'] = $buy_ID;
            $my_post['post_title'] = 'Заказ № '.$buy_ID;
            $my_post['post_content'] = $value;
          // Обновляем данные в БД
            wp_update_post( $my_post );
       }
     }

    то соответственно записывает только последний перебор.

    Еще вариант подключить фаил в контент

    require_once SG_PLUGIN_PATH . 'cart/cart_action.php';

    но в контент записывает тупо 1.

    Задача: записать в контент таблицу со значениями из массива, аналогично и для wp_mail может что то подскажете, седых волос уже это прибавило!
    Спасибо!

    • Миша 5 ноября 2014 #

      Здравствуйте!
      А почему не в сессию корзину записываете?

  • Евгений 5 ноября 2014 #

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

  • Евгений 5 ноября 2014 #

    сейчас в

    $_SESSION['goods']

    : кей - это айди поста а валуе - это количество купленного товара

  • Евгений 5 ноября 2014 #

    может быть подскажете хук? что бы в базе контент ансерелизовать и разобрать массив!

    • Миша 6 ноября 2014 #

      Всё равно не до конца понимаю задачу 🙂
      Возможно вам помогут функции get_post() и unserialize()?

  • Евгений 6 ноября 2014 #

    Спасибо! придумал решение! add_post_meta
    Это не будет нагружать вордпресс? получается я каждый товар в заказе соханяю как произвольное поле! и с помощью джейквери делаю из этого красивую табличку!

    • Миша 6 ноября 2014 #

      Не будет 🙂 главное кэш поставить потом.

  • Евгений 6 ноября 2014 #

    не дадите ссылку по этому вопросу! честно говоря не изучал этот вопрос!

    • Миша 6 ноября 2014 #

      Просто поставите плагин WP Super Cache и всё будет хорошо — это необходимо в том случае, если у вас будет большой поток посетителей, больше 500 в сутки.

  • Евгений 6 ноября 2014 #

    Благодарю!

  • Александр 4 декабря 2015 #

    Миша подскажи, отправляю через функцию wp_mail письма приходят на почту с другим временем, не с моим локальным указанным на сервере. Как можно это поправить?
    Чтобы письма приходили по правильному времени?
    Какие настройки указать с временной датой

  • Андрей Гд Фан 26 марта 2020 #

    Жаль, что этот сайт давно не обновлялся(

    • Миша 26 марта 2020 #

      Угу, целых три дня

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.