Настройка рассылки SMS сообщений через gsm модем с linux сервера.

Linux
Потребовалось мне сделать рассылку СМС сообщений с компьютера, желательно с возможностью отправки с нескольких компьютеров по одной симке. Попробовал вариант с программой краснояйцевого оператора, все было как надо, но она периодически требовала перерегистрацию, поэтому решил сделать свою программу. Хорошо что под рукой был свободный модем Siemens MC 35, сервер с Ubuntu 10.04, симка. Так же возможно использования usb модемов, старых телефонов или еще каких экзотических девайсов.

Итак...
Наш модем подключен по com порту, поэтому ставим программку miniport,comgt и smstool
sudo apt-get install comgt
sudo apt-get install minicom
sudo apt-get install smstools

В файле /etc/smsd.conf правим настройки для подключения модема
devices = GSM1
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
incoming = /var/spool/sms/incoming
logfile = /var/log/smstools/smsd.log
infofile = /var/run/smstools/smsd.working
pidfile = /var/run/smstools/smsd.pid
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent
stats = /var/log/smstools/smsd_stats
delaytime = 10
user = sms
group = sms
incoming_utf8 = yes
receive_before_send = no
autosplit = 3
decode_unicode_text = yes

[GSM1]
device = /dev/ttyS0
incoming = yes
baudrate = 19200
report = yes
send_delay = 5

Проверим соединение
# minicom -b 19200 -D /dev/ttyS0

Результат в моем случае такой
Port /dev/ttyS0
OK
AT
OK


Все, можно пробовать отправлять. Для отправки я использовал 2 метода: шеловский скрипт и php программу для веб интерфейса.

Текст скрипта
SPOOLDIR="/var/spool/sms/outgoing/"
ALPHABET="UCS2"
PHONE="$1"
STDIN="$2"
SMSFILENAME=$(mktemp /home/admin2/sms_XXXXXXX)
chmod 777 ${SMSFILENAME}
echo -e "To: ${PHONE}\nAlphabet: ${ALPHABET}\nUDH: false\n" >${SMSFILENAME}
if [ "${ALPHABET}" == "UCS2" ]; then
    echo "${STDIN}" | iconv -f UTF-8 -t UCS-2BE >>${SMSFILENAME}
    fi

mv ${SMSFILENAME} ${SPOOLDIR}

Использовать так
./smssend.sh +7915XXXXXXX testtest


Текст программы на php
<?

$SPOOLDIR="/var/spool/sms/outgoing/";
$logfile="/var/log/smslog";

header('Content-type: text/html; charset=UTF-8');
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">
<html><head><title>SMS рассылки Тамбовэнерго</title>
<!-- <meta http-equiv=\"Content-Type\" content=\"text/html;charset=iso-8859-15\"> -->
<style type='text/css'>
  body {
  color: #222;
  margin-left: 50px;
  margin-right: 10%;
  font-family: Verdana, sans-serif;
  background: #efefef;
  }

  </style>

</head><body>";

function RandStr() {
    $length = 8;
    $characters = "123456789abcdef";
    $string = "";
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(1, strlen($characters))];
    }
    return $string;
}

$text = $_POST['text'];
$dest = $_POST['dest'];

if ($text != "")
{

  if ($dest=="0")
    {
        $name="Anton";
        $tel = array("+7915ХХХХХХХ");
    }

  if ($dest=="1")
    {
        $name = "Anton + Freeez";
        $tel = array('+7915ХХХХХХХ' ,
                     '+7953ХХХХХХХ' );
    }

  if ($dest=="2")
    {
        $name = "IT";
        $tel = array('+7915ХХХХХХХ' ,
                     '+7953ХХХХХХХ',
                     '+7910ХХХХХХХ'
                      );
    }

   $alltel="";

   foreach ($tel as &$value)
   {
    $alltel.=$value." ";
    $rs=RandStr();
    $fn="sms_$rs";
    $tempfile="/var/www/tmp/$fn";
    $SMSFILE = fopen($tempfile, "a+");
    $ucs2text=mb_convert_encoding($text, "UCS-2BE", "UTF-8");
    fwrite($SMSFILE, "To: $value\nAlphabet: UCS2\nUDH: false");
    fwrite($SMSFILE, "\n\n$ucs2text");
    fclose($SMSFILE);
    $ip=$_SERVER['REMOTE_ADDR'];
    copy("$tempfile", "$SPOOLDIR/$fn");
   }

    $log=fopen($logfile, "a+");
    fwrite($log, "\n\n-------------------\nIP:$ip\nTime:".date('l jS \of F Y h:i:s A')." \nTo: $name($alltel)\n$text");
    fclose($log);
    print "
 Сообщение ($text) отправленo на телефон:  $name($alltel) 
";
    print "

<a href='smstest.php'>Вернутся в начало</a>";

}
else
{
  print " 

<font size='4'> Отправка СМС рассылок </font>

";
  print "  <form name='test' id='test' method='post' ";
  print ">
    <table width='600px'>
    <tr><td>
    Получатели:
    <select name='dest' size='20' style='width: 300px'  onClick='getname();' onSelect='getname();'>
    <option value=0>Anton</option>
    <option value=1>Anton+Freeez</option>
    <option value=2>IT</option></select>
    </td>
    <td>
    Текст сообщения:
    <textarea rows='21' cols='48' name='text'></textarea>
    
    </td>
    </tr>
    </table>
    <input type='submit' value='Отправка сообщения'>
  </form>
<div id='div1'>.</div>

<script>
function getname(){
    var sel = document.test.dest;
    document.getElementById('div1').innerHTML = sel.options[sel.value].text;
    }
</script>

";
}

print "
</body>
</html>
";

?>


Что умеет скрипт: рассылать смс сообщение нескольким абонентам, вести лог рассылок с ip адресом отправителя и… что еще для счастья нужно. Позже будет доделанный вариант с возможностью добавления готовых форм сообщений.

Выглядит так
sms linux

UPD. Часть 2

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

avatar
Однако неплохо.
avatar
Обновил еще, сначала часть удалилась куда-то
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.