Отправка голосовой почты Asterisk на несколько email

Допустим голосовая почта настроена как я описывал в статье — Настройка голосовой почты в Asterisk.
Имеется следующий контекст:

[voicemailcontext]
207 => 1111,Username,test@example.com,,attach=yes|tz=ua|delete=yes

Если необходимо отправить голосовое сообщение сразу на несколько email адресов, то вместо test@example.com укажем например testmail:

[voicemailcontext]
207 => 1111,Username,testmail,,attach=yes|tz=ua|delete=yes

Потом откроем файл /etc/aliases в текстовом редакторе:

sudo nano /etc/aliases

И укажем алиасы для testmail:

testmail: support@example.net,user@example.net

Готово, Asterisk будет отправлять сообщение на testmail, а оно автоматически пересылаться на указанные адреса.

Смотрите также:
Перенаправление почты пользователя root

Настройка автоматических вызовов в Asterisk

Asterisk может автоматически совершать звонок если в директорию (по умолчанию) /var/spool/asterisk/outgoing/ поместить .call файл. Если дата изменения файла больше текущей, то звонок будет совершен при наступлении или после этого времени.

Для автоматических вызовов должен быть загружен модуль pbx_spool.so, он должен быть прописан в modules.conf либо должен быть указан параметр autoload=yes.

Читать далее Настройка автоматических вызовов в Asterisk

Решение предупреждения Asterisk «leave_voicemail: No more messages possible»

Заметил на одном из серверов следующую ошибку:

WARNING[21992][C-00000b27]: app_voicemail.c:6559 leave_voicemail: No more messages possible

Оказалось что почтовый ящик переполнен голосовыми сообщениями и они перестали сохранятся, в ответ звонящему сообщалось «Голосовой ящик абонента переполнен».

Чтобы решить эту проблему есть несколько вариантов:

1) Удалить сообщения в голосовом ящике, позвонив на номер голосовой почты.

2) Увеличить значение maxmsg в файле voicemail.conf, тем самым увеличив максимальное количество сообщений в почтовом ящике, но опять же он может быть переполнен. После изменений в файле voicemail.conf нужно их применить:

sudo asterisk -rvv
voicemail reload
quit

3) В контексте голосового ящика добавить delete=yes, например:

[voicemailcontext]
207 => 1111,Username,test@example.com,,attach=yes|tz=ua|delete=yes

В этом случае голосовые сообщения будут отправятся на электронную почту, а с сервера сразу удалятся, то есть их нельзя будет прослушать позвонив на номер голосовой почты и соответственно почтовый ящик никогда не переполнится. Считаю этот вариант наилучшим.

Смотрите также:
Настройка голосовой почты в Asterisk

IPTables правила для Asterisk

Чтобы разрешить подключение SIP в IPTables, добавим правила (первое для соединений, второе для голосового трафика):

sudo iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT

Чтобы разрешить подключения только с конкретного адреса, то вместо правил выше укажем (где 192.168.1.50 доверенный IP адрес):

sudo iptables -A INPUT -p udp -m udp -s 192.168.1.50 --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp -s 192.168.1.50 --dport 10000:20000 -j ACCEPT

Аналогично укажем для каждого IP либо сразу для подсети, например:

sudo iptables -A INPUT -p udp -m udp -s 192.168.1.0/24 --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp -s 192.168.1.0/24 --dport 10000:20000 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D INPUT -p udp -m udp -s 192.168.1.0/24 --dport 5060 -j ACCEPT
sudo iptables -D INPUT -p udp -m udp -s 192.168.1.0/24 --dport 10000:20000 -j ACCEPT

Посмотреть список правил можно командой:

sudo iptables -nvL

Смотри также мою статью:
Настройка IPTables

Управление модулями Asterisk

Подключимся к консоли Asterisk:

sudo asterisk -rvv

Просмотрим какие модули уже используются:

module show

Файлы модулей с расширением *.so находятся в директории /usr/lib/asterisk/modules/

Для загрузки и выгрузки модуля используются команды (имя модуля указывается без расширения файла, например не chan_sip.so, а chan_sip):

