Глава 5

Голосовая почта

Просто оставьте сообщение, может быть, я позвоню.

—Джо Уолш

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

Комедийная почта

Одной из самых популярных (или, возможно, непопулярных) функций любой современной телефонной системы является голосовая почта. Asterisk имеет достаточно гибкую систему голосовой почты с именем Comedian Mail.1 Голосовая почта в Asterisk предоставляется в диалплане модулем app_voice mail.so.

Некоторые из функций системы голосовой почты Asterisk включают в себя:

  • Неограниченные, защищенные паролем ящики голосовой почты, каждый из которых содержит папки почтовых ящиков для организации голосовой почты
  • Различные приветствия для состояния «занято» и «недоступен»
  • Встроенные и пользовательские приветствия
  • Возможность связывать телефоны с несколькими почтовыми ящиками и почтовые ящики с несколькими телефонами
  • e-mail уведомления о голосовой почте, с голосовой почтой, необязательно вложенной как звуковой файл2
  • Переадресация и трансляция голосовой почты
  • Индикатор ожидающего сообщения (мигающий идникатор или зашифрованный тон) на многих типах телефонов
  • Каталог сотрудников компании на основе ящиков голосовой почты

И это лишь верхушка айсберга!

Для версии конфигурации файла по умолчанию /etc/asterisk/voicemail.conf требуется несколько настроек, чтобы обеспечить конфигурацию, подходящую для большинства ситуаций.

Сначала мы рассмотрим различные параметры, которые вы можете определить в файле voicemail.conf, а затем мы предоставим образец файла конфигурации с настройками, которые мы рекомендуем для большинства развертываний.

Файл voicemail.conf содержит несколько разделов, в которых параметры могут быть определены. В следующих разделах описаны все доступные опции.

Раздел [general]

Первый раздел — [general], позволяет вам определять глобальные настройки для вашей системы голосовой почты. Доступные параметры перечислены в Таблице 8-1.

Таблица 8-1. раздел опций [general] для for voicemail.conf

