Будучи главным инженером по Asterisk в компании столкнулся с задачей по настройке e-mail оповещений в случае пропущенных звонков и т. д. В связи с чем написал инструкцию, которую представляю ниже.

1. Задача:


1.1. Обеспечить возможность отправки Email оповещения о пропущенных звонках на Астериске с помощью sendmail relay через учетную запись gmail.com.

2. Исходная система:


2.1. Установленна система Ubuntu 12.04 LTS Server;

2.2. Имеется логин и пароль от учетной записи root;

2.3. Установлен астериск.

3. Этапы решения:


3.1. Установка OpenSSL:

#apt-get install openssl

3.2. Установка Sendmail:

#apt-get install sendmail

3.3. Создание сертификата с помощью OpenSSL:

3.3.1. Создаем директорию под сертификаты:

#mkdir /etc/mail/certs

3.3.2. Ограничиваем права на чтение, запись и исполнение суперпользователем.

#chmod 700 /etc/mail/certs

3.3.3. Переходим в нашу директорию

#cd /etc/mail/certs

3.3.4. Начинаем генерировать сертификат

#openssl dsaparam 1024 -out dsa1024 -out dsa1024.pem
#openssl req -x509 -nodes -days 3650 -newkey dsa:dsa1024.pem -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem
#openssl req -x509 -new -days 3650 -key /etc/mail/certs/mykey.pem -out /etc/mail/certs/mycert.pem

3.3.5. создаем линк

#ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem

3.3.6. меняем права

#chmod 600 /etc/mail/certs/*

3.4. Подготовка конфигов для компиляции конечной конфигурации для Sendmail пакета:

3.4.1. Создаем папку

#mkdir /etc/mail/auth

3.4.2. Создаем файл и редактируем его

#nano /etc/mail/auth/authinfo

3.4.3. Вбиваем в файл следующую информацию:

AuthInfo:smtp.gmail.com:587 «U:root» «I:USERNAME@gmail.com» «P:PASSWORD» «M:PLAIN»
AuthInfo: «U:root» «I:USERNAME@gmail.com» «P:PASSWORD» «M:PLAIN»


Где USERNAME@gmail.com – учетная запись на gmail.com
PASSWORD – пароль от учетной записи от gmail.com

3.4.4. Конвертируем данный файл:

makemap hash -r /etc/mail/auth/authinfo < /etc/mail/auth/authinfo

3.4.5. Добавляем в /etc/mail/sendmail.mc нужную конфигурацию. (Важно: сделать это до первого FEATURE)

#nano /etc/mail/sendmail.mc

dnl # Smrp relay
define(`CERT_DIR', `MAIL_SETTINGS_DIR`'certs')
define(`confCACERT_PATH', `CERT_DIR')
define(`confCACERT', `CERT_DIR/CAcert.pem')
define(`confSERVER_CERT', `CERT_DIR/mycert.pem')
define(`confSERVER_KEY', `CERT_DIR/mykey.pem')
define(`confCLIENT_CERT', `CERT_DIR/mycert.pem')
define(`confCLIENT_KEY', `CERT_DIR/mykey.pem')
dnl #
dnl # gmail auth
define(`SMART_HOST',`[smtp.gmail.com]')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
define(`confAUTH_OPTIONS', `A p')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
FEATURE(`authinfo',`hash -o /etc/mail/auth/authinfo.db')dnl

3.4.6. Компилируем конфигурацию:

make -C /etc/mail

3.5. Создание скрипта на шеле который будет отправлять сообщения о звонках (пропущенных, принятых и т д);

3.5.1. Создание шелл скрипта

#nano /var/lib/asterisk/agi-bin/power3.ru

3.5.2. Вбиваем в данный файл:

#!/bin/sh
#данный скрипт используется для отправки оповещении о событиях связанные со звонком
#$1  первая переменная принимаемая данным скриптом есть адресс электронной почты куда надо отправить сообщение
#$2  номер телефона звонящего
#$3  имя звонящего
#$4  статус звонка
#$5  статус голосового сообщения
#$6  куда звонили

if [ $# != 6 ]
then exit 1
fi

#Store command line args in nice variables
EMAIL=$1
CALLERIDNUM=$2
CALLERIDNAME=$3
DIALSTATUS=$4
VMSTATUS=$5
EXTEN=$6

DEBUG=0         #Set to 0 for standard operation.  1 will log inputs and mail commands for debugging.
LOGFILE="/var/log/asterisk/IncomingCalls.log"

SENDMAIL=1      #Set to 1 if you want it to email the alert.  0 is useful for debugging.
EMAILCMD="/usr/sbin/sendmail -t"
FROMEMAIL="your_sending@email.net"
SUBJECT="[PBX] Incoming call for extension ${EXTEN}"

#log mail command
if [ ${DEBUG} -eq 1 ]; then
        echo $1 $2 \"$3\" $4 $5 $6 >> ${LOGFILE}
fi

#Check we have an email address if not quit
if [ "${EMAIL}" = "" ]; then
        exit 0
fi

if [ ${DIALSTATUS} = "CANCEL" ]; then
        BODY="${CALLERIDNAME} (${CALLERIDNUM}) hung up."
elif [ ${DIALSTATUS} = "ANSWER" ]; then
        BODY="${CALLERIDNAME} (${CALLERIDNUM}) was answered by ${EXTEN}."
else
        BODY="[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up."
        #check for hangup in vm menu.  ex call went to vm and user hung up
        if [ ${VMSTATUS} = "USEREXIT" ]; then
                BODY="[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up on vm."
        fi
        #check for hangup in vm menu.  ex call went to vm and user hung up
        if [ ${VMSTATUS} = "FAILED" ]; then
                BODY="[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up on vm."
        fi
        #if they left a vm we already would get an email.  Don't need a 2nd
        if [ ${VMSTATUS} = "SUCCESS" ]; then
                exit 0
        fi
fi

#log mail command
if [ ${DEBUG} -eq 1 ]; then
echo "To: ${EMAIL} Subject: ${SUBJECT} ${BODY}" >> ${LOGFILE}
fi

#send email
if [ ${SENDMAIL} -eq 1 ]; then
${EMAILCMD} <<INLINE
To: ${EMAIL}
From: ${FROMEMAIL}
Subject: ${SUBJECT}

${BODY}

Asterisk PBX

INLINE
fi

exit 0

3.5.3. Меняем права на данный файл:

#chmod 755 /var/lib/asterisk/agi-bin/power3.ru

3.6. Настройка Asterisk на отправку сообщений о событиях, связанных с обработкой звонка.

#nano /etc/asterisk/extensions.conf

И в конце экстеншена на который звонки будут отправляться и оповещения о звонках, которых должны приходить оповещения, добавляем ниже:

exten => h,1,System(/var/lib/asterisk/agi-bin/power3.ru «my@email.net» "${CALLERID(num)}" "${CALLERID(name)}" "${DIALSTATUS}" "${VMSTATUS}" "${EXTEN}")

где my@email.net – почта куда хотим отправить сообщение о событии связанное со звонком.

3.7. Перезапускаем сервисы:

#service sendmail restart
#servie asterisk restart
( или config reload /etc/asterisk/extensions.conf или dialplan reload в консоли астера)

3.8. Проверяем.

При создании использовал следующие материалы:

habrahabr.ru/sandbox/56133
www.phinesolutions.com/sendmail-gmail-smtp-relay-howto.html
linuxconfig.org/configuring-gmail-as-sendmail-email-relay
www.theschmandts.org/blog/email-notifications-for-missed-calls-in-asterisk