Смс рассылка

Задача

Требуется смс рассылка по собственной базе сотовых номеров. База не большая, 500 - 700 номеров. Скорсть не критична - всю базу нужно обработать в течении недели. Время рассылки с 10 00 до 19 00. В тексте обязательно должна быть ссылка на веб-ресурс.

Сервисы рассылок

Сервисы рассылок, например iqsms.ru - расценивают любую ссылку в сообщении как спам, и блокируют оправку. Реальная минимальная цена рассылки с федерального номера за смс - от 90 копеек. В среднем цена от 0,8 до 1,9 руб. за смс. Такое решение на подходит.

Epochta требует регистрацию имени отправителя, что занимает до 4-х рабочих дней. Ну и конечно же рассылать рекламные объявления не получиться. Цена за смс в среднем 1,5 руб.

Сервис Zazumedia - стоит заметить удобство личного кабинета, компетентность и скорость работы менеджера. Можно рассылать со ссылкой на свой ресурурс и с указанием телефонного номер. Цена - 70 - 80 коп. за смс. Вроде бы неплохой вариант, но как только дошло до дела - на следующий день после первой рассылки в тысячу смс, сервис отказался запускать рассылку, предлагая ближайшее время запуска через три дня, ссылаясь на технические причины. Через три дни ситуация повторилась...

На этом поиски сервисов закончились.

У онлайн сервисов помимо дорогой цены, есть еще один недостаток - неизветсно как используется в дальнейшем ваша база номеров, что бы не говорилось о том, что номера нигде не сохраняются, но гарантий нет никаких).

Собственная рассылка

Linux, являясь свободным клоном операционной системы Unix, превращает любой компьютер в рабочую станцию, дающую вам в руки всю мощь Unix. Попробуем организовать собственную смс рассылку на машине с ОС Linux на борту, без каких либо рамок и условий от третьей стороны. Единственный минус - это скорость рассылки, он не будет высокой, но в данной задаче это и не требуется. Если необходимо увеличить скрость рассылки - это решается масшатабированием данного решения.

Решение

Потребуется:

  • 3G USB - Модем (в моем случае Билайновский ZTE 262, разлоченый) - 200-300 руб. на авито
  • Сим карта YOTA безлимит с пакетом смс - 390 руб.
  • Машина с Linux - в данном случае Raspberry Pi 3

Модем должен быть разлочен и переведен в режим "только модем". Подробнее здесь Разлочка модема

Йота - безлимитные смс. Но это только написано, что безлимитные. На самом деле лимит есть, опытным путем удалось выяснить, что смс на разнае номера можно слать не чаще чем раз в 2 минуты. Скорость отправки при таких условиях будет около 30 смс в час. В день за 8 часов уйдет 250 смс - это с одной сим карты. Можно масштабировать решение для получания нужной скорости рассылки.

Минимальная стоимость 1 смс будет равна 6 копеек. Это при условии что система работает 8 часов в день, 30 дней в месяц (полная загрузка). Но, это идеальные условия. Если рассмотреть условия работы более приближенные к реальным - 6 часов в день, 20 дней в месяц - получится 1,3 руб. за смс.

Так как большая производительность не требуется, был выбран одноплатный компьютер Raspberry Pi 3. Так же Raspberry потребляеть мало электроэнергии и самое главное работает совершенно бесшумно!

Настройка

Модем определяетя в /dev/ как устройстов ttyUSB0 ttyUSB1 ttyUSB2. Какое из устройств отвечает именно за модем выясняем методм тыка. Взамидествовать с модемом можно через AT через стандартыне потоки ввода вывода или через minicom. Простейшая команда для опредления устройства (запращиваем баланс)
echo -e "AT+CUSD=1,"*100#",15\r\n" > /dev/ttyUSB1; cat /dev/ttyUSB1
Если устройстов то и все настроено верно, то ответ будет таким
CUSD: 0,"041204300448002004310430043B0430043D0441003A000A0038003000200440002E",72

Текст в кодировке HEX. Что бы получить русский
python -c 'print unicode("041204300448002004310430043B0430043D0441003A000A0038003000200440002E".decode("hex"), "utf-16-be").encode("utf8")'

Для отправки можно использовать AT команды через minicom или и стандартные потоки ввода вывода, но удобнее использовать готовую библиотку, например gnokii. Уствнавливаем
sudo apt-get install gnokii-cli gnokii-smsd xgnokii
При установке на Rasspberry возникла трудность, процесс зависал при подключении к репозеторию, вот такой ответ
0% [Connecting to mirrordirector.raspbian.org (2a00:1098:0:80:1000:75:0:3)]
Такое бывает и на других дистрибутивах, решается отключение IPV6:

  • sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
  • sudo sysctl net.ipv6.conf.default.disable_ipv6=1
  • sudo sysctl net.ipv6.conf.lo.disable_ipv6=1
  • sudo sysctl -p
  • Проверяем - ip addr show. После этого подключение должно проходить без проблем.

    Создаем файл конфигурации Дя Rasspberry путь будет таким /home/pi/.config/gnokii/config
    Для Ubuntu - /home/pi/.gnokiirc

    [global]
    model = AT
    connection = serial
    port = /dev/ttyUSB3
    Где, model - это тип устройства:

  • AT - для большинства телефонов,
  • series40 - для телефонов Nokia с системой series40,
  • gnapplet для старых телефонов Nokia Series60.
  • connection - тип соединения:
  • serial - USB/RS-232,
  • irda - инфракрасный порт,
  • bluetooth - Bluetooth.
  • dport - порт:
  • для USB - /dev/ttyACM0 или /dev/ttyUSB0,
  • для Bluetooth указываем адрес устройства ("aa:bb:cc:dd:ee:ff").
  • Проверяем поддерживается ли телефон:
    gnokii --identify
    Если ответ такой

  • GNOKII Version 0.6.30
  • IMEI : 355911053270509
  • Manufacturer : ZTE CORPORATION
  • No flags section in the config file.
  • Model : MF626
  • Product name : MF626
  • Revision : BD_P673M3V1.0.3B01
  • Значит все получилось - модем подключен! Можно отправлять смс

    Пробуем отправить смс
    echo "Тест" | gnokii --sendsms "+79043356296"

    При отправке русского текста может возникнуть ошибка
    ucs2_encode/iconv: Invalid or incomplete multibyte or wide character
    В /etc/locale.gen нужно раскомментировать и ru_RU.UTF-8, выполнить locale-gen.

    Команды для чтения смс:

  • Для вывода всех сохраненных SMS:
  • gnokii --getsms MT 1 end
  • gnokii --getsms MT 1 10
  • Непрерывное чтение смс
  • gnokii --smsreader
  • Удаляем все смс
  • gnokii --deletesms SM 1 5
  • Рассылка

    Описание скрипта

    Для рассылки написал простой скрипт на php. Можно запускать по крону . Делаем скрипт исполняемым chmod +x ... и В начале файл пишем #!/usr/bin/php
    crontab -e
    30 10 * * * /home/pi/send_sms/index.php
    Посмотреть работу крона можно так
    grep CRON /var/log/syslog

    Не зубудьте проветить системное время. На Rasspberry часвой пояс меняется в настройках
    raspi-config
    Internationalisation Options

    Резюме

    Данное решение подходить для смс рассылке по небольшой клинетской базе или смс оповещении о системных событиях без подключенного интерена. Можно подключить питание к Rasspberry от PowerBank и получить полностью автономную систему работающую на линукс, котороая будет выполнять команды (можно управлять внешними устройствами через GPIO) по входящей смс или отсылть в сообщении информацию о событиях (подключение датчиков к GPIO).