Давняя головная боль, которую все преодолевают по разному. Я нашел такой вот путь, надеюсь кому-нибудь еще пригодится [spoiler] Итак, небольшой ликбез почему так, а не иначе.
Что дано - после того как отправляется письмо с CEvent::Send() оно на самом деле сначала добавляется в таблицу b_event как событие и сработает на следующем хите (фактически на вашем же) - перед добавлением в таблицу вызывается обработчик OnBeforeEventAdd - после добавления в таблицу (на следующем хите) происходит уже отправка письма; как и что там происходит описывать не буду, потому что туда нам не вклинится - там есть обработчик OnBeforeEventSend, но он вызывается, когда письмо уже формируется, фактически перед отправкой и поздно что-то делать.
Вывод: вклиниться надо в OnBeforeEventAdd.
Скачиваем файл с единственной функцией SendAttache() для отправки нашего письма. Внимание! Функция не предусматривает отправки письма без файла. Складируем ее к себе, подключаем файл (я подключил его в момент отправки письма, чтобы постоянно не копилило).
$event, $lid, $arFields передаются по ссылке - их изменение повлечет изменений изначальных переменных. На этом мы и сыграем далее.
В первой строчку я подключаю тот самый файл. Во второй строчке вызываю функцию из файла (переменные те же, что передаются в обработчик + аттач).
А вот третья строчка это чистой воды танец с бубном. Если этого не сделать, то придет два письма по шаблону. Почему? Потому что после обработчика идет добавление в таблицу b_event (см. выше). Но мы то письмо уже отправили (обращаю внимание, что при отправке нашим способом добавления в таблицу не происходит). Значит нам надо сделать так, чтобы будущее добавление в таблицу не повлекло отправку письма. unset у меня почему-то не сработал, поэтому я просто присвоил null.
Вот собственно и все. Хочу заметить, что если в SendAttache четвертым параметром передать не путь, а массив путей, то к письму приложится несколько аттачей.
В обработчике лишь пример как можно использовать данную функцию. Логика у каждого своя, поэтому я не стал изощряться.
UPD По поводу $event = 'null' пару слов еще. Дело в том, что добавление в таблицу произойдет, но система помаркирует ее как "провал при отправке" и письма не отправится, а через несколько дней запись и вовсе удалится автоматически.
После обновления на 12.0 столкнулась со следующей проблемой - отправляется 2 письма: с вложением и без. Т.е. возможно эвент отправки простого письма не отменяется ($event = 'null'). Можете подсказать, пожалуйста, как исправить данную проблему?
AddEventHandler("main", "OnSendUserInfo", Array("MyClass", "bxModifyRegistretionMails"));
class MyClass
{
function bxModifyRegistretionMails(&$arParams){
/*******************************************/
SendAttache($arParams["EVENT_NAME"], $arParams["SITE_ID"], $arParams, $filePath);
unset($arParams);
}
Письмо с аттачем не получает поля из arParams и как тут отменить письмо стандартное ? А то приходит одно письмо стандартное(неизмененное) и второе с вложением но не подставляются вместо #КОДА# значения .
Кирилл, данное событие не перехватить. Ибо оно улетает сразу, не ложась в базу. Только переопределять custom_mail. Может получится как-то зацепиться за событие OnBeforeEventSend. Но не уверен.
Назар, если это не локальная проблема почтовика, которым открываете eml-файл, и не проблема самого файла, то надо изучать заголовки письма, почему именно проблема, и какая. Удаленно ничего не скажешь абсолютно.
Антон, а как можно реализовать, чтобы на почту приходил не прикрепленный файл, а ссылка на него? Сначала формируется сообщение для email, потом создается элемент, файл прикрепляется к элементу
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».