1С-Битрикс: Управление сайтомНа главную страницу
Клиентам
Маркетплейс
Партнерам
Разработчикам
Интеграция с 1С
Идея?


Личный кабинет
Авторизоваться
Регистрация
(войти) Корзина
Логин:

Пароль:



Забыли свой пароль?
Регистрация
Войти как пользователь:
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
ВКонтакте
Мой Мир
Twitter
Facebook
Google
Livejournal
Яндекс
Rambler
Mail.Ru
Liveinternet
Blogger
OpenID
Используйте вашу учетную запись VKontakte.ru для входа на сайт.
Используйте вашу учетную запись Мой Мир@Mail.ru для входа на сайт.
Используйте вашу учетную запись на Twitter.com для входа на сайт.
Используйте вашу учетную запись на Facebook.com для входа на сайт.
Используйте вашу учетную запись Google для входа на сайт.
.livejournal.com
@yandex.ru
@rambler.ru
@mail.ru
http://www.liveinternet.ru/users/ /
.blogspot.com
OpenID:
  • Документация
    • Управление сайтом
    • Корпоративный портал
    • .NET Forge CMS
    • Отраслевые решения
    • Marketplace
    • Аренда приложений (SaaS)
  • Обучение и сертификация
    • Онлайн-курсы и сертификация
    • Учебные центры
    • Мое обучение
    • Учебные видеоролики
  • Центр поддержки
    • Поддержка
    • FAQ
    • Мои обращения
  • Сообщество
    • Блоги Битрикс
    • Блоги веб-разработчиков
    • Общие форумы
    • Веб-разработчики
      • Моя страница
      • Мои сообщения
      • Группы
      • Найти коллег
  • Cтатьи
    • Архив
Главная / Общение / Сообщество разработчиков / Секретные разработки в 1С-Битрикс / Секретные фичи :)
Онлайн-трансляция презентации новой версии «1С-Битрикс: Управление сайтом 11.5»

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

Основное
Секретные фичи :)
Микроблог
Участники

Секретные разработки в 1С-Битрикс

Тема: Битрикс PHP Framework
Описание: Выкладываем тут не задокументированные фичи

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

6
Алексей Шоков
29.06.200909:3829.06.2009 09:38:29
В Битриксе, начиная с версии 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;
}

Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом smile:)
Алексей Шоков
29.06.200909:3829.06.2009 09:38:29
Просмотров:10331 Комментариев:25 6
Теги: gmail, pear
*
 