Опция Значение/Пример Примечание
format wav49|gsm|wav Для каждого из перечисленных форматов Asterisk создает отдельную запись в этом формате всякий раз, когда оставляется сообщение. Преимущество состоит в том, что некоторые шаги транскодирования могут быть пропущены, если сохраненный формат совпадает с кодеком, используемым на канале. Нам нравится WAV, потому что это самое высокое качество, и WAV49, потому что он славно сжат и легко отправляется по электронной почте. Нам не нравится GSM из-за его колющего звука, но он пользуется некоторой популярностью.a
serveremail user@domain Когда письмо отправляется из Asterisk, это адрес электронной почты, который, по-видимому, будет в поле «От:».b
attach yes,no Если для почтового ящика указан адрес электронной почты, это определяет, прикреплено ли голосовое сообщение к электронной почте (если нет, отправляется сообщение с простым оповещением).
maxmsg 9999 По умолчанию Asterisk позволяет хранить не более 100 сообщений
maxsecs 0 Этот тип настроек был полезен, когда большая система голосовой почты могла иметь только 40 МБc памяти: необходимо было ограничить систему, потому что было легко заполнить жесткий диск. Этот параметр может раздражать вызывающих абонентов (хотя это заставляет их дойти до сути, поэтому некоторым людям он нравится). В настоящее время, когда терабайтные приводы распространены, нет никаких технических причин для ограничения длины сообщения. Два соображения: 1) если канал попадает в почтовый ящик, полезно установить какую-то ценность, чтобы он не оставался там в течение нескольких дней, но 2) если пользователь хочет использовать свой почтовый ящик для записи заметок себе, он не будет оценить, если вы отключите её через 3 минуты. Вероятно, настройка будет составлять от 600 секунд (10 минут) до 3600 секунд (1 час).
minsecs 4 Многие люди будут класть трубку, а не оставлять сообщение, когда они звонят кому-то и получают голосовую почту. Иногда это происходит после начала записи, поэтому владелец почтового ящика получает раздражающее 2-секундное сообщение о том, что кто-то положил трубку. Этот параметр гарантирует, что Asterisk будет игнорировать сообщения, которые короче заданной минимальной длины. Вы должны позаботиться о том, чтобы не устанавливать слишком высокое значение, потому что тогда сообщение «Эй, это я, позвоните мне» (что можно сказать менее чем за 1 секунду) потеряется, а вы будете получать жалобы на исчезновение сообщений. Кажется, что три секунды — верный результат. Чтобы препятствовать людям оставлять ультракороткие сообщения, которые могут быть отброшены, ваше приветствие может потребовать от абонентов идентифицировать себя и оставить некоторую информацию о том, что они хотели.
maxgreet 1800 Вы можете определить максимальную длину приветствия, если хотите. Опять же, поскольку хранение не является проблемой, и установка слишком низкого значения будет раздражать ваших более многословных пользователей, мы предлагаем установить его на максимум и позволить пользователям определить подходящую длину для себя.
skipms 3000 При прослушивании сообщений пользователи могут пропустить вперед или назад, нажав (по умолчанию) * и #. Этот параметр указывает длину скачка (в миллисекундах).
maxsilence 5 Этот параметр определяет максимальное время, в течение которого вызывающий абонент может оставаться молчащим до остановки записи. Нам нравится устанавливать этот параметр на 1 секунду дольше, чем minsecs (если вы установите его равным или больше minsecs, вы получите предупреждение о том, что «maxsilence должно быть меньше minsecs или вы можете получать пустые сообщения»). Это значение, наиболее полезно, когда у вас есть аналоговые транки, поскольку разъединение дальнего конца может быть хитрым на таких линиях. При использовании любой цифровой линии (PRI или VoIP) сообщение о разъединении на дальнем конце будет довольно аккуратно обрабатывать конец сообщения, и на самом деле вам может потребоваться увеличить это значение до 10 секунд, чтобы уменьшить вероятность того, что тихие люди случайно отключатся в середине сообщения.
silencethreshold 128 Этот параметр позволяет точно настроить чувствительность к тишине предыдущего параметра, maxsilence. Допустимые значения от 0 до 32767. Значение по умолчанию — 128. Значение помогает app_voicemail решить, какую амплитуду использовать в качестве контрольной точки относительно того, что она будет рассматривать как «тишину». Поскольку это линейное значение, а амплитуда должна быть надлежащим образом рассматриваема в децибелах (которые являются логарифмическими), мы не рекомендуем настраивать этот параметр, если у вас нет четкого понимания амплитуды, децибел, логарифмических масштабов, программирования на С, обработки цифрового сигнала и т. д. Если у вас проблемы со звуком в вашей системе, это не первое место чтобы попытаться их решить.
maxlogins 3 Эта небольшая функция безопасности предназначена для того, чтобы атаки брут-форсом на ваши пароли почтовых ящиков были более трудоемкими. Если неверный пароль получен много раз, голосовая почта будет отключаться, и вам придется перезвонить, чтобы повторить попытку. Обратите внимание, что это не заблокирует почтовый ящик. Терпеливые детективы могут продолжать пытаться войти в ваш почтовый ящик столько раз, сколько захотят, им просто нужно будет перезвонить каждую третью попытку. Если у вас много пользователей с толстыми пальцами, вы можете установить например 5.
moveheard yes Этот параметр переместит прослушиваемые сообщения в папку Old. Мы рекомендуем оставить по умолчанию.
forward_urgent_auto no Установка этого параметра в yes будет сохранять исходную настройку срочности любых сообщений, которые пользователь получает, а затем пересылает далее. Если вы оставите его без ответа, пользователи могут сами установить уровень срочности в сообщениях, которые они пересылают.
userscontext default Если вы используете файл users.conf (мы этого не делаем), вы можете определить здесь контекст, где регистрируются записи.
externnotify /путь/к/скрипту Если вы хотите запускать внешнее приложение, когда сообщение остается, вы можете определить его здесь.
smdienable no Если вы используете Астериск в качестве сервера голосовой почты на АТС, которая поддерживает SMDI, вы можете включить его здесь.
smdiport /dev/ttyS0 Здесь вы должны определить порт SMDI, через который будут передаваться сообщения между Asterisk и внешней АТС.
externpass /путь/к/скрипту Каждый раз, когда пароль в почтовом ящике изменяется, скрипт, который вы определяете здесь, будет уведомлен о context, mailbox и new password. Затем скрипт будет отвечать за обновление voicemail.conf (приложение голосовой почты Астериска не будет обновлять пароль, если этот параметр определен).
externpassnotify /path/to/script Каждый раз, когда пароль в почтовом ящике изменяется, скрипт, который вы определяете здесь, будет уведомлен о context, mailbox и new password. Астериск будет обрабатывать обновление пароля в voicemail.conf. Если вы определили externpass, этот параметр будет проигнорирован.
externpasscheck /usr/local/bin/voice mailpwcheck.py См. врезку в этой таблице для описания этой опции.
directoryintro dir-intro Приложение диалплана Directory() использует файл voicemail.conf для поиска по имени из автосекретаря. Существует приглашение воспроизводимое по умолчанию, которое называется dir-intro. Если вы хотите, то можете указать вместо этого другой файл.
charset ISO-8859-1 Если вам нужен набор символов, отличный от ISO-8859-1 (a.k.a Latin 1), вы можете указать его здесь.
adsifdn 0000000F Используйте этот параметр для настройки Feature Descriptor Number.d
adsisec 9BDBF7AC Используйте этот параметр для настройки кода блокировки безопасности.
adsiver 1 Указывает номер версии приложения голосовой почты ADSI.
pbxskip yes Если вы не хотите, чтобы в тему сообщения электронной почты с вашей голосовой почтой добавлялась строка [PBX], вы можете установить ее как yes.
fromstring The Asterisk PBX Этот параметр можно использовать для настройки имени From:, которое будет отображаться в электронной почте с вашей АТС.
usedirectory yes Эта опция позволяет пользователям, составляющим сообщения из своих почтовых ящиков, использовать справочник.
odbcstorage <item from res_odbc.conf> Если вы хотите хранить голосовые сообщения в базе данных, то можете сделать это, используя коннектор res_odbc. Здесь вы должны указать имя элемента в файле res_odbc. Подробнее см. в Главе 22.
odbctable <table name> Этот параметр указывает имя таблицы в базе данных, к которой относится параметр odbcstorage. Подробнее см. в Главе 22.
emailsubject [PBX]: New message $⁠{VM_MSGNUM} in mailbox $⁠{VM_MAILBOX} Когда Asterisk отправляет электронное письмо, вы можете использовать этот параметр, чтобы определить, как будет выглядеть строка Subject: Подробнее см. файл voicemail.conf.sample.
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} umight\nwant to check it when you get a chance. Thanks!\n\n\t\t\t\t—Asterisk\n Когда Asterisk отправляет электронное письмо, вы можете использовать этот параметр, чтобы определить, как будет выглядеть тело письма. Подробнее см. файл voicemail.conf.sample.
pagerfromstring The Asterisk PBX Мы не знаем никого, кто ещё использует пейджеры (и мы не можем вспомнить, чтобы видели его за многие годы), но если у вас есть одна из этих исторических странностей и вы хотите настроить чтобы Asterisk отправлял уведомления на пейджер, вы можете сделать это. Очень практичное применение этой функции для уведомлений о голосовой почте — это отправить короткое сообщение на шлюз электронной почты-SMS.
pagersubject New VM Как и выше.
pagerbody New ${VM_DUR} long msg in box ${VM_MAILBOX}\nfrom $­{VM_CALLERID}, on ${VM_DATE} Форматирование для этого использует те же правила, что и emailbody.
emaildateformat %A, %d %B %Y at %H:%M:%S Этот параметр позволяет указать формат даты в письмах. Использует те же правила, что и функция C STRFTIME.
pagerdateformat %A, %d %B %Y at %H:%M:%S Этот параметр позволяет указать формат даты в pagerbody. Использует те же правила, что и функция C STRFTIME.
mailcmd /usr/sbin/sendmail -t Если вы хотите переопределить приложение операционной системы по умолчанию для отправки почты, вы можете указать его здесь.
pollmailboxes no, yes Если содержимое почтовых ящиков не изменено ничем, кроме app_voicemail (например, внешними приложениями или другой системой Asterisk), установка этого параметра yes приведет к тому, что app_voicemail опросит все почтовые ящики на изменения, что вызовет правильные обновления ожидающего сообщения (MWI),
pollfreq 30 Используется совместно с pollmailboxes, эта опция указывает количество секунд ожидания между опросами почтовых ящиков.
imapgreetings no, yes Включает/отключает удаленное хранение приветствий в папке IMAP. Подробнее см. Главу 18.
greetingsfolder INBOX Если вы включили imapgreetings, этот параметр позволяет вам определить папку, в которой будут сохранены ваши приветствия (по умолчанию — INBOX).
imapparentfolder INBOX Серверы IMAP могут обрабатывать родительские папки по-разному. Это поле позволяет указать родительскую папку для ваших почтовых ящиков. Подробнее см. Главу 7.
imapserver localhost Определяет сервер IMAP, к которому должен подключаться сервер Asterisk.
imapport 143 Определяет порт сервера IMAP для подключения.
imapflags ssl Серверы IMAP обычно имеют разные флаги, которые могут быть переданы вместе с именем почтового ящика. Общий флаг для передачи — ssl, который позволяет использовать OpenSSL для шифрования сообщений, если библиотеки IMAP были скомпилированы с поддержкой OpenSSL.
imapfolder INBOX Папка для хранения сообщений голосовой почты на сервере IMAP. По умолчанию используется INBOX.
authuser user Если ваш сервер IMAP был определен с учетной записью, которая может обращаться ко всем почтовым ящикам, вы можете определить, какой пользователь от Asterisk должен подключиться к серверу.
authpassword password Этот параметр определяет пароль, который будет использоваться с атрибутом authuser.
imapopentimeout 60 Тайм-аут открытия TCP в секундах.
imapclosetimeout 60 Тайм-аут закрытия TCP в секундах.
imapreadtimeout 60 Тайм-аут чтения TCP в секундах.
imapwritetimeout 60 Тайм-аут записи TCP в секундах.

a Сепаратор, который используется для каждого параметра формата, должен быть символом pipe (|).

b Отправка электронной почты от Asterisk может потребовать некоторой тщательной настройки, так как многие спам-фильтры обнаруживают сообщения от Asterisk подозрительными и просто игнорируют их. Мы больше поговорим о том, как настроить электронную почту для Asterisk в Главе 18.

c Да, вы правильно это прочитали: мегабайты.

d Интерфейс аналоговых дисплеев — это стандарт, который позволяет более сложные взаимодействия функций с помощью дисплея телефона и меню. С появлением VoIP-телефонов популярность ADSI снизилась за последние годы.

Внешняя проверка паролей голосовой почты