module load NAME
module unload NAME

Для того чтобы нужные модули загружались автоматически при запуске Asterisk, их нужно указать в файле /etc/asterisk/modules.conf, например откроем его в текстовом редакторе nano:

sudo nano /etc/asterisk/modules.conf

Можно включить автозагрузку всех существующих модулей в папке /usr/lib/asterisk/modules/:

[modules]
autoload=yes

А потом исключить ненужные командами:

noload => module.so

Либо запретить загрузку всех и указать только те которые нужны, например:

;SIP VoIP драйвер
load => chan_sip.so
load => res_rtp_asterisk.so
load => app_dial.so
load => bridge_simple.so
load => res_features.so
; музыка при удержании вызова
load => res_musiconhold.so
load => res_adsi.so
load => pbx_config.so
; список необходимых кодеков
load => codec_a_mu.so
load => codec_adpcm.so
load => codec_alaw.so
load => codec_ulaw.so
load => codec_gsm.so
load => codec_ilbc.so
load => codec_lpc10.so
; нужен если использовать платы Dahdi для аналоговых линий
load => chan_dahdi.so
; парковка вызовов
load => res_parking.so 
; ниже модули которые мне понадобились при настройке записи разговоров
; требуется если используется res_monitor.so
load => func_periodic_hook.so
; требуется если используется res_monitor.so, функция STRFTIME
load => func_strings.so
; требуется если используется res_monitor.so для определения номера, функция CALLERID
load => func_callerid.so
; требуется если используется res_monitor.so для MixMonitor
load => app_dial.so
; для записи разговоров
load => res_monitor.so
; для поддержки формата WAV
load => format_wav.so
; для поддержки формата MP3
load => format_mp3.so
; для записи статистики звонков в MySQL базу
load => cdr_mysql.so
; для включения функционала SNMP, например чтобы собирать статистику различными системами мониторинга
load => res_snmp.so
; для совершения вызовов из контекста помещаемых файлов в директорию /var/spool/asterisk/outgoing/
load => pbx_spool.so

Чтобы применить изменения в файле /etc/asterisk/modules.conf выполним команду из консоли Asterisk:

module reload

Если понадобится, сам Asterisk можно перезагрузить так:

sudo service asterisk restart

Оповещения Zabbix по телефону через Asterisk

Однажды ночью на станции отключились кондиционеры и начала подниматься температура, естественно мне пришли уведомления на телефон, но так как была ночь, увидел я их только утром, поэтому понадобилось для таких экстренных случаев быстро сделать возможность уведомлений звонком на телефон.

Наведу пример варианта оповещений Zabbix используя телефонный вызов через Asterisk.

У Asterisk должен быть загружен модуль, для этого откроем файл конфигурации модулей, например в редакторе nano (Ctrl+X для выхода, y/n для сохранения или отмены изменений):

sudo nano /etc/asterisk/modules.conf

И проверим есть ли cтрока, если нет — добавим:

load => pbx_spool.so

А также подгрузим его в данный момент:

sudo asterisk -rvv
module load pbx_spool
quit

В моем случае Zabbix и Asterisk находятся на разных серверах.

На сервере с Asterisk я написал русский текст уведомления в текстовый файл high_temperature.txt которое должно воспроизвестись при звонке.

Установил festival, русский мужской голос чтобы конвертировать текст в звуковой файл и rsync чтобы копировать файл звонка на сервер Asterisk:

sudo apt-get install festival festvox-ru rsync

Собственно команда конвертации текста в звуковой файл:

text2wave -eval '(voice_msu_ru_nsh_clunits)' < high_temperature.txt > high_temperature.wav

Далее конвертировал формат файла wav в ulaw, так как у меня используется он:

sox -V high_temperature.wav -r 8000 -c 1 -t ul high_temperature.ulaw

И переместил готовый звуковой файл в директорию со звуковыми файлами Asterisk:

sudo mv high_temperature.ulaw /usr/share/asterisk/sounds/ru_RU/high_temperature.ulaw

