FreePBX 配置Asterisk,以通过电子邮件通知队列中未接来电

图片
IP ATC Asterisk是功能强大的IP电话处理器。 为Asterisk创建的基于Web的FreePBX基于界面的界面大大简化了配置并降低了登录阈值。
如果您能提出与IP电话相关的某种任务,那么几乎可以肯定,它可以在Asterisk中实现。 但是请确保您需要坚韧和耐力。

我们面临着设置未接来电的电子邮件通知的任务。 更准确地说,是通过电子邮件通知有关入局排队的情况,但没有人(来自业务代表)已应答此入局呼叫。

令人惊讶的是,我们在FreePBX中找不到任何常规工具来解决此问题。 我将讨论如何在削减开支的情况下解决这个问题。

前言

在“直接”解决问题之前,我们当然在Internet上搜索信息,但是没有找到交钥匙解决方案(也许它们看起来很差,但是您可以做什么...)。

直接在Asterisk中的工作技能并不像我们想要的那样多,因此这里提出的解决方案没有被完全理解,因此被放弃了。

我喜欢这里提出的解决方案,尽管没有用。 因此,他们强调在[ext-queue]的背景下,必须在Asterisk中工作。 并且由于我们在Freepbx中工作,因此我们需要在配置文件“ extensions_override_freepbx.conf”中工作。 我们注意到在hangupcall事件(通话结束)之前“捕获未接来电”很方便。
阅读完这里的讨论后,我们想到了需要为队列中的所有代理过滤CDR中的“ Disposition”变量。 阅读完信息后,便形成了非常具体的步骤来解决该任务。

我们有什么:

有使用星号13.12.1。的FreePBX 13.0.197。 操作系统版本SHMZ 6.6版(最终版)。 该发行版基于CentOS。

星号配置了IVR(语音菜单),可将传入呼叫分散到不同的队列(队列)中。 代理(代理)被分配给每个队列,即代理。

理论

星号发生了什么

当来电到达星号时,该呼叫转到IVR。 呼叫者通过按电话上的特定号码进行选择,然后输入特定队列。 此后,队列中的所有空闲代理会同时收到呼叫。

为了更好地了解当前发生的情况以及接下来发生的情况,我们转向Report CDR(图1)。

图片
图1

当来电进入队列时,对于所有座席,如果座席当时不忙,变量“ Disposition”的值将等于“ NO ANSWER”。 变量“ Disposition”可以采用其他值(请参见https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ),但值“ ANSWERED”除外。 并且在座席之一应答来电时,此座席的“ Disposition”变量的值等于“ ANSWERED”。
从报告CDR中,您可以注意到,当呼叫排队时(在“应用程序”列中,该值变为“队列”),然后所有事件都以相同的“唯一身份”(“系统”列)出现。

CDR简介

