Предистория
Начальство поставило задачу организовать смс-рассылку для структурных подразделений организации. Компания-провайдер sms-рассылки предоставляет протокол smpp. Необходимо было организовать рассылку через smpp коротких текстовых сообщений, получать отчеты о доставке. В качестве sms-шлюза был выбран Kannel.
Статья представляет из себя «быстрый старт» по Kannel и содержит в себе базовые настройки шлюза и примеры кода, на основе которых можно написать собственную систему смс-рассылки.
Установка и конфигурирование будет рассматриваться на примере Fedora.
Ремарка
Эта статья не является клоном этой http://habrahabr.ru/post/124302 и этой http://habrahabr.ru/post/123380 статей.
Я знаком с ними и пользовался ими в процессе работы, моя и эти статьи будут иметь много общего, но хотелось как-то систематизировать всю накопленную в процессе работы информацию для дальнейшего использования в работе.
Установка и настройка
Устанавливаем пакет
kannel:yum install kannelСоздаем пользователя kannel
useradd kannelРедактируем файл /etc/kannel.conf
group = core admin-port = 13000 smsbox-port = 13001 admin-password = 1 log-file = "/var/log/kannel/kannel.log" log-level = 0 dlr-storage = internal store-file = "/home/kannel/kannel.store" group = smsbox bearerbox-host = "127.0.0.1" sendsms-port = 13003 group = sendsms-user username = foo password = bar concatenation = true max-messages = 20 group = smsc smsc = smpp smsc-id = id host = domain.com port = 3700 transceiver-mode = 1 smsc-username = "login" smsc-password = "password" system-type = "VMA" address-range = "" log-file = "/var/log/kannel/smsc-operator.log" log-level = 0
Стартуем kannel
/etc/init.d/kannel startДля того, чтобы убедиться, что все работает заходим по адресу:
mydomain.com:13000/statusОтправка смс
Для того, чтобы отослать смс в простейшем случае надо набрать в адресной строке:
domain.com:13003/cgi-bin/sendsms?user=foo&pass=bar&from=Test&coding=0&to=38050000000000&text=Test1Данным приемом можно воспользоваться для теста, но в реальной обстановке он не годится. Да и хочется отсылать смс не в транслите, а на русском языке. В этом случае подойдет следующий код:
function send_sms($from, $to, $mytext) { $mytext=urlencode(iconv("utf-8","ucs-2be",$mytext)); $url = "http://domain.com:13003/cgi-bin/sendsms?user=foo&pass=bar&from=$from&coding=2&to=$to&text=$mytext"; file_get_contents($url); }
Если же хочется слать в транслите (или просто полностью на английском языке), то отпадает необходимость перекодировки текста и в адресной строке используется параметр coding=0.
function send_sms_translit ($from, $to, $mytext) { $mytext=urlencode($mytext); $url = "http://domain.com:13003/cgi-bin/sendsms?user=foo&pass=bar&from=$from&coding=0&to=$to&text=$mytext"; file_get_contents($url); }
Стоит отметить, что длинные смс таким образов посылаются корректно абсолютно никаких проблем не возникает.
Отчеты о доставке
Для получения отчетов о доставке нам необходимо присваивать id каждого смс и передать Kannel адрес, который тот должен вызвать при получении отчета о доставке.
Для начала приведу код
function send_sms($from, $to, $mytext, $smd_id) { $mytext=urlencode(iconv("utf-8","ucs-2be",$mytext)); $dlrurl=urlencode("http://domain.com/smsdeliv.php?smsid=$sms_id&type=%d"); $url = "http://domain.com:13003/cgi-bin/sendsms?user=foo&pass=bar&from=$from&coding=2&to=$to&dlr-mask=1&dlr-url=$dlrurl&text=$mytext"; file_get_contents($url); }
В параметре
dlr-url мы передаем адрес, который будет вызван, когда будет получен отчет о доставке.Параметр
dlr-mask определяет, какие именно типы сообщений о доставке мы хотим получать.Подробно механизм работы этой схемы описан на странице
www.kannel.org/download/kannel-userguide-snapshot/userguide.html#DELIVERY-REPORTS.
Там же приведены типы сообщений о доставке и их числовые значения.
Я не вижу смысл приводить их тут дополнительно.
На этом все, спасибо за внимание.