По умолчанию Asterisk не проверяет пароли пользователей, чтобы убедиться, что они хотя бы несколько безопасны. Любой, кто поддерживает системы голосовой почты, скажет вам, что большой процент пользователей почтовых ящиков устанавливает свои пароли примерно на 1234 или 1111 или какую-то другую строку, которую легко угадать. Это представляет собой огромную дыру в системе голосовой почты.

Поскольку модуль app_voicemail.so не имеет встроенной возможности проверки паролей, настройки externpass, externpassnotify и externpasscheck позволяют проверить их с помощью внешней программы. Asterisk вызовет программу на основе указанного вами пути и передаст ей следующие аргументы:

mailbox context oldpass newpass

Затем скрипт будет оценивать аргументы на основе правил, определенных вами во внешнем скрипте, и, основываясь на ваших правилах, он должен вернуть Asterisk значение VALID при успехе или INVALID при отказе (на самом деле, возвращаемое значение для неудачного пароля может быть любым, кроме слов VALID или FAILURE). Это значение обычно печатается в стандартный вывод — stdout. Если скрипт возвращает INVALID, Asterisk будет воспроизводить уведомление о недействительном пароле, и пользователю нужно будет попробовать другой пароль.

В идеале вы бы хотели реализовать такие правила, как:

  • Пароли должны иметь длину не менее шести цифр
  • Пароли не должны быть строками повторяющихся цифр (например, 111111)
  • Пароли не должны быть строками смежных цифр (например, 123456 или 987654)

Asterisk поставляется с простым скриптом, который значительно улучшит безопасность вашей системы голосовой почты. Он находится в исходном коде в папке: /contrib/scripts/voice/mailpwcheck.py.

Мы настоятельно рекомендуем вам скопировать его в папку /usr/local/bin (или где бы вы хранили такие вещи), а затем раскомментировать параметр externpasscheck= в файле voicemail.conf. Затем ваша система голосовой почты будет применять правила безопасности паролей, которые вы установили.

Часть раздела [general] — это область, называемая расширенными опциями. Эти параметры (перечисленные в Таблице 8-2) определяются так же, как и другие параметры в разделе [general], но они также могут быть определены для каждого почтового ящика для конкретной настройки, чтобы переопределить все, что определено в [general].

Таблица 8-2. Расширенные опции для voicemail.conf

Опция Значение/Пример Примечание
tz eastern,european,etc Задает имя zonemessages, как определено в [zonemessages] (обсуждается в следующем разделе).
locale de_DE.utf8, es_US.utf8, etc Используется для определения того, как Asterisk генерирует строки даты/времени в разных локалях. Чтобы определить локали, действующие в вашей системе Linux, введите locale -a в shell.
attach yes,no Если для почтового ящика указан адрес электронной почты, это определяет, прикреплены ли сообщения к уведомлениям по электронной почте (в противном случае отправляется сообщение с простым оповещением).
attachfmt wav49,wav,etc Если attach включено и сообщения хранятся в разных форматах, это определяет, какой формат отправляется с уведомлением по электронной почте. Часто wav49 является хорошим выбором, поскольку он использует лучший алгоритм сжатия и, следовательно, будет использовать меньшую пропускную способность.
saycid yes,no Эта команда укажет callerID вызывающего абонента, который оставил сообщение.
cidinternalcontexts <context>, <another context> Любые контексты диалплана, перечисленные здесь, будут найдены при попытке найти контекст почтового ящика, чтобы можно было указать имя, связанное с номером почтового ящика. Номер ящика голосовой почты должен соответствовать внутреннему номеру, из которого пришел вызов, а контекст голосовой почты должен соответствовать контексту диалплана.a
sayduration yes,no Команда укажет длину сообщения.
saydurationm 2 Используйте это, чтобы указать минимальную продолжительность сообщения, чтобы соответствовать его длине воспроизведения. Например, если вы установите значение 2, любое сообщение длиной менее 2 минут не будет указано. (Опция действительно является saydurationm и не является опечаткой здесь)
dialout <context> Если разрешено, пользователи могут набирать номер из своих почтовых ящиков. Это считается очень опасной особенностью в телефонной системе (главным образом потому, что многие пользователи голосовой почты любят использовать 1234 в качестве пароля) и поэтому не рекомендуется. Если вы настаиваете на разрешении этого, убедитесь, что у вас есть второй уровень в диалплане, где указан другой пароль. Тем не менее, это небезопасная практика.
sendvoicemail yes,no Позволяет пользователям составлять сообщения другим пользователям из своих почтовых ящиков.
searchcontexts yes,no Позволяет приложениям голосовой почты в диалплане не указывать контекст голосовой почты, так как поиск будет выполняться во всех контекстах. Это не рекомендуется.
callback <context> Указывает какой контекст диалплана использовать для обращения к отправителю сообщения. Указанный контекст должен иметь возможность обрабатывать набор номеров в том формате, в котором они получены (например, код страны не может быть получен с CallerID, но может потребоваться для исходящего вызова).
exitcontext <context> Существуют опции, позволяющие вызывающим абонентам выйти из системы голосовой почты, когда они находятся в процессе оставления сообщения (например, нажав 0, чтобы перейти на оператора). По умолчанию контекст, который вызвал звонящий, будет использоваться в качестве контекста выхода. При желании этот параметр определяет другой контекст для вызывающих абонентов, выходящих из системы голосовой почты.
review yes,no Почти всегда должен быть настроен на yes (хотя по умолчанию равно no). Люди расстраиваются, если ваша система голосовой почты не позволяет им просматривать свои сообщения до их доставки.
operator yes,no Лучшая практика диктует, что вы должны позволить своим абонентам «обнулить» почтовый ящик, если они не захотят оставлять сообщение. Обратите внимание, что в контексте exitcontext требуется расширение o (не «ноль», а буква «о») чтобы обрабатывать эти вызовы.
envelope no,yes Вы можете воспроизводить детали сообщения голосовой почты прежде, чем оно воспроизводется. Поскольку эту информацию можно также получить нажав 5, мы обычно устанавливаем как no.
delete no,yes После отправки сообщения электронной почты (которое может включать само сообщение) оно будет удалено. Этот вариант является рискованным, потому что тот факт, что сообщение отправлено по электронной почте, не является гарантией того, что оно было получено (фильтры спама часто любят удалять сообщения голосовой почты Asterisk). В новой системе оставьте это без изменений, пока не убедитесь, что сообщения не теряются из-за спам-фильтров.
volgain 0.0 Параметр позволяет увеличить объем полученных сообщений. В предыдущих версиях Asterisk это было проблемой, но не в течение последних лет. Мы рекомендуем оставить по умолчанию. Для нормальной работы требуется утилита sox.
nextaftercmd yes,no Эта удобная небольшая настройка позволит вам сэкономить некоторое время, так как она сразу переходит к следующему сообщению, когда вы закончите работу с текущим.
forcename yes,no Этот странный маленький параметр будет проверять, совпадает ли пароль почтового ящика с номером почтового ящика. Если это так, то заставит пользователя изменить пароль голосовой почты и записать своё имя.
forcegreetings yes,no Как и выше, но для приветствий.
hidefromdir no,yes Если хотите, то можете скрыть определенные почтовые ящики из приложения Directory(), используя этот параметр.
tempgreetwarn yes,no Установка этого параметра yes будет предупреждать владельца почтового ящика, что у него есть временное приветствие. Это может быть полезным напоминанием, когда люди возвращаются из поездок или каникул.
passwordlocation spooldir Если хотите, то можете иметь пароли почтового ящика, хранящиеся в папке spool для каждого почтового ящика.b Одним из преимуществ использования опции spooldir является то, что он позволит вам определять операторы #include в файле voicemail.conf (это означает, что можете хранить ссылки на почтовые ящики в нескольких файлах, как в случае, например, с диалплан-кодом). Это невозможно в противном случае, поскольку app_voicemail обычно записывает изменение пароля в файловую систему и не может обновлять пароль почтового ящика, хранящийся за пределами voicemail.conf или /spool. Если вы не используете passwordlocation, то не сможете определять почтовые ящики вне voicemail.conf, так как обновление пароля не произойдет. Хранение паролей в файле в конкретной папке почтового ящика в /spool решает эту проблему.
messagewrap no,yes Если для этого параметра установлено значение yes, то, когда пользователь прослушал последнее сообщение, выбор следующего (6) приведет к первому сообщению. Также, выбор предыдущего (4), находясь в первом сообщении пользователя перейдет к последнему сообщению.
minpassword 6 Этот параметр обеспечивает минимальную длину пароля. Обратите внимание, что он не мешает пользователям устанавливать свои пароли в виде чего-то легкомысленного (например, 123456).
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 Если хотите, то можете указать здесь пользовательский звук, чтобы использовать подсказку «Попробуйте еще раз».
vm-prepend-timeout custom_sound Если хотите, то можете указать здесь пользовательский звук, чтобы использовать его, когда пользователь отключается во время добавления записи сообщения. Подсказка по умолчанию: «затем нажмите решетку» и следуйте подсказке vm-pls-try-again.
listen-control-forward-key # Вы можете использовать этот параметр для настройки клавиши быстрой перемотки вперед.
listen-control-reverse-key * Вы можете использовать этот параметр для настройки клавиши перемотки назад.
listen-control-pause-key 0 Вы можете использовать этот параметр для настройки клавиши паузы/продолжения.
listen-control-restart-key 2 Вы можете использовать этот параметр для настройки клавиши повтора.
listen-control-stop-key 123456789 Вы можете использовать этот параметр для настройки клавиши прерывания воспроизведения.
backupdeleted 0 Этот параметр позволит вам указать, сколько удаленных сообщений автоматически сохраняется системой. Это похоже на корзину. Установка этого параметра на 0 отключает эту функцию. Можно сохранить до 9999 сообщений, после чего самое старое сообщение будет удалено при каждом удалении другого сообщения.