Незарегистрированным пользователям запрещена вставка ссылок. Зарегистрируйтесь или авторизуйтесь.
*
Добавить комментарий
0
User 2000
29.06.2009 19:42:46
У Zend_Mail вроде есть метод addHeader($name, $value, $append = false), как раз для добавления заголовков. И есть Zend_Mail_Transport_Smtp для отправки через smtp.
Ответить Ссылка 0
0
Алексей Шоков
30.06.2009 04:42:59
addHeader() добавляет один заголовок к письму, да и принимает этот метод имя заголовка и его значение. А у нас уже сформированная строка с «сырыми» заголовками ($additionalHeaders), если можно так выразиться. И способов привязать её без лишних хлопот к Zend-письму нет smile:(
Ответить Родитель Ссылка 0
0
Шмелев Петр
28.12.2009 00:48:50
Подскажите пожалуйста можно ли этот метод применить к IIS7
я попробовал не вышло
а то который день бьюсь не уходит почта с Битрикса
родной SMTP запушен настройки плевые
пробовал разные сервера никааак
Ответить Ссылка 0
0
Алексей Шоков
30.12.2009 15:21:47
Можно и к IIS, проблем быть не должно. Включите журналирование при отправке почты через Net_SMTP, посмотрите, в чём ошибка. Либо SMTP-сервер настроен неправильно (попробуйте через другой, через тот же Google), либо посмотрите настройки сетевого экрана на сервере.

По тем данным, которые Вы написали выше, определить ничего нельзя smile:(
Ответить Родитель Ссылка 0
0
Петров Роман
15.02.2010 19:29:26
полезная статья. самое время поставить на нее ссылку из faq
Ответить Ссылка 0
0
Лакунова Алина
29.04.2010 10:07:51
как это PEAR::Net_SMTP установить?
Ответить Ссылка 0
0
Алексей Шоков
29.04.2010 11:58:31
Все пакеты PEAR (pear.php.net) можно либо скачать с их сайта как обычный архив, а так же через утилиту pear поставляемую вместе с PHP (предпочтительный способ):

Код
pear install Net_SMTP 
Ответить Родитель Ссылка 0
0
Лакунова Алина
29.04.2010 14:43:22
вот что у меня выдает

Fatal error: require_once() [function.require]: Failed opening required 'Net/SMTP.php' (include_path='.:/usr/local/lib/php') in /home/****/domains/******.com/public_html/bitrix/php_interface/init.php on line 13

строка 13 require_once 'Net/SMTP.php';

я понимаю что не находит файл, но не знаю где он должен быть. как решить эту проблему?
Ответить Ссылка 0
0
Алексей Шоков
29.04.2010 15:55:33
Файлы PEAR лежат ровно в include_path (директория, куда устанавливаются пакеты, прописана в php.ini). В вашем случае это /usr/local/lib/php.

Скорее всего, у вас этот самый Net_SMTP просто не установлен. Попробуйте

Код
pear install Net_SMTP

Либо попросите администратора сервера выполнить эту команду, если у вас shared-хостинг.
Ответить Родитель Ссылка 0
1
Лакунова Алина
29.04.2010 16:48:42
простите за идиотский вопрос, но как выполнить эту команду? куда это писать?
Ответить Родитель Ссылка 1
0
Егжанов Александр
29.04.2010 16:16:17
Нужно установить путь к инсталлу библиотеки сначала. Это путь, который будет добавляться к require, если указаный в нем путь не найден. Ну и конечно, проверить установлен ли пакет.

@set_include_path('.;C:\Websrv\PHP\PEAR\/'); - это для винды.

Ответить Ссылка 0
0
Новичков Максим
19.05.2010 17:02:10
Странно )) Модуль установил, все прописано, при получении сообщения, отправленного через SMTP, поле "кому" не заполнено
Ответить Ссылка 0
0
Попов Александр
19.05.2010 17:33:39
Та же фигня. Дело в том, что адрес в переменной $to используется, чтобы долбиться по SMTP к получателю, но к телу письма не крепится в поле "To:". Это нужно сделать самостоятельно, доработав скрипт примерно так:

перед строчкой:
Код
$additionalHeaders .= $eol . 'Subject: ' . $subject; 


вставить еще одну, получив следующее:

Код
$additionalHeaders .= ($additionalHeaders != "" ? $eol : "") . 'To: ' . $to;  
$additionalHeaders .= $eol . 'Subject: ' . $subject;


По всей вероятности, автором поста это так же отнесено к «домашнему заданию».
Ответить Родитель Ссылка 0
2
Алексей Шоков
19.05.2010 17:49:42
«Домашнее задание» растёт не по дням, а по часам smile:)
Ответить Родитель Ссылка 2
0
Алексей Шоков
19.05.2010 17:52:46
Господа, дамы, вопрос. Как я вижу, к решению есть некоторый интерес. Стоит ли оформить данный функционал в модуль, чтобы упростить установку и позволить делать настройки прямо из панели управления?
Ответить Ссылка 0
0
Попов Александр
19.05.2010 18:25:25
Безусловно, стОит! Буквально читаете мысли. Прежде всего, благодарю за полезную наработку. Пользуя ее, самому захотелось высвободить некоторое количество времени и оформить модулем. Но учитывая ваше оживление в том же русле, бью себя по рукам.

И, если позволите, некоторые пожелания к интерфейсу управления, и соответствующему функционалу.

Чтобы фичи в настройках приближались по возможностям к фичам почтовых программ, предлагая гибкость для использования с различными почтовыми серверами, например:
  • выбрать SSL-шифрование при необходимости, или не выбирать (автоматическая подстановка номера соответствующего порта)
  • выбрать аутентификацию, или не выбирать
  • и т.п.

Спасибо!
Ответить Родитель Ссылка 0
0
Алексей Шоков
19.05.2010 18:37:37
Спасибо за хороший отзыв, приятно слышать, что кому-то ещё пригодилось smile:)

Пожелания тоже постараюсь учесть, но не факт, что все сразу — я думал собраться быстрее то, что есть, чтобы уже был какой-то модуль. Возможно мы с Вами вместе потом доведём модуль до ума — это же открытый код smile;)
Ответить Родитель Ссылка 0
0
Попов Александр
19.05.2010 18:51:12
С удовольствием поучаствую. Опенсорсных решений "от сохи" битриксу не хватает.
Ответить Родитель Ссылка 0
0
Новичков Максим
19.05.2010 18:09:07
Определенно - да
Ответить Ссылка 0
0
Алексей Шоков
19.05.2010 18:12:30
Если это ответ на моё предыдущее сообщение, то отлично smile:) На выходных постараюсь обернуть, напишу сюда об успехах.
Ответить Родитель Ссылка 0
0
Ежовкин Никита
12.06.2010 13:36:32
Отличное решение! Работает! Пользуюсь! Будет в виде модуля и с настройками через админку, будет просто Must Have!
Ответить Ссылка 0
0
Алексей Шоков
13.06.2010 23:55:07
Так ведь есть уже. Забыл сюда отписаться smile:)
Ответить Родитель Ссылка 0
0
Ежовкин Никита
16.06.2010 19:21:13
Еще лучше, в следующий раз проверю smile;)
Ответить Ссылка 0
0
Олег Тим
03.03.2011 11:12:11
Алексей, подскажите пожалуйста, есть ли возможность настроить работу с почтой через MS Exchange?
Ответить Ссылка 0
0
Царапкин Сергей
04.05.2011 17:26:48
Добрый день! При использовании данного механизма отправки почты, постоянно сталкиваюсь с проблемой вложенных файлов.

Вложенные файлы приходят битыми  ( те открыть их не удается)
Пожалуйста подскажите возможные варианты решения этой проблемы.
Ответить Ссылка 0

Добавить комментарий

Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».
 
Технологии Эрмитаж
BitrixMobile
Автокеширование
SiteUpdate
Производительность Виртуальная машина
Веб-окружение
Результаты тестов
Выбрать хостинг
Веб-кластер
Безопасность Проактивная защита
Веб-антивирус
Аутентификация

Контакты Поиск Карта сайта
Телефон: +7 (495) 229-14-41
Оставайтесь с нами: Facebook Twitter Habrahabr VKontakte Developers Google 1+
Как распознать QR код?Контакты QR


© 2001-2012 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом.
Английская версия Немецкая версия