Смотрите также — Как конвертировать звуковые файлы в ulaw, alaw, gsm, g722 и т.д. для Asterisk

На сервере с Zabbix используя текстовый редактор nano я создал файл:

sudo nano /etc/zabbix/zabbix.call

И добавил в него содержимое (где 0670000000 номер телефона на который нужно звонить, а цифра 4 это номер канала Goip4 GSM шлюза с которого будет совершен звонок):

Channel: SIP/goip4/40670000000
Application: Playback
Data: high_temperature
MaxRetries: 10
RetryTime: 60
WaitTime: 30

На файл я установил права 777 чтобы разрешить доступ всем, пользователь zabbix будет его копировать, а на другом сервере пользователь asterisk прочитает и удалит после звонка:

sudo chmod 777 /etc/zabbix/zabbix.call

Также нужно создать сам файл скрипта, который будет выполнять Zabbix (я создал в директорий со скриптами zabbix/alert.d/asterisk_call.sh):

rsync -avh -e "ssh -p 22" /etc/zabbix/zabbix.call root@192.168.1.5:/var/spool/asterisk/outgoing/zabbix.call

Скрипт просто копирует файл zabbix.call на сервер с Asterisk в директорию /var/spool/asterisk/outgoing/, после попадания в которую, Asterisk сразу обрабатывает его и совершает звонок.
По сути скрипту можно передавать номер звонящего и составлять файл zabbix.call, но мне это не нужно было.

Если Asterisk и Zabbix на одном сервере, то строку в скрипте заменим на:

cp /etc/zabbix/zabbix.call /var/spool/asterisk/outgoing/zabbix.call

Или:

rsync -avh /etc/zabbix/zabbix.call /var/spool/asterisk/outgoing/zabbix.call

Чтобы rsync выполнял копирование без запроса пароля, нужно сгенерировать SSH ключ и скопировать его на сервер Astersik, как это делать я описывал в конце статьи — Установка и настройка SSH

Если доступ к серверу по SSH предоставляется пользователю root, то в целях безопасности можно ограничить доступ по IP средствами SSH:

sudo nano /etc/ssh/sshd_config
AllowUsers user1 user2 root@192.168.1.4
sudo service ssh restart

Если проблемы с правами на сервере с Zabbix, например при копировании call файла, можно в файле конфигурации /etc/zabbix/zabbix_server.conf указать следующий параметр:

AllowRoot=1

Осталось добавить новый тип оповещения в панели Zabbix («Администрирование» — «Способы оповещений»).
Далее создал новую группу узлов и добавил устройство для которого отрабатывает триггер о высокой температуре.
Создал отдельного пользователя, указал ему созданный тип оповещения и добавил в созданную группу узлов.
Также добавил действие в «Настройка» — «Действия» указав отправку сообщений через скрипт.

Все, после срабатывания триггера, Zabbix выполнит скрипт который скопирует готовый call файл на сервер Asterisk, а он уже обработает его и совершит звонок, как указано в файле — «MaxRetries: 10», будет пытаться дозвонится 10 раз.

Скрипт отправки СМС через Goip4 шлюз

Приведу пример скрипта написанного на PHP, для отправки СМС сообщений через Goip4 шлюз.
Скрипт получает данные из базы SQL запросом и поочередно отправляет СМС на каждый номер, а также заносит запись об отправке в специальную таблицу sms.

#!/usr/bin/php

<?php

include("config/config.inc.php");
include("config/connect.inc.php");


$Result = mysqli_query($db,
"
SELECT
    abon.first_name,
    abon.second_name,
    abon.id as id,
    abon.depozit as balance,
    abon.id,
    abon.otkl,
    abon.mobile,
    abon.tarif,
    new_tarif.cost_day,
    new_tarif.cost as cost_month,
    new_tarif.dayORmonth as period
FROM
    abon, new_tarif
WHERE
    abon.tarif = new_tarif.id AND abon.state=1 AND abon.killed='' AND abon.tarif=114
"
);