a Да, мы нашли это немного запутанным.

b Типичная папка spool /var/spool/asterisk, и ее можно переопределить в файле /etc/asterisk/asterisk.conf.

Раздел [zonemessages]

Следующий раздел файла voicemail.conf — это раздел [zonemessages]. Цель этого раздела — разрешить обработку сообщений по часовому поясу, чтобы вы могли воспроизводить сообщения пользователей с правильными отметками времени. Вы можете установить имя зоны в нужное вам значение. Следуя имени зоны, вы можете определить, на какой часовой пояс будет ссылаться это название, а также некоторые параметры, определяющие, как воспроизводятся временные метки. Вы можете посмотреть файл ~/src/asterisk-complete/asterisk/11/configs/voicemail.conf.sample для деталей синтаксиса. Asterisk включает примеры, показанные в Таблице 8-3.

Таблица 8-3. Секция опций [zonemessages] для voicemail.conf

Имя зоны Значение/Пример Примечание
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 Это значение подходит для среднеевропейского времени (CEST).

Раздел контекстов

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

Во многих случаях вам понадобится только один контекст голосовой почты, обычно называемый [default]. Его стоит отметить, так как он упростит диалплан: все приложения, связанные с голосовой почтой, принимают контекст default, если другой не задан. Другими словами, если вы не требуете разделения ваших пользователей голосовой почты, используйте default в качестве своего единственного контекста голосовой почты.

Формат почтовых ящиков следующий (вы должны ввести все это в одну строку):

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

Пайп (вертикальная черта) (|) был очень популярен в Asterisk. В течение первых нескольких лет он использовался в качестве стандартного разделителя. Совсем недавно он почти полностью был заменен запятой; однако все еще есть несколько мест, где используется пайп. Один из них находится в файле voicemail.conf: например, в качестве разделителя для любых параметров, специфичных для почтового ящика, а также как символ разделителя в описании format=. Вы увидите это в нашем следующем примере, а также в файле voicemail.conf.sample.

Части для определения почтового ящика:

mailbox

Это номер почтового ящика. Обычно соответствует добавочному номеру.

password

Это числовой пароль, который владелец почтового ящика будет использовать для доступа к голосовой почте. Если пользователь изменит свой пароль, система обновит это поле в файле voicemail.conf.

Если паролю предшествует символ дефиса (-), пользователь не может изменить пароль своего почтового ящика.

Если вы храните пароли в spool (используя параметр passwordlocation) то это поле игнорируется. Тем не менее, анализатор синтаксиса по-прежнему требует чтобы здесь было поле, поэтому, если вы укажете какие-либо другие параметры для этого почтового ящика, запятая будет необходима в качестве заполнителя для поля пароля.

FirstName LastName

Это имя владельца почтового ящика. В каталоге компании используется текст в этом поле, позволяющий вызывающим пользователям задавать имена пользователей.

email address

Это адрес электронной почты владельца почтового ящика. Asterisk может отправлять уведомления голосовой почты (включая само сообщение голосовой почты в виде вложения) на указанный почтовый ящик.

pager address

Это адрес электронной почты пейджера или мобильного телефона владельца почтового ящика. Asterisk может отправить короткое сообщение с уведомлением о голосовой почте на указанный адрес электронной почты.

options

Это поле представляет собой список параметров для настройки часового пояса владельца почтового ящика и переопределения глобальных настроек голосовой почты. Существует немало действительных вариантов:

tz, locale, attach, attachfmt, saycid, cidinternalcontexts, sayduration, say durationm, dialout, sendvoicemail, searchcontexts, callback, exitcontext, review, operator, envelope, delete, volgain, nextaftercmd, forcename, force greeting, hidefromdir, tempgreetwarn, passwordlocation, messagewrap, min password.

Эти параметры должны быть в парах option = value, разделенных символом pipe (|). См. Таблицу 8-4 для получения более подробной информации о том, что делает каждый из этих параметров.

Опция tz устанавливает часовой пояс пользователя в ранее определенный в разделе [zonemessages] в файле voicemail.conf. Другие параметры переопределяют глобальные настройки голосовой почты с одинаковыми именами.

Таблица 8-4. Опции почтового ящика

