Когда может быть полезен такой финт ушами? К примеру, когда в конторе есть какой-то централизованный сервис отправки почты, который должны использовать все приложения (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; } |
Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом







я попробовал не вышло
а то который день бьюсь не уходит почта с Битрикса
родной SMTP запушен настройки плевые
пробовал разные сервера никааак
По тем данным, которые Вы написали выше, определить ничего нельзя
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';
я понимаю что не находит файл, но не знаю где он должен быть. как решить эту проблему?
Скорее всего, у вас этот самый Net_SMTP просто не установлен. Попробуйте
Либо попросите администратора сервера выполнить эту команду, если у вас shared-хостинг.
@set_include_path('.;C:\Websrv\PHP\PEAR\/'); - это для винды.
перед строчкой:
вставить еще одну, получив следующее:
$additionalHeaders .= $eol . 'Subject: ' . $subject;
По всей вероятности, автором поста это так же отнесено к «домашнему заданию».
И, если позволите, некоторые пожелания к интерфейсу управления, и соответствующему функционалу.
Чтобы фичи в настройках приближались по возможностям к фичам почтовых программ, предлагая гибкость для использования с различными почтовыми серверами, например:
Спасибо!
Пожелания тоже постараюсь учесть, но не факт, что все сразу — я думал собраться быстрее то, что есть, чтобы уже был какой-то модуль. Возможно мы с Вами вместе потом доведём модуль до ума — это же открытый код