В Битриксе, начиная с версии 7.1.3, появилась возможность переопределить стандартный механизм отправки почты.
Когда может быть полезен такой финт ушами? К примеру, когда в конторе есть какой-то централизованный сервис отправки почты, который должны использовать все приложения (SMTP-сервер на другой машине, веб-служба, что угодно). Для примера, рассмотрим GMail в качестве такого сервиса.[spoiler]
Механика простая: везде, где должна вызываться функция mail(), вызывается bxmail(). А уже в этой функции, перед вызовом стандартной функции mail(), Битрикс проверяет, определена ли функция custom_mail() и, если да, вызывает её вместо mail(). Соответственно, чтобы переопределить механизм отправки, нужно всего лишь написать функцию custom_mail() (в /bitrix/php_interface/init.php, к примеру (если хотим, чтобы такой механизм отправки действовал для всех сайтов на данной копии)).
Приступим к делу! Лично мне для отправки почты через 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;
}
Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом
Можно ли это использовать, чтобы отправлять почту не через один ящик как сейчас, а напрямую? Наверное, надо как-то определить ящик отправитель и подставить соответствующие ему параметры авторизации $smtpServerUser = 'user@gmail.com'; $smtpServerUserPassword = 'password'; Правильно?
Встретился сегодня с одной проблемкой и спешу поделиться решением...
Итак, ставил на один из сайтов обновления (месячный пакет накопился ...) и при обновлении какой-то сбой произошел ... Результат сбоя - не работают js-скрипты в админке... даже авторизоваться через админку не получается.
Заменил содержимое папки /bitrix/js/main/ на аналогичное же содержимое с другого сайта (где обновления встали отлично). и тут меня ждал сюрприз: включенный cdn, и, как следствие, скрипты тянутся не из указанной папки, а из облака. Все! файлы обновил, а админкой пользоваться все равно не могу, ну и CDN отключить, чтобы файлы из ядра все-таки заработали тоже не могу...
Перерыл кучу информации как же отключить cdn имея только ftp-доступ и вот до чего дошел: Открываю файл: /bitrix/modules/bitrixcloud/classes/general/cdn_config.php и в нем нахожу строки (131-134):
public function isActive()
{
return ($this->active > 0);
}
В return вместо проверки активности ставлю false - и это дает мне возможность загрузиться в админке, ну а дальше - дело техники. Отключаем cdn-ускорение и ищем дальше ошибки ...
P.S. после отключения cdn не забываем вернуть код модуля в исходное состояние!
Сколько времени пишу под Битрикс, никогда не знал о существовании константы SITE_TEMPLATE_PATH (не описанной, как всегда, в документации, но любезно подсказанной моим коллегой).
Доброго времени суток! На форуме поднимался как-то уже вопрос о том, как, подтягивая компоненты битрикса по аяксу вытягивать также и скритп, который подключается к компоненту и файл стилей компонента. Тогда решения данного вопроса нормально не было найдено.
И вот теперь есть решение: Более подробно изучил работу с BX.ajax
Сильно расписывать нет времени, посему, сразу готовые наработки.
Итак, есть какой-то компонент. У данного компонента есть файл result_modifier.php
Т.о. в файл /ajax.php размещаем подключение компонента. Указанным запросом получаем данный компонент и помещаем его в контейнер с id="result_container". Все!
В результате файлы script.js и style.css, подключаемые вместе с компонентом, будут также подключаться и при запросе компонента по технологии ajax.
Возникла тут интересная задача реализации многосайтововости на доменах. Есть сайт на домене .ru, контент сайта фильтруется по регионам, т.е. имеются сайты вида: moscow.sitename.ru, piter.sitename.ru, kiev.sitename.ru, kharkov.sitename.ru .... и так все регионы (как вы понимаете, список регионов постоянно расширяется...). Возникла необходимость в вынесении украинских регионов на украинский домен sitename.com.ua.
ru-сайт был поднят на BitrixVM, как сайт по умолчанию (до меня), ДНС-ы самого домена и всех его алиасов были настроены на IP сервера. Все алиасы обрабатываются на стороне сайта так что для сервера никаких проблем с обработкой поддоменов и разбросом их по различным папкам тут нет. Точнее не было, пока не было необходимости выделения украинской части сайта в отдельный сайт.
Как-то скомкано получается изложить всю проблему, но, надеюсь, кому нужно - поймут.
И вот начал я насипрйку многосайтовости. В админке битрикса вторую лицензию занял новым укр. сайтом. В админке виртуальной машины завел дополнительный сайт для .com.ua. Настроил днс-ы украинского домена и его алиасов аналогично значениям ру-домена. Открываю сайт sitename.com.ua - попадаю в верную папку. Радуюсь. А вот дальше начинается счастье... Т.к. в настройках серверов я чуть сильнее чайника, то посмотрев на файлы конфигурации nginx, впал в ступор - понимаю, где править нужно, но не понимаю, что. Пришлось обращаться к знакомому сервернику. За что ему как всегда, огромное спасибо! Кому нужен специалист такого профиля - пишите вличку, познакомлю:)
Итак, решение задачи заключалось в правке всего 4-х файлов:
server {
...
server_name _;
...
set $proxyserver "http://127.0.0.1:8888";
set $docroot "/home/bitrix/www";
index index.php;
root /home/bitrix/www;
}
подменяем параметр "server_name", прописывая сюда ру-домен с алиасами:
server {
...
server_name *.sitename.ru sitename.ru;
...
set $proxyserver "http://127.0.0.1:8888";
set $docroot "/home/bitrix/www";
index index.php;
root /home/bitrix/www;
}
собственно сабж. есть у кого полностью рабочий конфиг ?
мне увы пока так и не удалось полностью подружить эту связку. столкнулся с проблемой заголовков(при ЧПУ), т.е. получаем либо на все 200 OK либо 404 Not Found
если интересно могу выложить конфиги...
совместными усилиями, собрали рабочий конфиг, спасибо Сергею Ляпко
UPD 23.12.2015: Добавил новый конфиг.
Старый
server {
listen 80;
server_name example.com www.example.com;
server_name_in_redirect off;
# access_log /var/log/nginx/example.com.nginx.access.log main;
index index.php;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
client_max_body_size 1024M;
client_body_buffer_size 4M;
root /var/www;
#кому не надо убирать у домена www это не пишем. между http:// и example.com убрать пробел, парсер дурит :)
if ($host = 'www.example.com' ) {
rewrite ^(.*)$ http:// example.com$1 permanent;
}
location / {
try_files $uri $uri/ @bitrix;
}
location ~ \.php$ {
try_files $uri @bitrix;
fastcgi_pass unix:/var/run/php5-fpm/www.sock; #путь до сокета php-fpm
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @bitrix {
fastcgi_pass unix:/var/run/php5-fpm/www.sock; #путь до сокета php-fpm
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php;
}
location ^~ /bitrix/admin/ {
try_files $uri @bitrixadm;
fastcgi_pass unix:/var/run/php5-fpm/www.sock; #путь до сокета php-fpm
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @bitrixadm{
fastcgi_pass unix:/var/run/php5-fpm/www.sock; #путь до сокета php-fpm
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/bitrix/admin/404.php;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
access_log off;
expires max;
error_page 404 = /404.html;#не забываем создать страницу
}
location ~ (/\.ht|/bitrix/modules|/upload/support/not_image|/bitrix/php_interface) {
deny all;
}
#все помнят это :)
location ~ /.svn/ {
deny all;
}
location ~ /\.ht {
deny all;
}
}
Эта конструкция не совсем правильная, поскольку параметр PHP_VALUE на всём пространстве данного location может быть объявлен только один и второе присваивание значения перекрывает первое правильнее будет: fastcgi_param PHP_VALUE "mbstring.func_overload=2 mbstring.internal_encoding=utf-8";
Данный пост будет полезен тем, кто иногда пописывает свои модули Битрикс. [spoiler] Натолкнулся тут недавно на одно открытие. Что к закладкам в форме редактирования пользователя в админ. части можно добавить и свои. Я про "Группы", "Личные данные", "Работа", "Форум", "Заметки". Так вот добавить к ним какую-то свою проще простого. В корневой папке своего модуля добавляете два файла: options_user_settings.php - собственно визуальная часть options_user_settings_set.php - POST-обработчики Можно посмотреть на примере форума.
Просто сам факт меня несколько обрадовал, я искренне верил что они вживлены в код и туда не вклиниться. Вот, может кому еще пригодится.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».