+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Шлём почту с Битрикса через GMail

В Битриксе, начиная с версии 7.1.3, появилась возможность переопределить стандартный механизм отправки почты.

Когда может быть полезен такой финт ушами? К примеру, когда в конторе есть какой-то централизованный сервис отправки почты, который должны использовать все приложения (SMTP-сервер на другой машине, веб-служба, что угодно). Для примера, рассмотрим GMail в качестве такого сервиса.

Механика простая: везде, где должна вызываться функция mail(), вызывается bxmail(). А уже в этой функции, перед вызовом стандартной функции mail(), Битрикс проверяет, определена ли функция custom_mail() и, если да, вызывает её вместо mail(). Соответственно, чтобы переопределить механизм отправки, нужно всего лишь написать функцию custom_mail()/bitrix/php_interface/init.php, к примеру (если хотим, чтобы такой механизм отправки действовал для всех сайтов на данной копии)).

Заголовок функции:
custom_mail($to, $subject, $message, $additional_headers, $additional_parameters);

Приступим к делу! Лично мне для отправки почты через GMail ближе всего Zend_Mail, но... Ни эта библиотека, ни другие не позволяют установить "сырые" заголовки для письма. А разбирать $additional_headers мне что-то не очень хочется. Следовательно, выбор перепадает на PEAR::Net_SMTP, как на механизм прямой работы с SMTP-сервером.

Итак, ближе к коду!
require_once 'Net/SMTP.php';

/**
 * Отпраляем почту через SMTP-сервер GMail (пользователь: user@gmail.com).
 *
 * @see CEvent::HandleEvent()
 * @see bxmail()
 *
 * @param string $to Адрес получателя.
 * @param string $subject Тема.
 * @param string $message Текст сообщения.
 * @param string $additionalHeaders Дополнительные заголовки передаются Битриксом почти всегда ("FROM" передаётся здесь).
 *
 * @return bool
 */
function custom_mail($to, $subject, $message, $additionalHeaders = '')
{
   /*
    * Настройки можно (нужно) вынести в админку, но это уже домашнее задание :)
    */
   $smtpServerHost         = 'ssl://smtp.gmail.com';
   $smtpServerHostPort      = 465;
   $smtpServerUser         = 'user@gmail.com';
   $smtpServerUserPassword   = 'password';

   if (!($smtp = new Net_SMTP($smtpServerHost, $smtpServerHostPort))) {
      return false;
   }
   if (PEAR::isError($e = $smtp->connect())) {
      return false;
   }
   if (PEAR::isError($e = $smtp->auth($smtpServerUser, $smtpServerUserPassword))) {
      return false;
   }

   preg_match('/From: (.+)\n/i', $additionalHeaders, $matches);
   list(, $from) = $matches;

   $smtp->mailFrom($from);
   $smtp->rcptTo($to);

   /*
    * Получаем идентификатор конца строки у Битрикса.
    */
   $eol = CAllEvent::GetMailEOL();

   $additionalHeaders .= $eol . 'Subject: ' . $subject;

   if (PEAR::isError($e = $smtp->data($additionalHeaders . "\r\n\r\n" . $message))) {
      return false;
   }

   $smtp->disconnect();

   return true;
}

Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом :)

Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA