
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
并非注释“ /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
我们编辑文件“ / etc / postfix / private / sasl_passwd”。 在其中,我们将指示用于发送信件的电子邮件地址,以及该帐户的用户名和密码(我们通过冒号指定用户名和密码):
nano /etc/postfix/private/sasl_passwd
编辑文件/ etc / postfix / generic。 在其中,我们将写下替换寄出地址的规则(请参阅
https://wiki.merionet.ru/ip-telephoniya/30/postfix-nastrojka-otpravki-pochty-v-asterisk/ ):
nano /etc/postfix/generic
初始外发地址取决于“ / etc / hosts”和“ / etc / hostname”的内容,以及发送信件的用户名。 也就是说,尽管事实上我们使用smtp客户端并从asterisk@lucky.ru发送信件,但后缀将最初将“其自身内容”替换为发件人的地址,并且应使用此配置文件中的规则进行更正。
我将列出我的/ etc / hosts文件的内容:
cat /etc/hosts
服务器必须具有任何域(句点后的值),这一点很重要,因为邮件实用程序会在“ / etc / hosts”中“查找”域名,如果没有立即“查找”该域名,它将继续执行几分钟,然后然后才发信。 也就是说,如果未注册域,则该信件将延迟几分钟才能离开。
我将列出我的/ etc / hostname文件的内容:
cat /etc/hostname
接下来,您需要将创建的配置文件传输到索引数据库,为此,请运行以下命令:
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
最后,重新启动后缀:
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
脚本的简要分析:
“睡眠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
编辑文件“ /etc/asterisk/extensions_override_freepbx.conf”,并将其转换为以下格式:
nano /etc/asterisk/extensions_override_freepbx.conf
如我先前所写,结尾处必须有“&”符号。 因为我们将直接从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条方法。 在评论中分享您如何解决此问题。 您认为可以改进/重做/优化什么。 我们将对建设性想法表示感谢。