while($Row = mysqli_fetch_array($Result))
{
$user = $Row[id];
$balance =$Row[balance];
$phone = $Row[mobile];

$phone_length=strlen($phone);

if($phone_length==10)
{
$mess_ = "Текст сообщения. На вашем счету $balance";
$mess =  rawurlencode($mess_);

print("$phone           $mess_\n");

//test phone
//$phone = "0670000000";
$r = file_get_contents("http://192.168.22.10/goip/en/dosend.php?USERNAME=ЛОГИН&PASSWORD=ПАРОЛЬ&smsprovider=3&goipname=lifecell&smsnum=$phone&method=2&Memo=$mess");
mysqli_query($db, "INSERT INTO sms VALUES(NULL, '$user', '$phone', NOW(), '$mess_', '$balance')");
//print($r);
//exit();

}
}
?>

Содержимое config.inc.php:

<?php
$mysql_host="localhost";
$mysql_user="ЛОГИН";
$mysql_password="ПАРОЛЬ";
$mysql_base="БАЗА";
?>

Содержимое connect.inc.php:

<?php
$db=mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_base);
mysqli_query($db, "SET NAMES 'utf8'");
?>

Как конвертировать звуковые файлы в ulaw, alaw, gsm, g722 и т.д. для Asterisk

После заказа озвучки у профессионального диктора и нарезки в звуковом редакторе, понадобилось сохранить звуки в разных форматах, оригинал был в wav, так вот приведу пример конвертации через sox (он уже был в системе с Asterisk):

sox -V vm-intro.wav -r 8000 -c 1 -t ul vm-intro.ulaw
sox -V vm-intro.wav -r 8000 -c 1 -t al vm-intro.alaw
sox -V vm-intro.wav -r 8000 -c 1 -t gsm vm-intro.gsm

Кодек g722 вроде он не поддерживает, по крайней мере в man sox не нашел, поэтому установил ffmpeg (в системе Ubuntu Server):

sudo apt-get install ffmpeg

И выполнил конвертирование:

ffmpeg -i vm-intro.wav -ar 16000 -acodec g722 vm-intro.g722

Стандартная директория со звуками Asterisk — /usr/share/asterisk/sounds

Как убрать отображение «New User» в CallerID Asterisk

Заметил однажды, что при входящих звонках с Goip4 шлюза на SIP телефонах отображается не только номер звонящего, а и переменно с номером телефона мигает имя «New User», которое явно лишнее и мешает.

После просмотра конфигурационных файлов Asterisk, заметил в файле /etc/asterisk/users.conf в секции general некоторые стандартные значения, а именно:

[general]
fullname = New User

Которые нужно закомментировать:

;fullname = New User

И перезапустить Asterisk чтобы применить изменения:

sudo service asterisk restart

Все, теперь при входящих звонках будет отображаться только номер телефона.

Решение ошибки в Asterisk «File vm-newn does not exist in any format»

При звонке на номер голосовой почты заметил в консоли Asterisk следующие ошибки:

[Apr 10 17:08:01] WARNING[19135][C-00001cf4]: file.c:701 ast_openstream_full: File digits/1n does not exist in any format
[Apr 10 17:08:01] WARNING[19135][C-00001cf4]: file.c:1017 ast_streamfile: Unable to open digits/1n (format (ulaw)): No such file or directory
[Apr 10 17:08:01] WARNING[19135][C-00001cf4]: file.c:701 ast_openstream_full: File vm-newn does not exist in any format
[Apr 10 17:08:01] WARNING[19135][C-00001cf4]: file.c:1017 ast_streamfile: Unable to open vm-newn (format (ulaw)): No such file or directory

Ошибки возникают из-за отсутствия звуковых файлов, например в моем случае в голосовой почте одно сообщение и при попытке сказать «у вас одно(1n.ulaw) новое(vm-newn) сообщение возникает ошибка и ложится трубка.

Архив с набором нужных файлов достаточно просто загрузить с официального сайта http://downloads.asterisk.org/pub/telephony/sounds/releases/ и распаковать в директорию /usr/share/asterisk/sounds
После этого ошибки не должно быть.