Опция Описание
attach Прилагать ли голосовую почту к уведомлению по электронной почте. Если установлено yes, она будет прикреплена к письму, заданному в поле адреса электронной почты.
attachfmt Устанавливает формат для прикрепления к письму. Обычно это первое значение, определяемое параметром формата, но вы можете переопределить это для каждого почтового ящика с помощью этой опции. Опция может быть установлена только для каждого почтового ящика.
callback Если этот параметр определен, то он позволит получателю электронной почты перезвонить отправителю голосовой почты непосредственно из приложения Voicemail(). Этот параметр определяет, из какого контекста будет отправлен вызов. Если не установлено, вызов отправителя не будет разрешен.
cidinternalcontexts Это очень старый вариант с 2004 года, но по существу вы можете определить несколько контекстов (разделенных запятой), которые передадут Asterisk что надо проверить, пришел ли вызов из внутреннего контекста. Если это так, он будет воспроизводить запись имени человека вместо того, чтобы указывать свой добавочный номер. Неясно, остается ли этот вариант действительным или функциональным. Вероятно, лучше всего использовать в разделе голосовой почты [general], а не в почтовом ящике.
delete После отправки голосовой почты по электронной почте она удаляется с сервера. Эта опция полезна для пользователей, которые хотят получать голосовую почту только по электронной почте. Допустимые параметры: yes или no. Опция может быть установлена только для каждого почтового ящика.
dialout Если определено, опция 4 из расширенного меню позволит вам набрать номер из приложения VoicemailMain(). Аргумент определяет, из какого контекста будет выполняться вызов. Если этот параметр не определен, для вызова не будет запрашиваться опция набора номера.
envelope Включение или выключение воспроизведения конверта перед воспроизведением сообщения голосовой почты. Допустимые параметры: yes или no. По умолчанию yes.
exitcontext Контекст для выхода из приложения Voicemail() при нажатии * или 0 . Работает так же как с опцией operator. Должен иметь расширение a в контексте с *. Должен иметь расширение o в контексте с 0.
forcegreeting Заставляет записывать приветствие для новых почтовых ящиков. Новый почтовый ящик определяется номером почтового ящика и паролем. Допустимые значения: yes или no. По умолчанию no.
forcename Заставляет записывать имя пользователя для новых почтовых ящиков. Новый почтовый ящик определяется номером почтового ящика и паролем. Допустимые значения: yes или no. По умолчанию no.
hidefromdir Если установлено yes, этот почтовый ящик будет скрыт от приложения Directory(). По умолчанию no.
locale Позволяет установить языковой стандарт для почтового ящика, чтобы управлять форматированием строк даты/времени. Дополнительную информацию см. в voicemail.sample.conf.
messagewrap Позволяет разворачивать первое и последнее сообщения; например, разрешить с последнего сообщения переходить к первому при выборе следующего или первому сообщению к последнему при переходе к предыдущему. Допустимые параметры: yes или no. По умолчанию no.
minpassword Устанавливает минимальную длину пароля. Аргумент должен быть целым числом.
nextaftercmd Переход к следующему сообщению после нажатия клавиши 7 (удаление) или 9 (сохранение). Допустимые значения: yes или no. По умолчанию yes.
operator Позволит отправителю голосовой почты нажать 0 до, во время или после записи голосовой почты. Выйдет на расширение o в том же контексте или в контексте, определяемом параметром exitcontext. Допустимые параметры: yes или no. По умолчанию no.
passwordlocation По умолчанию пароль для голосовой почты сохраняется в файле voicemail.conf и изменяется при помощи Asterisk при каждом изменении пароля. Это может быть нежелательно, особенно если вы хотите проанализировать пароль из внешней локации (или скрипта). Альтернативным вариантом для определения пароля является spooldir, который поместит пароль для пользователя голосовой почты в файл secret.conf в каталоге голосовой почты пользователя. Допустимыми параметрами являются voicemail.conf и spooldir. Опция по умолчанию voicemail.conf.
review Когда включено, разрешит пользователю записывать сообщение голосовой почты для повторной записи своего сообщения. После нажатия клавиши # чтобы сохранить голосовую почту им будет предложено переписать или сохранить сообщение. Допустимые параметры: yes или no. По умолчанию no.
saycid Если включено и в каталоге /var/spool/asterisk/voicemail/recordings/callerids существует приглашение, этот файл будет воспроизводиться до сообщения, воспроизводя файл вместо того, чтобы указывать номер вызывающего абонента. Допустимые параметры: yes или no. По умолчанию no.
sayduration Определяет, следует ли воспроизводить длительность сообщения до его воспроизведения. Допустимые параметры: yes или no. По умолчанию yes.
saydurationm Позволяет установить минимальную продолжительность воспроизведения (в минутах). Например, если вы установите значение 2, то не будете информированы о длине сообщения для сообщений длиной менее 2 минут. Допустимые значения — целые числа. Значение по умолчанию — 2.
searchcontexts Для таких приложений, как Voicemail(), VoicemailMain() и Directory() контекст голосовой почты является необязательным аргументом. Если контекст голосовой почты не указан, то используется поиск контекста default. Если этот параметр включен, будут просмотрены все контексты. Это связано с той оговоркой, что если включено, номер почтового ящика должен быть уникальным во всех контекстах, иначе будет коллизия, и система не поймет, какой почтовый ящик использовать. Допустимыми параметрами являются yes и no. По умолчанию no.
sendvoicemail Позволяет пользователю составлять и отправлять сообщение голосовой почты из приложения VoicemailMain(). Доступно в качестве опции 5 в расширенном меню. Если этот параметр отключен, опция 5 в расширенном меню не будет запрашиваться. Допустимые параметры: yes или no. По умолчанию no.
tempgreetwarn Включает уведомление пользователя, когда включено их временное приветствие. Допустимые параметры: yes или no. По умолчанию no.
tz Устанавливает часовой пояс для пользователя голосовой почты (или глобально). См. /⁠usr/share/timezone для разных доступных часовых поясов. Не применимо, если emvelop=no.
volgain Опция volgain позволяет вам установить усиление громкости для сообщений голосовой почты. Значение устанавливается в децибелах (дБ). Для этого нужно установить приложение sox.

Почтовые ящики, которые вы определяете в файле voicemail.conf, могут выглядеть следующим образом:

[default]

100 => 5542,Mike Loukides,[email protected]

101 => 67674,Tim OReilly,[email protected]

102 => 36217,Mary JonesSmith,[email protected]

; *** Нужно, чтобы всё было на одной линии

103 => 5426,Some Guy,,,dialout=fromvm|callback=fromvm|review=yes|operator=yes|envelope=yes

[shifteight]

100 => 0107,Leif Madsen,[email protected]

101 => 0523,Jim VanMeggelen,[email protected],,attach=no|maxmsg=100

102 => 11042,Tilghman Lesher,,,attach=no|tz=central

Каталог Asterisk не может справиться с концепцией фамилии, которое является чем-то другим, кроме простого слова. Это означает, что фамилии, такие как О’Рейли, Джонс-Смит и да, даже Ван Меггелен, перед добавлением в голосовую почту должны быть удалены любые знаки препинания и пробелы перед добавлением в voicemail.conf.

Контексты в voicemail.conf — отличная и мощная концепция, но вы, скорее всего, обнаружите, что контекст default будет всем, что вам нужно при нормальном использовании. Основная причина для нескольких контекстов почтовых ящиков может заключаться в том, что ваша система имеет более одной АТС, и вам необходимо разделить почтовые ящики.

Исходный файл voicemail.conf

Мы рекомендуем следующий образец в качестве отправной точки. Вы можете обратиться к ~/asterisk-complete/asterisk/11/configs/voicemail.conf.sample для получения подробной информации о различных настройках:

; 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 ; Разрешить пользователю составлять и отправлять

; голосовую почту, находясь внутри

[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]

Настройка сервера Linux для обработки отправки электронной почты — это задача администрирования Linux, выходящая за рамки этой книги. Вам нужно будет протестировать вашу службу голосовой почты, чтобы убедиться в том, что электронное письмо обрабатывается надлежащим образом агентом передачи почты (MTA)3 и что спам-фильтры входящей почты не отклоняют сообщения (одна из причин, по которым это может произойти, — это сервер Asterisk использует имя хоста в теле письма, которое на самом деле не разрешается).

Стандартные клавиши голосовой почты

Здесь мы рассмотрим стандартную конфигурацию клавиатуры для Comedian Mail. Некоторые параметры могут быть включены или отключены на основе конфигурации voicemail.conf (например, envelope=no), но наш обзор на Рисунке 8-1 покажет стандартные параметры, доступные с минимальной конфигурацией.

Интеграция диалплана

Существует два основных приложения диалплана, которые предоставляются модулем app_voicemail.so в Asterisk. Первый, названный просто VoiceMail(), делает именно то, что вы ожидаете от него, а именно — запись сообщения в почтовый ящик. Второй, VoiceMailMain(), позволяет вызывающему абоненту входить в почтовый ящик для извлечения сообщений.

Приложение диалплана VoiceMail()

Если вы хотите передать вызов голосовой почте, вам необходимо указать два аргумента: почтовый ящик (или почтовые ящики), на который должно быть отправлено сообщение, и любые параметры, относящиеся к нему, например, приветствие для воспроизведения или отметить сообщение как срочнное. Структура команды VoiceMail() следующая:

VoiceMail(mailbox[@context][&mailbox[@context][&…]][,options])

Параметры, которые вы можете передать в VoiceMail() для обеспечения более высокого уровня контроля, приведены в Таблице 8-5.

VoiceMailMain() —> Аутентификация —> Уведомление: Количество старых и новых сообщений

Рисунок 8-1. Конфигурация ключей для Комейдиной почты

Таблица 8-5. Дополнительные аргументы VoiceMail()