重要的是要了解什么是CDR,以及在CDR的什么点输入我们在报告CDR中观察到的数据。 相对于操作系统,CDR是Asterisk在其中记录详细的呼叫报告的数据库(请参阅https://asterisk-pbx.ru/wiki/asterisk/cf/cdr )。 在我们的例子中,这是一个名为asteriskcdrdb的数据库,位于mysql中。 根据经验,我们发现有关具有特定“唯一身份”呼叫的数据不是在事件发生后立即输入asteriskcdrdb,而是在hangupcall事件(呼叫结束)之后输入。

解决方案的原理

由于我们对bash的了解多于对Asterisk的了解,因此主要思想如下。 在hangupcall事件之前,请调用bash脚本。 将3个参数传递给此脚本。 第一个参数是“ uniqueid”,以过滤从CDR接收的数据。 第二个参数是“ CALLERID(num)”(呼叫者的号码),用于知道要回叫的人。 第三个参数是“ NODEST”(队列号),已接到该呼叫,以便知道发生了什么问题,并且向谁发送未接来电的电子邮件通知。
bash脚本应连接到mysql中的asteriskcdrdb数据库,并使用特定的“ uniqueid”获取“ Disposition”变量的所有值。 从获得的数据中,必须排除以下值:“无应答”,“忙”,“失败”,“未知”。 结果,要么保留“ ANSWERED”(接听),要么接听来电,要么根本不接听。

此外,如果未接来电,脚本应发送电子邮件通知。
展望未来,我注意到一个重要的观点。 星号顺序执行命令,等待命令执行(通常是合乎逻辑的)。 在执行hangupcall命令之前,我们将调用bash脚本。 因此,在直接执行脚本的那一刻,关于我们要查找的唯一标识的信息尚未输入CDR。 为了解决这个问题,我们将使用“&”参数调用bash脚本,以便Asterisk立即进入下一步,即hangupcall。 在bash脚本的内部,一开始,我们将设置一个小的时间延迟,以使Asterisk有时间输入CDR中我们感兴趣的“唯一queque”数据。

练习

在继续配置Asterisk并创建bash脚本之前,您需要配置电子邮件通知的发送。 为此,我们将使用postfix实用程序。

后缀设置

我们在Yandex中有一个邮件域“ lucky.ru”。 我们将在smtp-client模式下配置postfix,并从asterisk@lucky.ru帐户发送信件。
解决方案来自此处: https : //www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex

首先安装/更新/检查软件包:

yum install postfix yum install mailx yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain 

我们不会覆盖主要的postfix配置文件“ /etc/postfix/main.cf”,而是将其备份:

 cp /etc/postfix/main.cf /etc/postfix/main.cf.sav 

我们编辑文件“ /etc/postfix/main.cf”,并将其转换为以下格式:

 nano /etc/postfix/main.cf ##################### relayhost = smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/private/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_type = cyrus smtp_sasl_mechanism_filter = login smtp_sender_dependent_authentication = yes sender_dependent_relayhost_maps = hash:/etc/postfix/private/sender_relay smtp_generic_maps = hash:/etc/postfix/generic smtp_tls_CAfile = /etc/postfix/ca.pem smtp_use_tls = yes smtputf8_autodetect_classes = all ##################### 

并非注释“ /etc/postfix/main.cf”中的每一行。 某些行中的注释不是由解析器确定的,而是传递给处理,这会导致错误。 最好拒绝此文件中的注释。 您可以通过在下一个窗口中运行“ tail -f / var / log / messages”进行试验。

我将标记为“ smtputf8_autodetect_classes = all”。 该条目默认包括utf-8,它使您可以在字母正文和主题行中使用西里尔字母,而无需进行其他操作(请参阅http://www.postfix.org/SMTPUTF8_README.html )。

为配置文件创建目录:

 mkdir /etc/postfix/private 

我们编辑文件“ / etc / postfix / private / sender_relay”。 在其中,您需要指定使用我们的邮件域时需要引用的smtp服务器:

 nano /etc/postfix/private/sender_relay ##################### @lucky.ru smtp.yandex.ru ##################### 

我们编辑文件“ / etc / postfix / private / sasl_passwd”。 在其中,我们将指示用于发送信件的电子邮件地址,以及该帐户的用户名和密码(我们通过冒号指定用户名和密码):

 nano /etc/postfix/private/sasl_passwd ##################### asterisk@lucky.ru asterisk@lucky.ru:password_asterisk ##################### 

编辑文件/ etc / postfix / generic。 在其中,我们将写下替换寄出地址的规则(请参阅https://wiki.merionet.ru/ip-telephoniya/30/postfix-nastrojka-otpravki-pochty-v-asterisk/ ):

 nano /etc/postfix/generic ##################### root asterisk@lucky.ru root@localhost asterisk@lucky.ru root@localhost.localdomain asterisk@lucky.ru root@freepbx asterisk@lucky.ru root@freepbx.localdomain asterisk@lucky.ru root@asterisk asterisk@lucky.ru root@asterisk.localdomain asterisk@lucky.ru asterisk asterisk@lucky.ru asterisk@localhost asterisk@lucky.ru asterisk@localhost.localdomain asterisk@lucky.ru asterisk@freepbx asterisk@lucky.ru asterisk@freepbx.localdomain asterisk@lucky.ru asterisk@asterisk asterisk@lucky.ru asterisk@asterisk.localdomain asterisk@lucky.ru root@localdomain.localdomain asterisk@lucky.ru ##################### 

初始外发地址取决于“ / etc / hosts”和“ / etc / hostname”的内容,以及发送信件的用户名。 也就是说,尽管事实上我们使用smtp客户端并从asterisk@lucky.ru发送信件,但后缀将最初将“其自身内容”替换为发件人的地址,并且应使用此配置文件中的规则进行更正。

我将列出我的/ etc / hosts文件的内容:

 cat /etc/hosts ##################### 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 asterisk.localdomain 127.0.0.1 localhost.localdomain localhost ::1 asterisk localhost localhost6 ##################### 

服务器必须具有任何域(句点后的值),这一点很重要,因为邮件实用程序会在“ / etc / hosts”中“查找”域名,如果没有立即“查找”该域名,它将继续执行几分钟,然后然后才发信。 也就是说,如果未注册域,则该信件将延迟几分钟才能离开。

我将列出我的/ etc / hostname文件的内容:

 cat /etc/hostname ##################### asterisk ##################### 

接下来,您需要将创建的配置文件传输到索引数据库,为此,请运行以下命令:

 postmap /etc/postfix/generic && postmap /etc/postfix/private/{sasl_passwd,sender_relay} 

接下来,我们需要下载smtp.yandex.ru证书并将其放置在服务器上,为此,请运行以下命令:

 openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25 > /etc/postfix/ca.pem 

但是在屏幕上出现技术信息后,团队将“继续挂起”。 按Ctrl + C终止它。

现在,从结果文件中手动删除所有垃圾,仅保留证书。 您应该得到这样的内容:

 nano /etc/postfix/ca.pem ##################### -----BEGIN CERTIFICATE----- MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf ... nRG0DfdqYIuPGApFORYe -----END CERTIFICATE----- ##################### 

最后,重新启动后缀:

 service postfix restart 

我们发送一封测试信:

 echo "  " | mail -s " " admin@lucky.ru 

admin@lucky.ru-目标地址

这样就完成了posfix配置。

编写bash脚本

创建一个用于存储bash脚本的目录(这里有人喜欢的地方):

 mkdir /home/asterisk/scripts 

创建一个bash脚本文件:

 touch /home/asterisk/scripts/noanswer.sh 

我们授予脚本文件执行权限:

 chmod +x /home/asterisk/scripts/noanswer.sh 

如果对文件的权限存有疑问,那么在调试过程中,您可以授予对该文件的完全访问权限。 但这是“不安全的”。

 chmod 777 /home/asterisk/scripts/noanswer.sh 

bash脚本的文本:

 nano /home/asterisk/scripts/noanswer.sh ##################### #!/bin/bash sleep 7 res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'" answer=`mysql -u freepbxuser -pPassword_freepbxuser -D asteriskcdrdb -B -N -e "$res_sql" | grep -E -v "NO ANSWER|BUSY|FAILED|UNKNOWN" | head -n 1` error_kod=0 if [ "$answer" != "ANSWERED" ] then case $3 in 68800) address="big_boss@lucky.ru" subject="  " ;; 63100) address="debian@lucky.ru" subject="  linux debian" ;; 63200) address="windows@lucky.ru" subject="  windows" ;; 63300) address="freebsd@lucky.ru" subject="  freebsd" ;; 63400) address="ubuntu@lucky.ru" subject="  linux ubuntu" ;; 63500) address="centos@lucky.ru" subject="  linux centos" ;; *) address="admin@lucky.ru" error_kod=1 ;; esac case $error_kod in 0) echo "    $2,  $subject." | mail -s "   $2" $address echo "   $address   $2,  $subject. uid=$1" | mail -s "   $2" admin@lucky.ru ;; 1) echo "   $2.  . uid=$1" | mail -s "   $2" admin@lucky.ru ;; esac fi ##################### 

脚本的简要分析:
“睡眠7”:

这是我之前写的相同的时间延迟。 我们有7秒的延迟。 虽然,我认为,一秒钟就足够了。

 «res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"»: 

为了方便起见,我们将mysql中的查询放入一个单独的变量中。

接下来,我们在mysql中发出一个请求,并过滤结果输出。 我们删除了除“ ANSWERED”以外的所有选项。 如果有多个“ ANSWERED”值,则只应保留一个。 最后,在变量“ answer”中,我们得到“ ANSWERED”或“”。
如果答案变量的值不等于ANSWERED,则这是未接来电。 根据队列号,使用大小写运算符,我们将设置必须向其发送电子邮件通知的地址以及该消息中的内容(消息的可变部分)。

以下是在Asterisk中设置队列但未在脚本中描述时的选项。 在这种情况下,admin @ lucky.ru将收到一封信,指出脚本不知道该队列。

如果描述了队列,则目的地信和重复的信将发送到admin@lucky.ru,指示“唯一”,以便在必要时可以跟踪此呼叫上的事件。

脚本结束。

我注意到,要连接到mysql,我们使用了我们预先识别的用户名和密码。 在FreePBX中,为了找出mysql中的Asterisk用户登录名,请运行以下命令:

 cat /etc/amportal.conf | grep AMPDBUSER 

并且为了找出在MySQL的Asterisk用户的密码,请运行以下命令:

 cat /etc/amportal.conf | grep AMPDBPASS 

配置星号

我们使用FreePBX。 FreePBX具有不同类型的配置文件(请参阅https://asterisk-pbx.ru/wiki/freepbx/files ),其中有一些是重新设计后由FreePBX覆盖的,而另一些则未被覆盖(称为自定义)。为用户。

我们将使用配置文件“ extensions_override_freepbx.conf”,因为它是定制类型的。

首先,确保在文件“ /etc/asterisk/extensions.conf”中连接了文件“ extensions_override_freepbx.conf”。 为此,请执行以下命令:

 cat /etc/asterisk/extensions.conf | grep extensions_override_freepbx.conf ##################### #include extensions_override_freepbx.conf ##################### 

编辑文件“ /etc/asterisk/extensions_override_freepbx.conf”,并将其转换为以下格式:

 nano /etc/asterisk/extensions_override_freepbx.conf ##################### [ext-queues] exten => h,1,System(/home/asterisk/scripts/noanswer.sh ${CDR(uniqueid)} ${CALLERID(num)} ${NODEST} &) exten => h,2,Macro(hangupcall,) ##################### 

如我先前所写,结尾处必须有“&”符号。 因为我们将直接从mysql数据库中使用带有CDR数据的bash脚本,并且仅在执行“ exten => h,2,Macro(hangupcall,)”之后将此数据输入mysql,所以我们不必等待bash脚本完成,然后继续进行Asterisk中的下一步。 bash脚本本身必须在执行其主要部分之前包含时间延迟。

为了使配置文件“ /etc/asterisk/extensions_override_freepbx.conf”中的更改生效,您需要使用以下命令重新启动Asterisk内核:

 /usr/sbin/asterisk -rx "core restart now" 

创建bash脚本后需要执行此操作。

结论

这可能是Asterisk中“捕获未接来电”的第1001条方法。 在评论中分享您如何解决此问题。 您认为可以改进/重做/优化什么。 我们将对建设性想法表示感谢。

Source: https://habr.com/ru/post/zh-CN463829/


All Articles