Ubuntu + Asterisk + FreePBX + Huawei E1750 — прием смс и пересылка их на e-mail.

В одной из предыдущих статей — Ubuntu 11.04 + Asterisk 1.8.6 + FreePBX 2.9 + настройка Sipnet + модем Huawei E1750. – Часть 3. – (Подключение модема Huawei E1750 к FreePBX.) — я рассказал как настроить модем Huawei E1750 для работы с Asterisk для совершения входящих и исходящих звонков. А сейчас я расскажу как принимать смс и пересылать их на нужный e-mail.

Для приёма смс нам понадобиться изменить конфиг файл:

sudo nano /etc/asterisk/extensions_custom.conf

Добавим в него следующие строки:

exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} -%- ${DATACARD} -%- ${CALLERID(num)} -%- ${SMS} -%-' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

Перезапустим Asterisk для применения изменений:

sudo service asterisk restart

Теперь все входящие смс будут сохранятся в текстовый файл — /var/log/asterisk/sms.txt, а его мы будем обрабатывать PHP скриптом для пересылки сообщений на нужный e-mail.

Вот сам скрипт:

<?php
 
// путь до файла с смс
$file_name = '/var/log/asterisk/sms.txt';
 
// если размер файла больше 0 переходим к его обрботке
if (filesize($file_name)>0) { 
 
	// открываем файл для чтения и записи
	$fobj = fopen($file_name,"r+");
	$text = fread($fobj, filesize($file_name));
	// в файл смс записываются в следуюшем формате
	// дата и время -%- datacard -%- номер отправителя -%- текст смс
	// формат и разделитель можно сменить в конфиг файле
	// преобразовываем содержимое в массив используя -%- как разделитель
	$text1 = explode("-%-", $text);
	// делим массив а части по 4 элемента
	$array = array_chunk($text1, 4);
	// рисуем таблицу в которой будут выводится наши смс
	$mes1 = "<table border='1' bordercolor='#000000' cellspacing='0' cellpadding='2'>";
	$mes2 = "<tr align='center' valign='middle
'><td width='160'>Дата и время сообщения</td><td width='140'>Номер отправителя</td><td width='230'>Сообщение</td></tr>";
 
	for ($i = 0; $i <= count($array)-2; $i++)
		{
    	$sms = $array[$i];
		$sms1[] = "<tr valign='middle
'><td align='center'>".$sms[0]."</td><td align='center'>".$sms[2]."</td><td align='left'>".$sms[3]."</td></tr>";
	}
 
	for ($mes3 = '', $j = 0; $j <= count($sms1); $j++)
		{
		$mes3 = $mes3.$sms1[$j];
	}
 
	$mes4 = "</table>";
 
	// Теперь перейдем к отправке
	// отправлять будем используя встроенную функцию mail()
 
	// получаем текущую дату
	$date = date("d.m.Y");
	// получаем текущее время
	$time = date("H:i:s");
	// адрес куда будем отправлять письмо
	$to  = "your-mail@your-domen.com";
	// тема письма
	$subject = "New SMS Message(s) - ".$date." - ".$time;
	// текст письма
	$message = $mes1.$mes2.$mes3.$mes4;
	// дополнительные заголовки письма
	// кодировка письма
	$headers  = "Content-type: text/html; charset=utf-8 \r\n";
	// отправитель письма
	$headers .= "From: SMS Gate <sms@your-domain.org>\r\n";
 
	// отправляем письмо, если отправка прошла успешно
	// выводим сообщение иочищаем файл с смс
	if (mail($to, $subject, $message, $headers)) {
		echo "Soobshenie ojidaet otpravki";
		ftruncate ($fobj, 0);
	} else {
		// если ошибка выводим это сообщение
		echo "Oshibka pri otpravke";
	}
 
	// закрываем файл
	fclose($file_name);
 
}
 
// если файл пустой выводим это сообщение
else { echo "Sms soobshenii net..."; }
 
?>

Далее ставим скрипт на авто исполнение в Cron например каждые 5 минут. Вот команда которую надо добавить в Cron, которой будем вызывать наш скрипт(где вместо 192.168.1.1 — ваш ip или домен):

wget -O /dev/null -q http://192.168.1.1/sms.php

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