Аргумент Назначение
b Предписывает Asterisk воспроизводить приветствие «занято» для почтового ящика (если приветствие «занято» отсутствует, будет воспроизводиться приветствие «недоступно»).
d() Принимает цифры, подлежащие обработке в контексте c. Если контекст не указан, по умолчанию будет использоваться текущий контекст.
g(#) Применяет заданную величину усиления (в децибелах) к записи. Работает только на каналах DAHDI.
s Подавляет воспроизведение инструкций вызывающим абонентам после воспроизведения приветствия.
u Поручает Asterisk воспроизводить уведомление о недоступном почтовом ящике (это поведение по умолчанию).
U Указывает, что это сообщение должно быть отмечено как срочное. Наиболее заметным эффектом этого является то, что голосовая почта хранится на сервере IMAP. В этом случае электронное письмо будет отмечено как срочное. Когда владелец почтового ящика звонит в систему голосовой почты Asterisk, ему также следует сообщить, что сообщение является срочным.
P Указывает, что это сообщение должно быть помечено как приоритетное

Приложение VoiceMail() отправляет вызывающего абонента в указанный почтовый ящик, чтобы он мог оставить сообщение. Почтовый ящик должен быть указан как mailbox@context, где context — это имя контекста голосовой почты. Буквы опций b или u могут быть добавлены для запроса типа приветствия. Если используется буква b, вызывающий абонент услышит сообщение о занятости владельца почтового ящика. Если используется буква u, вызывающий абонент будет слышать сообщение о недоступности владельца почтового ящика (если такое существует).

Рассмотрим простой пример добавочного номера 101, который позволяет людям вызывать Джона:

exten => 101,1,NoOp()

same => n,Dial(${JOHN})

Давайте добавим сообщение о недоступности, которое будет воспроизводиться вызывающим абонентам, если Джон не ответит на звонок. Помните, что второй аргумент приложения Dial() — это тайм-аут. Если вызов не отвечен до истечения времени ожидания, он отправляется на следующий приоритет. Давайте добавим 10-секундный тайм-аут и приоритет для отправки вызывающего абонента на голосовую почту, если Джон не ответит вовремя:

exten => 101,1,NoOp()

same => n,Dial(${JOHN},10)

same => n,VoiceMail(101@default,u)

Теперь давайте изменим его так, что если Джон занят (по другому вызову), вызывающий будет отправлен на его голосовую почту, где он услышит сообщение о занятости Джона. Для этого мы будем использовать переменную ${DIALSTATUS}, которая содержит одно из нескольких значений состояния (введите core show application Dial в консоли Asterisk для перечисления всех возможных значений):

exten => 101,1,NoOp()

same => n,Dial(${JOHN},10)

same => n,GotoIf($[«${DIALSTATUS}» = «BUSY»]?busy:unavail)

same => n(unavail),VoiceMail(101@default,u)

same => n,Hangup()

same => n(busy),VoiceMail(101@default,b)

same => n,Hangup()

Теперь звонящие получат ответ голосовой почты Джона (с соответствующим приветствием), если Джон занят либо недоступен. Альтернативный синтаксис заключается в использовании функции IF() для определения того, какое из сообщений (недоступен или занят) использовать:

exten => 101,1,NoOp()

same => n,Dial(${JOHN},10)

same => n,Voicemail(101@default,${IF($[«${DIALSTATUS}» = «BUSY»]?b:u)})

same => n,Hangup()

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

Приложение диалплана VoiceMailMain()

Пользователи могут получать сообщения голосовой почты, изменять свои параметры и записывать приветствия голосовой почты с помощью приложения VoiceMailMain(). VoiceMailMain() принимает два аргумента: номер почтового ящика (и, возможно, контекст) для доступа и некоторые параметры. Оба аргумента являются необязательными.

Структура приложения VoiceMailMain() выглядит следующим образом:

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

Если вы не передадите какие-либо аргументы в VoiceMailMain(), он будет воспроизводить приглашение, предлагая вызывающему абоненту указать номер своего почтового ящика. Параметры, которые могут быть подставлены, перечислены в Таблице 8-6.

Таблица 8-6. Необязательные аргументы VoiceMailMain()

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

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

[Services]

exten => *98,1,NoOp(Access voicemail retrieval.)

same => n,VoiceMailMain()

Тогда вам просто нужно добавить include в контекст [LocalSets], чтобы вы могли набрать *98:

[LocalSets]

; существующий диалплан выше

include => Services

Создание каталога Набор-по-Имени

Последней особенностью системы голосовой почты Asterisk, которую мы должны рассмотреть, является каталог набора-по-имени. Он создается приложением Directory(). Это приложение использует имена, определенные для почтовых ящиков в voicemail.conf, чтобы предоставить вызывающему абоненту каталог для набора пользователей по имени.

Directory() принимает до трех аргументов: контекст голосовой почты, из которого можно читать имена; необязательный контекст диалплана, в котором набирать пользователя, и строку параметров (которая также является необязательной). По умолчанию Directory() ищет пользователя по фамилии, но передача параметра f заставляет вместо этого искать по имени. Давайте добавим два набора по названию каталогов во входящий контекст нашего образца диалплана, чтобы вызывающие могли выполнять поиск по имени или фамилии:

exten => 8,1,Directory(default,incoming,f)

exten => 9,1,Directory(default,incoming)

Если вызывающие абоненты нажимают 8, они получат каталог по имени. Если они набирают 9, они получат каталог по фамилии.

Использование Jitterbuffer’а

При использовании Asterisk в качестве сервера голосовой почты4, вы можете добавить jitterbuffer между голосовой почтой и вызывающим абонентом. Цель jitterbuffer’а заключается в том, чтобы помочь справиться с ситуацией, когда вызов проходит через IP-сеть, трафик может не прибывать с идеальным временем и в идеальном порядке. Если пакеты иногда прибывают с небольшой задержкой (jitter — дрожанием) или не по порядку, джиттер-буфер может исправить это, чтобы система голосовой почты получала голосовой поток вовремя и по порядку. Если джиттер-буффер обнаруживает, что пакет был потерян (или может появиться так поздно, что он больше не будет иметь значения), он может выполнять скрытие потери пакетов. То есть, он попытается создать аудиокадр, чтобы поставить на место потерянного, чтобы было сложнее услышать потерю звука.

В Asterisk поддержка jitterbuffer может быть включена на мосту между двумя каналами двумя способами. В случае голосовой почты обычно имеется только один канал, подключенный к одному из приложений голосовой почты. Старый метод (который требуется в версиях Asterisk до 10) заключается в том, чтобы включить использование jitterbuffer перед голосовой почтой, создав мост между двумя каналами с использованием канала Local и указав опцию j.

Указание опции n для канала Local дополнительно гарантирует, что канал Local не оптимизирован на пути вызова в Asterisk:

[Services]

; старый метод — требуется только в версиях Астериска до 10

exten => *98,1,Dial(Local/vmm@Services/nj)

exten => vmm,1,VoiceMailMain()

Начиная с Asterisk 10, существует новая функция диалплана JITTERBUFFER(), которая с точки зрения пользователя выполняет те же функции. Просто установив значения в диалоговом окне, мы можем включить jitterbuffer перед доступом к приложению диалплана, например Voicemail():

[Services]

; новый метод — поддерживается в Астериске 10 и позднее

exten => *98,1,NoOp()

same => n,Set(JITTERBUFFER(fixed)=default)

same => n,VoiceMailMain()

Существует как фиксированный, так и адаптивный джиттер-буфер, а также несколько различных настроек. Мы использовали фиксированный jitterbuffer с настройками по умолчанию, которые следующие. См. core show function JITTERBUFFER для получения дополнительных параметров конфигурации:

  • Длина буфера 200 мс
  • Если существует разница в метках времени более 1000 мс, то джиттер-буфер будет повторно синхронизирован

Внутреннее хранение

Хранение сообщений в традиционных системах голосовой почты всегда было чрезмерно сложным5. Аsterisk, с другой стороны, не только предоставляет вам простой, логичный механизм хранения на основе файловой системы, но также предлагает несколько дополнительных параметров хранения сообщений.

Файловая система Linux

По умолчанию Asterisk хранит голосовые сообщения в папке spool, в /var/spool/asterisk/voicemail/<context>/<mailbox>. Сообщения могут храниться в нескольких форматах (например, WAV и GSM), в зависимости от того, что вы указали в качестве формата в разделе [general] вашего файла voicemail.conf. Ваши приветствия также хранятся в этой папке.

Asterisk не будет создавать папку для любых почтовых ящиков, у которых пока нет записей (как в случае с новым почтовым ящиком), поэтому эта папка не может использоваться как надежный метод определения, какие почтовые ящики существуют в системе.

Вот пример того, что может быть в папке почтового ящика. Этот почтовый ящик не имеет новых сообщений в INBOX, имеет два сохраненных сообщения в папке Old и имеет записи (прветствия) по занятости (busy), недоступности (unavail) и имени (greet) (как показано на рисунке 8-2).

Рисунок 8-2. Образец папки почтового ящика

Для каждого сообщения есть соответствующий файл msg####.txt, который содержит информацию о конверте для сообщения. Файл msg####.txt также имеет критически важное значение для индикации ожидающего сообщения (MWI), так как это файл, который Asterisk ищет в INBOX, чтобы определить, должен ли индикатор сообщения для пользователя быть включен или нет.

ODBC

В централизованной или распределенной системе вам может потребоваться хранить сообщения как двоичные объекты в базе данных, а не как файлы в файловой системе. Мы подробно обсудим это в «Хранение сообщений голосовой почты ODBC» в Главе 16.

IMAP

Многие люди предпочитают управлять своей голосовой почтой в рамках своей электронной почты. Это называется унифицированным обменом сообщениями в телекоммуникационной отрасли, и его реализация традиционно является дорогостоящей и сложной. Asterisk позволяет довольно просто интегрировать голосовую и электронную почту либо через встроенный обработчик голосовой почты, либо через связь с сервером IMAP. Мы подробно обсудим интеграцию IMAP в разделе «Интеграция IMAP голосовой почты».

Использование Asterisk в качестве автономного сервера голосовой почты

В традиционной телекоммуникационной среде сервер голосовой почты обычно представляет собой автономную единицу (представляющую либо отдельный сервер в целом, либо дополнительную карту системы). Очень немногие УАТС имели полностью интегрированную голосовую почту (в том смысле, что голосовая почта была неотъемлемой частью УАТС, а не периферийного устройства).

Asterisk вполне может выступать в качестве автономной системы голосовой почты. Двумя наиболее распространенными аргументами, которые могут потребоваться, являются:

  1. Если вы создаете большую централизованную систему и имеете несколько серверов, каждый из которых предоставляет определенную функцию (прокси-сервер, медиа-шлюз, голосовую почту, конференц-связь и т.д.)
  2. Если вы хотите заменить систему голосовой почты на традиционной АТС голосовой почтой Asterisk

Asterisk может выступать в любой из этих ролей.

Интеграция Asterisk в среду SIP как автономный сервер голосовой почты

Если вы хотите, чтобы Asterisk выступал в роли выделенного сервера голосовой почты (т.е. без каких-либо аппаратов, зарегистрированных на нем, и никаких других типов вызовов, проходящих через него), процесс с точки зрения диалплана довольно прост. Однако получение сообщения, ожидающего обработки, может быть немного сложнее.

Начнем с быстрой диаграммы. На Рисунке 8-3 показан слишком упрощенный пример типичной корпоративной среды SIP. У нас даже нет сервера Asterisk (кроме голосовой почты), чтобы дать вам общее представление о том, как Asterisk может выступать в качестве автономного сервера голосовой почты в среде, отличной от Asterisk.

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

В Интернете есть несколько решений, которые рекомендуют использовать опцию externnotify в voicemail.conf, вызывая внешний скрипт, когда сообщение остается в почтовом ящике (или удаляется). Хоть мы не можем сказать, что это плохой подход, мы находим его немного глупым, и это требует от администратора понимания того, как писать внешний скрипт или программу для обработки фактического прохождения сообщения.

Рисунок 8-3. Упрощенная корпоративная среда SIP

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

Сервер голосовой почты по-прежнему должен знать о конечных точках SIP, даже если устройства не зарегистрированы непосредственно на нем. Это можно сделать либо с помощью файла sip.conf, который идентифицирует каждую конечную точку SIP, либо через статическую базу данных реального времени, которая делает то же самое. Если вы используете sip.conf или Asterisk Realtime Architecture (ARA), для каждой конечной точки потребуется запись, подобная этой:

[messagewaiting](!) ; шаблон для обработки параметров, общий

; для всех почтовых ящиков

type=peer

subscribecontext=voicemailbox ; контекст диалплана на сервере голосовой почты

context=voicemailbox ; контекст диалплана на сервере голосовой почты

host=192.168.1.1 ; ip-адрес сервера присутствия

[0000FFFF0001](messagewaiting) ; это должно соответствовать имени абонента на прокси-сервере

mailbox=0000FFFF0001@DIR1 ; должен быть в формате почтовый_ящик@контекст_почт_ящика

defaultuser=0000FFFF0001 ; это должно соответствовать имени абонента на прокси-сервере

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

Вы не захотите реализовать это, если у вас нет прототипа базовой операции решения. Хотя мы все согласны с тем, что протокол SIP является протоколом, не все согласны с правильным способом реализации протокола. В результате существует множество проблем взаимодействия, которые нуждаются в этом решении. Мы предоставили базовое введение в эту концепцию в этой книге, но детали реализации будут зависеть от других факторов, внешних по отношению к Asterisk, таких, как возможности прокси.

Тот факт, что ни одно устройство не должно регистрироваться в Asterisk, значительно снизит нагрузку на сервер Asterisk, и, в результате этот проект должен позволить серверу голосовой почты поддерживать несколько тысяч подписчиков.

Требования к диалплану

Диалоговое окно сервера голосовой почты может быть довольно простым. Должны быть удовлетворены две потребности:

  1. Получать входящие звонки и направлять их в соответствующий почтовый ящик
  2. Обрабатывать входящие вызовы от пользователей, желающих проверить их сообщения

Система, которая передает вызовы серверу голосовой почты, должна устанавливать некоторые заголовки SIP для передачи дополнительной информации на сервер голосовой почты. Как правило, эта информация будет включать почтовый ящик/имя пользователя, которое имеет отношение к вызову. В нашем примере мы собираемся установить заголовки X-Voicemail-Mailbox и X-⁠Voicemail-Context, которые будут содержать информацию, которую мы хотим передать серверу голосовой почты.6

Если исходная система также является системой Asterisk, вы можете установить заголовки, используя приложение голосовой почты SIPAddHeader(), аналогично этому:

exten => sendtovoicemail,1,Verbose(2,Set SIP headers for voicemail)

same => n,SIPAddHeader(X-Voicemail-Mailbox: mailbox number)

same => n,SIPAddHeader(X-Voicemail-Context: voicemailbox)

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

Серверу голосовой почты потребуется файл extensions.conf, содержащий следующее:

[voicemailbox]

; прямые входящие вызовы в почтовый ящик

exten => Deliver,1,NoOp()

same => n,Set(Mailbox=${SIP_HEADER(X-Voicemail-Mailbox)})

same => n,Set(MailboxContext=${SIP_HEADER(X-Voicemail-Context)})

same => n,VoiceMail(${Mailbox}@${MailboxContext})

same => n,Hangup()

; подключить пользователей к своему почтовому ящику, чтобы они

; могли получать сообщения

exten => Retrieve,1,NoOp()

same => n,Set(Mailbox=${SIP_HEADER(X-Voicemail-Mailbox)})

same => n,Set(MailboxContext=${SIP_HEADER(X-Voicemail-Context)})

same => n,VoiceMailMain(${Mailbox}@${MailboxContext})

same => n,Hangup()

Требования к sip.conf

В файле sip.conf на сервере голосовой почты требуются не только записи, необходимые для всех почтовых ящиков для уведомления об ожидающем сообщении, но и для определения соединения между сервером голосовой почты и остальной средой SIP:

[VOICEMAILTRUNK]

type=peer

defaultuser=voicemail

fromuser=voicemail

secret=s0m3th1ngs3cur3

canreinvite=no

host=<адрес прокси/сервера регистрации>

disallow=all

allow=ulaw

dtmfmode=rfc2833

context=voicemailbox

Другой конец соединения (возможно, ваш прокси-сервер) должен быть настроен для передачи голосовых сообщений на сервер голосовой почты.

Запуск Asterisk в качестве автономного сервера голосовой почты требует определенных знаний о кластеризации и интеграции, но вы не можете победить стоимость.

SMDI (Simplified Message Desk Interface)

Протокол Simplified Message Desk Interface (SMDI) предназначен для обмена информацией базовыми сообщениями между телефонными системами и системами голосовой почты.

Asterisk поддерживает SMDI, но, учитывая, что это старый протокол, который проходит через последовательное соединение, вероятно, будут проблемы с интеграцией. Поддержка в различных УАТС и других устройств может быть неполной. Тем не менее, это довольно простой протокол, поэтому, конечно его стоит попробовать, если вы планируете использовать Asterisk в качестве замены голосовой почты на старой УАТС.

Ниже приведено не подробное объяснение того, как настроить SMDI для Asterisk, а скорее введение в концепции, с некоторыми базовыми примерами. Если вы планируете внедрять SMDI, вам нужно будет написать сложную логику диалплана и хорошо понять, как подключать системы через последовательные соединения.7

SMDI включен в Asterisk с использованием двух опций в разделе [general] файла voicemail.conf:

smdienable=yes

smdiport=/dev/ttyS0 ; или любой другой последовательный порт, к

; которому вы подключаете свой SMDI-сервис

Кроме того, вам понадобится файл smdi.conf в папке /etc/asterisk чтобы определить детали конфигурации SMDI. Он должен выглядеть примерно так (см. файл smdi.conf.sample для получения дополнительной информации о доступных параметрах):

[interfaces]

charsize=7

paritybit=even

baudrate=1200 ; надеюсь, поддерживается более высокий битрейт

smdiport=/dev/ttyS0 ; или любой другой последовательный порт, который вы

; будете использовать для обработки сообщений SMDI

; на Asterisk

[mailboxes] ; сопоставить входящие строки цифр (обычно номера

; DID) с верным почтовый_ящик@контекст в

; voicemail.conf

smdiport=/dev/ttyS0 ; сначала объявите, какой порт SMDI будут

; использовать следующие почтовые ящики

4169671111=1234@default

4165551212=9999@default

В диалплане есть две функции, которые будут нужны для конфигурации SMDI. Функция SMDI_MSG_RETRIEVE() вытаскивает соответствующее сообщение из очереди сообщений SMDI. Вам необходимо передать функции ключ поиска (обычно DID, на который ссылается в сообщении), и он вернет идентификационный номер, на который может ссылаться функция SMDI_MSG():

SMDI_MSG_RETRIEVE(<smdi port>,<search key>[,timeout[,options]])

После того, как у вас есть идентификатор сообщения SMDI, вы можете использовать функцию SMDI_MSG() для доступа к различным сведениям о сообщении, таким как station, callerID, и type (тип сообщения SMDI):

SMDI_MSG(<message_id>,<component>)

В вашем диалплане вам нужно будет обрабатывать поиск входящих сообщений SMDI, чтобы обеспечить правильную обработку вызовов. Например, если входящий вызов предназначен для доставки в почтовый ящик, тип сообщения может быть одним из B (для занято) или N (для неотвеченных вызовов). Если, с другой стороны, вызов предназначен для перехода на VoiceMailMain(), поскольку вызывающий абонент хочет получить свои сообщения, тип сообщения SMDI будет D, и это нужно будет обрабатывать.

Интеграция базы данных

Приложение голосовой почты Asterisk может быть интегрировано в базу данных. Это может быть очень полезно, особенно в кластерных и распределенных системах. Это подробно обсуждается в Главе 16.

Вывод

В то время как система голосовой почты Asterisk довольно старая с точки зрения кода Asterisk, тем не менее она представляет из себя мощное приложение, которое может (и делает) успешно конкурировать с дорогостоящими, запатентованными системами голосовой почты.

1Это название — больше игра слов, частично вдохновлено системой голосовой почты Nortel Meridian Mail.

2Нет, вам действительно не нужно платить за это — и да, это действительно работает.

3Также иногда называется агентом передачи сообщений.

4Этот совет относится к любой ситуации, когда Asterisk является конечной точкой вызова. Другим примером может быть использование приложений MeetMe() или ConfBridge() для конференц-связи.

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

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

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

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.