Ни как не могу понять в чем собака зарыта:
настраиваю уведомление о пропущенных в очереди и из cli не отправляется уведомление на email.
Что сделал:
1) В файле /etc/asterisk/extensions_override_freepbx.conf прописал:
| Код: |
| [ext-queues] exten => h,1,ExecIf($["${CDR(dstchannel)}"=""]?System(/usr/local/bin/sendEmail.pl -f sender@email -t my@email -u "Пропущенный звонок" -m "Пропущен звонок из очереди ${NODEST} с номера ${CALLERID(num)}" -o message-charset=UTF-8)) exten => h,2,Macro(hangupcall,) |
2) Установил и настроил скрипт sendEmail.pl
Из консоли сервера письма прекрасно отправляются, но по какой-то причине из cli Asterisk не уходят.
В логе работы Asterisk, я вижу, что Asterisk
| Код: |
| System(/usr/local/bin/sendEmail.pl -f sender@email -t my@email -u "Пропущенный звонок" -m "Пропущен звонок из очереди ${NODEST} с номера ${CALLERID(num)}" -o message-charset=UTF-8) |
Подскажите в какую сторону копать или хотя бы где дебаг отправки можно посмотреть? Покопался не нашел.
Added after 1 hours 40 minutes:
Пытаясь разобраться попробовал включить уведомление если вызов завершается на ИВР - как ни странно, письмо успешно отправилось.
Если вызов завершается на Очереди, то в трейс отправляется команда, но письмо не приходит.
Added after 19 minutes:
Пропустил двоеточие.
[ext-queues]
exten => h,1,ExecIf($["${CDR(dstchannel)}"=""]?:System(/usr/local/bin/sendEmail.pl -f sender@email -t my@email -u "Пропущенный звонок" -m "Пропущен звонок из очереди ${NODEST} с номера ${CALLERID(num)}" -o message-charset=UTF-
exten => h,2,Macro(hangupcall,)
Теперь все работает. Всем спасибо.
| Код: |
| exten => h,1,ExecIf($["${CDR(dstchannel)}"=""]?System(/usr/local/bin/sendEmail.pl -f ... |
По какой-то причине не отрабатывается "${CDR(dstchannel)}"=""
Правильно понимаю логику ExecIf - если выполняется условие, что dstchannel равен любому значению, то далее выполняется System (в моем случае скрипт отправки почты)?
И скриншота выше видно, что "${CDR(dstchannel)}"="" принимает значение "SIP/trunk_7..." , но почему-то не выполняется System.
Пробовал с GotoIf:
| Код: |
| exten=>h,n,GotoIf($["${CDR(dstchannel)}"=""]?:hangup) |
Обработка сразу бегает на параметр с меткой "hangup".
Помогите, пожалуйста, безуспешно бьюсь...
| Цитата: |
| GotoIf(condition?label1:label2) If "condition" is true, go to "label1". If condition is false, go to "label2". |
В случае:
| Код: |
| exten=>h,n,GotoIf($["${CDR(dstchannel)}"=""]?:hangup) |
если dstchannel равен пустому значению перейти к следующей строке, иначе перейти к метке hangup
Для ExecIf тоже самое.
| Код: |
| exten => h,1,ExecIf($["${CDR(dstchannel)}"=""]?System(/usr/local/bin/sendEmail.pl -f ... |
System будет вызван только в случае если dstchannel равен пустому значению
А можно ли задать имя канала с помощью шаблона (транков много), например SIP/trunk_(далее любое кол-во символов и знаков)?
https://wiki.asterisk.org/wiki/display/AST/Function_REGEX
| Код: |
| exten => h,1,ExecIf($["${REGEX("SIP/trunk" ${CDR(dstchannel)})}"="1"]?System(/usr/local/bin/sendEmail.pl -f |
В трейсе для System возвращается 0 (0?System) и письмо не отправляется, я где-то в теле диалплана намудрил?
Added after 2 hours 9 minutes:
Немного поковырял понял проблему.
В тот момент когда вызов попал в очередь имя канала, в который поступил вызов (если очередь настроена на дозвон одновременно только одному), имеет следующий вид: Local/301@from-queue-000078e7;1, соответственно, если 301 возьмет трубку, имя канала не изменится.
Если рассматривать канал из которого пришел вызов, то он будет иметь следующий вид: SIP/trunk_7...-000003c4
То есть получается, что отсутствует какой-то промежуточный канал очереди и я не смогу зафиксировать смену канала, чтобы корректно отработала логика уведомления о пропущенном в очереди.
Каким образом это можно реализовать?
У меня пропущенные звонки (те, кто не дождался ответа в очереди) фиксируются в отдельный файлик (Используется system, вызывается echo с переменными, в которых содержится номер звонящего и текущее состояние телефона) по тому же принципу, что и у вас. Если файл не в папке /home/asterisk или на него нет прав, то соответственно ничего в него не пишется.