24 комментария

  • Валентин

    21.10.2011

    Большое спасибо! работает!!!! но как то долго обработка проходит файла.

    Reply
    • admin

      26.10.2011

      Возможно из-за каких-то настроек Sendmail долго обрабатывается.

      Reply
  • Goodie

    22.10.2011

    OK!

    А как-нить мона отправлять пришедшие смс-ки ПРЯМО НА extension?
    (в роли экстенжна — софт-телефоны или IP-телефоны, зарегистрированные на астере по SIP или IAX2)

    Reply
    • admin

      26.10.2011

      Согласен что было бы удобнее отправлять сразу на Softphone, но я на данный момент как это реализовать не знаю.

      Reply
  • Вячеслав

    24.10.2011

    Спасибо за инструкцию, очень помогла.
    Ставил ubuntu на vmware, модем был huawei e1780 – всё заработало : звук, смс.
    Осталось настроить под себя freepbx.
    Спасибо еще раз

    Reply
  • klistrod

    27.10.2011

    еще бы сделать пересылку в Jabber сделать!!)

    Reply
    • admin

      28.10.2011

      Jabber`ом не пользуюсь, поэтому в этом вопросе помочь не смогу.

      Reply
  • klistrod

    27.10.2011

    // отправлять будем используя встроенную функцию mail()
    функцию надо доставлять или она уже стоит?

    // отправитель письма
    $headers .= «From: SMS Gate \r\n»;

    вместо домена your-domain.org возможно прописать локальный адрес например 192.168.1.2?

    Reply
    • admin

      28.10.2011

      Функция mail() встроена в php так что если PHP установлен больше ничего не надо.

      Вместо домена your-domain.org указать можно что угодно это просто адрес отправителя, то есть письма будут приходить якобы с этого адреса.

      Reply
  • klistrod

    27.10.2011

    точнее хотел спросить как правильно Sendmail настраиваеть?

    Reply
    • admin

      28.10.2011

      У меня отлично работает и настройками по умолчанию. Если нужно что-то особенное это уже другой вопрос.

      Reply
  • Absint

    27.10.2011

    а куда php файл кидать-то?? в какую папку?

    Reply
    • admin

      28.10.2011

      Кидать в любую удобную директорию веб сервера. По умолчанию директория Apache — /var/www Если закинуть файл туда то он будет доступен по адресу — http://vash-ip-ili-domen/sms.php (если конечно созданный файл назовете sms.php).

      Reply
  • Валентин

    01.11.2011

    Дружище, а как бы еще и смс рассылки организовать? на сколько мне известно обзвон можно как то сделать через call файлы. А заставить смс рассылать? не актуально?

    Reply
  • klistrod

    09.11.2011

    А вообще отправку смс можно как нибудь сделать?

    Reply
  • Константин

    18.02.2012

    Мужики подскажите пожалуйста что поправить в данном скрипте, при условии, что вместо datacard используется dongle ?
    А то сделал все как написано, но выдает: «Oshibka pri otpravke» когда проверяю по ссылке http://192.168.X.X/sms.php.
    Использую:
    1. Asterisk 1.8.6.0+FreePBX 2.9.0.9;
    2. chan_dongle: Huawei 3G Dongle Channel Driver, Version 1.1, Revision 10
    СПАСИБО!!

    Reply
  • Константин

    18.02.2012

    а да,
    3. Ubuntu 11.10 (GNU/Linux 3.0.0-15-generic i686)

    Reply
  • Константин

    19.02.2012

    «Oshibka pri otpravke» скорее всего возникает из-за того, что я использую в качестве smtp-релея SSMTP, а в примере скорее всего используется связка с SENDMAIL.
    Может быть такое? Как поправить?
    Почта с командной строки уходит и приходит на ура.
    (ПС: /etc/php5/apache2/php.ini поправил вписав туда sendmail_path = /usr/sbin/ssmtp -t, но все равно не работает отправка почты с PHP скрипта)

    Reply
  • noname

    23.03.2012

    А не проще ли сразу с диалплана отправлять?
    exten => sms,n,System(ssmtp maio@sms.mtslife.ru < /var/log/asterisk/sms.txt)

    Reply
  • Евгений

    10.05.2012

    Я не силен в скриптах. Не подскажите как можно организовать отправку файла на сетевую папку?

    Reply
  • Валентин

    25.06.2012

    Вопрос такой, скрипт работает отлично, но теперь такой вопрос, внутренняя память для приема смс на симке заполнилась, как бы сделать так что бы ее (память на симке) скрипт проверял и удалял все с симки?

    Reply
  • Дмитрий

    10.07.2012

    Привет! Воспользовался скриптом. Письмо приходит пустое, просто таблица без сообщений. Файл с смс затирает.

    Reply
  • sashasaturn

    02.04.2013

    Спасибо за статью, у Вас интересный блог.
    Прием смс можно реализовать более удобно — /etc/asterisk/extensions_custom.conf — следующие строки:

    exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
    exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DATACARD} — ${CALLERID(num)}: ${SMS}’| mail -s ‘ATC SMS’ mygmailaccount@gmail.com)Прием смс можно реализовать более удобно — /etc/asterisk/extensions_custom.conf — следующие строки:

    exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
    exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DATACARD} — ${CALLERID(num)}: ${SMS}’| mail -s ‘ATC SMS’ mygmailaccount@gmail.com)
    exten => sms,n,Hangup()Прием смс можно реализовать более удобно — /etc/asterisk/extensions_custom.conf — следующие строки:

    exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
    exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DATACARD} — ${CALLERID(num)}: ${SMS}’| mail -s ‘ATC SMS’ mygmailaccount@gmail.com)
    exten => sms,n,Hangup()
    exten => sms,n,Hangup()

    и смс сразу уйдет на почту. Использую ubuntu + postfix

    Reply
  • Денис

    11.06.2016

    exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
    exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} – ${DATACARD} – ${CALLERID(num)}: ${SMS}’| mail -s ‘ATC SMS’ mygmailaccount@gmail.com)
    exten => sms,n,Hangup()
    заработало сразу. на почту приходят в течении сек. СПАСИБО

    Reply

Добавить комментарий