Давняя головная боль, которую все преодолевают по разному. Я нашел такой вот путь, надеюсь кому-нибудь еще пригодится [spoiler] Итак, небольшой ликбез почему так, а не иначе.
Что дано - после того как отправляется письмо с CEvent::Send() оно на самом деле сначала добавляется в таблицу b_event как событие и сработает на следующем хите (фактически на вашем же) - перед добавлением в таблицу вызывается обработчик OnBeforeEventAdd - после добавления в таблицу (на следующем хите) происходит уже отправка письма; как и что там происходит описывать не буду, потому что туда нам не вклинится - там есть обработчик OnBeforeEventSend, но он вызывается, когда письмо уже формируется, фактически перед отправкой и поздно что-то делать.
Вывод: вклиниться надо в OnBeforeEventAdd.
Скачиваем файл с единственной функцией SendAttache() для отправки нашего письма. Внимание! Функция не предусматривает отправки письма без файла. Складируем ее к себе, подключаем файл (я подключил его в момент отправки письма, чтобы постоянно не копилило).
$event, $lid, $arFields передаются по ссылке - их изменение повлечет изменений изначальных переменных. На этом мы и сыграем далее.
В первой строчку я подключаю тот самый файл. Во второй строчке вызываю функцию из файла (переменные те же, что передаются в обработчик + аттач).
А вот третья строчка это чистой воды танец с бубном. Если этого не сделать, то придет два письма по шаблону. Почему? Потому что после обработчика идет добавление в таблицу b_event (см. выше). Но мы то письмо уже отправили (обращаю внимание, что при отправке нашим способом добавления в таблицу не происходит). Значит нам надо сделать так, чтобы будущее добавление в таблицу не повлекло отправку письма. unset у меня почему-то не сработал, поэтому я просто присвоил null.
Вот собственно и все. Хочу заметить, что если в SendAttache четвертым параметром передать не путь, а массив путей, то к письму приложится несколько аттачей.
В обработчике лишь пример как можно использовать данную функцию. Логика у каждого своя, поэтому я не стал изощряться.
UPD По поводу $event = 'null' пару слов еще. Дело в том, что добавление в таблицу произойдет, но система помаркирует ее как "провал при отправке" и письма не отправится, а через несколько дней запись и вовсе удалится автоматически.
Можно еще расширить функцию добавив $message_id, чтобы могли отправляться разные шаблоны одного типа.
У меня, кстати на 14.5 null-ы не сработали. Упорно 2 письма уходило, пока я сами шаблоны не сделал неактивными. Событие OnBeforeEventAddHandl при этом срабатывает, а отправка штатными средствами уже - нет.
есть такая особенность, из-за которой я немного подзастрял, не мог понять почему не работает: в методе CEvent::Send в параметре $lid можно передавать как id сайта, так и массив id сайтов. А функция SendAttache в одноименном параметре принимает только id сайта и с массивом не дружит, и ничего не отправляет
Здесь я так понмаю что нужно именно закачивать на сайт файл а потом прописывать пути типа "/readme.html" - а напрямую нельзя отправить файл на почту? без залива на сайт!
Разработчикам Битрикса думаю давно нужно было добавить функционал такого рода в систему. У каждого третьего клиента есть необходимость отправлять данные с аттачем. P.S. За класс огромное спасибо. Будем тестить
в D7 обработчик не будет работать! "Старыми", описанными методами - все ровно пашет, кроме момента определения CHARSET в b_lang - у меня почему-то пусто, хотя настройки сайтов выставлены...
Да и видимо добавили таки возможность слать аттачи
CEvent::Send("EVENT_NAME", SITE_ID, $arEventFields, "Y", "", array($file_id));
// где $file_id - это ID файла из таблицы b_file, файлов может быть несколько
Котов Алексей написал: Да и видимо добавили таки возможность слать аттачи
Не всегда работает, судя по всему, есть баг в ядре, если на кроне какое-то событие почтовое висит, а что-то выполняется на хитах, так как таблица эвентов может быть заблокирована и файлы не приаттачатся.
Можно не отправлять письмо дополнительно с помощью функции, а заполнить параметр $files. Письмо отправится стандартным способом и с вложениями.
function OnBeforeEventAddHandler(&$event, &$lid, &$arFields, &$messageId, &$files, &$languageId)
{
if ($event == "SALE_NEW_ORDER_YANDEX")
{
$files = Array("/readme_1.html","/readme_2.html");
// Вместо относительных путей можно указать ID
}
}
Недавно столкнулся со старой версией битрикса у клиента, нужно было реализовать нечто подобное Если в методе CEvent::Send id сайта передан как массив, то в методе SendAttach нужно поправить выборку при обращении к таблице b_event_message
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».