Voicemail

Давно я не писал о Звездочке, но волею судеб, возможно скоро сменю работу. Буду трудиться в UseLess Inc.:) где под мои чутким руководством, не покладая пакетов, будут работать десятки серверов IP-телефонии.
Что такое Голосовая почта, зачем она нужна, все за и против опустим. Кто-то пользуется, как я, кто-то бросает трубку едва услышав голос робота(таким личностям строго запрещено читать далее)

Настройки грозной машини Голосовой почти хранятся в файле voicemail.conf(если кто забыл)
Секция [general], позвоялет настроить глобальные параметры голосовой почты.

Опция Значения Описание
format wav49|gsm|wav Указывает в каком формате мы можем сохранять файлы, будьте внимательны, тут еще используется устаревший разделитель | (Когда уже выпилят этот анахронизм)
serveremail [email protected] От кого будет отправлено письмо
attach yes,no Прикреплять ли запись к письму
maxmsg 9999 Максимальное к-во сообщений в ящике
maxsecs 9999 Максимальная продолжительность сообщения
minsecs 4 Минимальная продолжительность сообщения(если меньше, то сообщение не сохраниться)
maxgreet 1800 Максимальная продолжительность приветствия
skipms 1800 Шаг перемотки сообщения, с помощью * и #
maxsilence 5 После заданного к-ва секунд тишины, запись прекратиться
silencethreshold 128 Определяет уровень тишины(лучше не трогать)
maxlogins 3 К-во неуспешных входов в голосовую почту, после которых Астер положит трубку
moveheard yes Перемещать прослушанные сообщения в папку OLD
forward_urgent_auto no если no пользователь может устанавливать степень важности при пересылке
userscontext default если используете users.conf, можно указать контекст в котором зарег запись
externnotify /path/to/script Выполнить заданный скрипт после сохранения сообщения
smdienable no Если используете Астер как сервер голосовй почты на PBX которая поддерживает SMDI, то вкл это здесь:)
smdiport /dev/ttyS0 Указываем порт SMDI по которому будут ходить сообщения к нашей АТС
externpass /path/to/script При смене пароля, указанный здесь скрипт будет оповещен об этом(ящик, пароль, контекст) и должен будет внести изменения в voicemail.conf
externpassnotify /path/to/script При смене пароля, указанный здесь скрипт будет оповещен об этом(ящик, пароль, контекст), Asterisk сам изменит voicemail.conf. Если указана предыдущая опция, то эта будет проигнорирована
externpasscheck /path/to/voicemailpwcheck.py Проверяет сложность пароля, ведь голосовая почта нуждается в защите:)
directoryintro dir-intro Приветствие по умолчанию для приложения Directory()
charset ISO-8859-1 Устанавливает набор символов, по умолчанию Latin1, UTF8 давай 21век:)
adsifdn 0000000F при использовании Analog Display Services Interface(ADSI) настраивает Feature Descriptor Number.
adsisec 9BDBF7AC Устанавливает security lock code.
adsiver 1 Устанавливает версию голосовой почты АDSI
pbxskip yes Если не хотим видеть в теме письма PBX, то ставим yes
fromstring The Asterisk PBX Устанавливаем поле From: в письме
usedirectory yes Позволяет составлять письма из своих ящиков, чтобы использовать преимущества Directory()
odbcstorage item from res_odbc.conf Позволяет хранить письма в базе данных, здесь указываем коннектор к базе
odbctable table name Указывает таблицу в которой храниться почта
emailsubject [PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} Настраиваем поле Subject: в емейле
emailbody Dear ${VM_NAME}:\n\n\tjust wanted to let you know you were just left a ${VM_DUR} long message (number ${VM_MSGNUM})\nin mailbox ${VM_MAILBOX u might\nwant to check it when you get a chance. Thanks!\n\n\t\t\t\t—Asterisk\n Настраиваем настраиваем текст емейла
emaildateformat %A, %d %B %Y at %H:%M:%S Настраиваем формат даты и времени емейлов.Используйте те же правила как и функция STRFTIME в языке С
mailcmd /usr/sbin/sendmail -t Указываем кто будет нам писать письма, по умолчанию пишет дефолтный почтовик ОС
pollmailboxes no, yes Если вы кладете в ящик пользователя не только приложением voicemail, то установив yes, Asterisk будет перелопачивать ящики пользователей, и менять состояние индикатора(MWI), даже если мы положили в ящик сообщение другой программой
pollfreq 30 Таймаут между опросами ящиков, если задана прерыдущая опция
imapgreetings no, yes Позволяет хранить приветствия в IMAP хранилище
greetingsfolder INBOX Указываем папку на IMAP сервера где будут храниться приветствия
imapparentfolder INBOX Указываем родительскую папку на IMAP сервера для ваших ящиков
imapserver localhost Указываем адрес IMAP сервера
imapport 143 Указываем порт IMAP сервера
imapflags ssl Необязательный параметр доступа к IMAP серверу. Например ‘ssl’ включает OpenSSL шифрование подразумевается что IMAP библиотеки скомпилированы с поддержкой OpenSSL.
imapfolder INBOX Папка в которой хранятся сообщения на сервере. по умолчанию INBOX.
authuser user Мастер пользователь который подключается к IMAP серверу, если сервер настроен с одним пользователем у которого есть доступ ко всем ящикам
authpassword password пароль мастер пользователя
imapopentimeout 60 таймаут открытия TCP(в секундах)
imapclosetimeout 60 таймаут закрытия TCP(в секундах)
imapreadtimeout 60 таймаут чтения TCP(в секундах)
imapwritetimeout 60 таймаут записи TCP(в секундах)

Есть еще возможность отправлять сообщения на пейджер!!(Покажите мне человека которые ними пользуется)

Каждый ящик описывается в виде =,,,,
если задан e-mail сообщение будет отправлено на почту. ЕСЛИ ПАРОЛЬ С ПРЕФИКСОМ ‘-‘, то его изменить невозможно.

Кроме секции общих настроек есть дополнительные опции, которые могут быть заданы для каждого ящика отдельно и переопределять значения, которые указаны в секции [general]:

Опция Значения Описание
tz eastern, european, etc. Определяет временную зону, более подробно далее
locale de_DE.utf8, es_US.utf8, etc. Как генерировать дату и время в разных локализациях. Посмотреть список локализаций locale -a
attach yes, no Добавлять ли к письму еще и само сообщение
attachfmt wav49, wav, etc. Формат голосового сообщения
saycid yes, no Проговаривать номер, кто оставил сообщение saycid=yes Если не задано или no, то будет указано в письме.
Если задан, если существует файл с таким же именем как caller id в папке /recordings/callerids, то будет воспроизводиться он, а не номер(по одной цифре)
cidinternalcontexts , Внутренний контекст для воспроизведения имени, вместо caller id
sayduration yes, no Добавляет длительность сообщения
saydurationm 2 минимальная длительность сообщения, о которой следует говорить, по умолчанию 2
dialout context Разрешить пользователям звонить из своих ящиков! если задано то нажав 4 в ящике, мы попадем в этот контекст. НЕБЕЗОПАСНО
sendvoicemail yes, no Позволяет создавать сообщения, из своего ящика, и отправлять другим пользователям, кнопка 5 в меню ящика
searchcontexts yes, no Позволяет не определять контекст для голосовой почты. Будет искать во всех контекстах голосовой почты. Не рекомендуется
callback Какой контекст использовать при звонке отправителю сообщения, нужно чтобы контекст обрабатывал формат набора втч международный(если необходимо)
exitcontext Определяет контекст в который может выйти абонент во время того как оставляет сообщение, например нажав 0 может попасть к оператору, по умолчанию возвращается в контекст откуда пришел
review yes, no Должно стоять да, ведь люди расстраиваются если не могут прослушать свои сообщения до их отправки
operator yes, no Предоставить возможность выхода пользователя из голосовой почты(нажав ноль), если он не хочет оставлять сообщение предусмотрите номер о и укажите его обработчик в exitcontext
envelope no, yes Включение/выключение воспроизведение доп сведений перед воспроизведения сообщения. Это не влияет на опцию 3,3 из Меню расширенных настроек ящика
delete no, yes Удалять сообщения после отправки на емейл, не рекомендуется
volgain 0.0 Увеличивает громкость сообщений, требует sox, лучше не использовать
nextaftercmd yes, no Включает следующее сообщение после нажатия 7 или 9(сохр удаление текущего)
forcename yes, no Предлагает новому пользователю, который зашел со своим паролем записать имя.
forcegreetings yes, no то же что и выше но только для приветствий
hidefromdir yes, no Спрятать определенные ящики от приложения Directory()
tempgreetwarn yes, no Напоминание владельцу ящика что у него установлено временное приветствие, удобно если люди вернулись с отпуска
passwordlocation spooldir Можно заставить астериск хранить пароли в: voicemail.conf, папке spool для каждого ящика в файле secret.conf. неприменимо для realtime пользователей.
messagewrap no, yes Нажав 6 на последнем сообщении мы перейдем к первому, нажав 4 на первом перейдем к последнему
minpassword 6 Минимальная длина пароля
vm-password custom_sound Приглашение на ввод пароля
vm-newpassword custom_sound Приглашение на ввод нового пароля
vm-passchanged custom_sound Сообщение об успешной смене пароля
vm-reenterpassword custom_sound Приглашение для повторного ввода пароля
vm-mismatch custom_sound Сообщение о том что введенный пароль и повторно введенный пароль не совпадают
vm-invalid-password custom_sound Сообщение о неправильном пароле
vm-pls-try-again custom_sound Сообщение «Попробуйте еще раз»
listen-control-forward-key # Кнопка перемотки вперед сообщения
listen-control-reverse-key * Кнопка перемотки назад
listen-control-pause-key 0 Кнопка паузы
listen-control-restart-key 2 Кнопка повтора
listen-control-stop-key 13456789 Кнопка остановки воспроизведения
backupdeleted 0 Корзина сообщений, какое количество сообщений будет храниться даже после их удаления, 0 отключает опцию

Секция [zonemessages]
Доступные временные зоны можно посмотреть здесь /usr/share/zoneinfo/
Можно создавать и свои временные зоны, нужно для удобного отображение даты и времени пользователям голосовой почты
кое что мы можем поменять:
‘filename’ название звукового файла(кавычки обязательны!)
${VAR} переменная
A или a день недели (Saturday, Sunday, …)
B или b или h месяц (January, February, …)
d или e номер дня в месяце (1,2,3…31)
Y Год
I или l часы, 12ч формат
H Часы, 24ч формат (часы с «oh»)
k Часы, 24 hour clock (часы без «oh»)
M Минуты, с 00 произносятся как «o’clock»
N минуты, с 00 произносятся как «сотни» (US военные)
P или p AM или PM
Q «сегодня», «вчера» или ABdY(нестандартное strftime значение)
q «» (сегодня), «yesterday», weekday, или ABdY(нестандартное strftime значение)
R 24 формат с минутами

Название зоны Значения Описание
eastern America/New_York|’vm-received’ Q ‘digits/at’ IMp (EST/EDT)
central America/Chicago|’vm-received’ Q ‘digits/at’ IMp (CST/CDT)
central24 America/Chicago|’vm-received’ q ‘digits/at’ H N ‘hours’ (CST/CDT) но в 24 часовом формате
military Zulu|’vm-received’ q ‘digits/at’ H N ‘hours’ ‘phonetic/z_p’ GMT
european Europe/Copenhagen|’vm-received’ a d b ‘digits/at’ HM Central European time (CEST)

В большинстве случаев хватает стандартного default контекста голосовой почты, но можно делать и свои:)
Формат ящика:

mailbox => password[,FirstName LastName[,email addr[,pager addr[,options[|options]]]]]

mailbox — номер ящика, обычно совпадает с номером абонента
password — цифровой пароль к ящику
FirstName LastName — Имя Фамилия Владельца ящика. Данные этих полей используется для определения пользователя
email address — почта на которую будут отправлены письма о сообщениях в голосовой почте
pager address — да да пейджер!!!
options — возможно добавить 9 опций: attach, serveremail, tz, saycid, review, operator, callback, dialout, exitcontext. которые переопределяют значения установленные ранее. Опции устанавливаются связками option = значение, и разделяется с помощью |

Пример:

; Voicemail Configuration

[general]
format=wav49|wav
[email protected]
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %B %d, %Y at %r
pagerdateformat=%A, %B %d, %Y at %r
sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside

[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM

[shifteight.org]
100 => 1234,Leif Madsen,[email protected]
101 => 1234,Jim Van Meggelen,[email protected]
102 => 1234,Russell Bryant,[email protected]
103 => 1234,Jared Smith,[email protected]

Для интеграции с диалпланом используется два приложения
VoiceMail() — сохраняет сообщения
Синтаксис:
VoiceMail(mailbox[@context][&mailbox[@context][&…]][,options])
Опции:
b — абонент услышит сообщение о занятости владельца почтового ящика.
u — абонент услышит сообщение о недоступности владельца почтового ящика (если таковое существует).
d([c]) полученные цифры должны будут быть обработаны в контексте с. Если его нет то в текущем.
g(число) Увеличивает громкость записи на заданное число децибел (дБ). Только на DAHDI каналах.
s Пропускается воспроизведение инструкций.
U — Пометить сообщение как важное. Удобно если почта храниться на IMAP
P — Пометить сообщение как приоритетное.

Стандартный экстеншен с возможностью указания что абонент занят или недоступен

exten => 101,1,Dial(${JOHN},10)
   same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
   same => n(unavail),VoiceMail([email protected],u)
   same => n,Hangup()
   same => n(busy),VoiceMail([email protected],b)
   same => n,Hangup()

VoiceMailMain() — позволяет прослушивать и управлять ящиком
Синтаксис:

VoiceMailMain([mailbox][@context][,options])

Опции:
p — Эта опция указывает Asterisk трактовать значение почтовыйящик как номер, который должен быть добавлен в начало имени почтового ящика, введенного абонентом. Чаще всего это используется, когда на одном сервере Asterisk располагается много ящиков голосовой почты для разных компаний.
g(#) — При записи сообщений голосовой почты увеличивает их громкость на величину прирост. Эта опция должна быть задана как целое число, обозначающее количество децибел.
s — Не проводится проверка пароля.
a(папка) — Сообщение папки пропускается, и выполняется переход непосредственно к папке, заданной параметром папка. Значение по умолчанию для этой опции – 0. Возможные значения: 0 — INBOX, 1 — Old, 2 — Work, 3 — Family, 4 — Friends, 5 — Cust1, 6 — Cust2, 7 — Cust3, 8 — Cust4, 9 — Cust5
Для Управления почтой проще всего создать экстеншен типа:

exten => 5000,1,VoiceMailMain() 

Directory() приложение, используя имена, заданные в описаниях почтовых ящиков в файле voicemail.conf, предоставляет абоненту телефонный справочник абонентов АТС для набора номеров по имени.
принимает три аргумента: контекст голосовой почты, из которого считываются имена, контекст диалплана, в котором вызывается пользователь (необязательный), и строку опций (также необязательный). По умолчанию Directory() ведет поиск пользователя по фамилии.
Если передается опция f, поиск осуществляется по имени.
exten => 8,1,Directory(default,incoming,f)
exten => 9,1,Directory(default,incoming)

Для добавления джитбуфера следует пропустить нашу голосовую почту через локальный канал:

[Services]
exten => 5000,1,Dial(Local/[email protected]/nj)
exten => vmm,1,VoiceMailMain()

j- включает джитбуфер
n- указывает что канал не был оптимизирован другим способом.

В папке с записанными звонками хранятся также файлы msg####.txt в которых содержится дополнительная информация о сообщении. На этот файл и реагируют MWI

веб-интерфейс
Если не чистить после сборки то можно найти:
/usr/ports/net/asterisk/files/contrib/scripts/vmail.cgi
1. копируем в папку с CGI скриптами,
2. разрешаем чтение файла voicemail.conf всем.
3. В апаче разрешить CGI

AddHandler cgi-script .cgi .pl 

4. Закоментировать строку 20 в CGI файле
5. Подправить строку 148, чтобы указывало где искать
6. Подправить путь к картинкам почты(/images)
7. Права на доступ к INBOX(а то не сможем читать писать удалять)

На этом думаю все! Позже будет рассмотрено как можно хранить почту в БД, но это совсем другая история.

Комментарии: