Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Скрипт пересылки SMS сообщений

    Скрипт пересылки SMS сообщений

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Скрипт пересылки SMS сообщений, RouterOS
     
    abbio90
    Guest
    #1
    0
    12.04.2024 10:16:00
    У кого-нибудь есть скрипт, который читает SMS и пересылает их через SMS?
     
     
     
    hsd75
    Guest
    #2
    0
    03.05.2024 07:22:00
    Да, я сделал, вот мой скрипт.  
    # Скрипт для пересылки SMS из GSM-модема в email

    # чтобы избежать одновременного запуска скрипта дважды

    :if ([/system script job print count-only where script="FORWARDSMS"] < 2) do={
    :local number1 "+33xxxxxxxxx"  
    :local smsPhone  
    :local smsTimeStamp  
    :local smsMessage  
    :local smsContent  
    :local toNumber  
    :local port "usb1"  
    :local channel "2"  
    :global compareNum

    # цикл по всем сообщениям во входящих #  
    :foreach i in=[/tool sms inbox find] do={
    /log info "SMS $i"  
    :set smsPhone [/tool sms inbox get $i phone]
    :set smsTimeStamp [/tool sms inbox get $i timestamp]
    :set smsTimeStamp [:pick $smsTimeStamp 0 19]
    :set smsMessage [/tool sms inbox get $i message]

    :if (($smsMessage != "") && ($smsPhone != $number1)) do={  
    :if ($compareNum != $smsPhone ) do={  
    :set smsContent "От:\n$smsPhone\n$smsTimeStamp\n_____________________________"  
    /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel  
    }  
    /tool sms send port=$port phone-number=$number1 message=$smsMessage channel=$channel  
    :set compareNum $smsPhone  
    }  
    /tool sms inbox remove $i  
    delay 1  
    }  
    }
     
     
     
    optio
    Guest
    #3
    0
    03.05.2024 13:36:00
    Будьте осторожны, это может случиться при отправке SMS через ROS.
     
     
     
    hsd75
    Guest
    #4
    0
    04.05.2024 04:36:00
    С моей стороны проблем не было уже несколько лет. Я использую два разных модема: один Mikrotik LTE и один USB. Мой скрипт сразу же удаляет SMS после пересылки, включая пустые строки. Главное — не перегружать входящие SMS.
     
     
     
    hsd75
    Guest
    #5
    0
    04.05.2024 05:39:00
    Вот мой почти полный скрипт. Я запускаю его каждые 5 секунд, и он не влияет на ресурсы или производительность. Он может выполнять команду только при получении SMS с моего мобильного номера и может отправить SMS кому угодно с командой “send mobiletosend# сообщение”, например: “send +3306070809# Тестовое сообщение”. И, конечно, пересылает на ваш мобильный любой входящий SMS, кроме тех, что с вашего номера.

    # Скрипт для пересылки SMS

    :if ([/system script job print count-only where script="SMS2EXEC"] < 2) do={
     :local number1 "+33ваш_мобильный"
     :local smsPhone
     :local smsTimeStamp
     :local smsMessage
     :local smsContent
     :local toNumber
     :local port "usb1"; #в моём случае
     :local channel "2"; #оставьте пустым, если используете встроенный модем LTE
     :local URL "URL или IP другого mikrotik роутера через API"
     :local userapi "авторизованный_пользователь"
     :local passwordapi "пароль"
     :global compareNum
     
    # проходим по всем сообщениям во входящих #
    :foreach i in=[/tool sms inbox find] do={
    /log info "SMS $i"
    :set smsPhone [/tool sms inbox get $i phone]
    :set smsTimeStamp [/tool sms inbox get $i timestamp]
     :set smsTimeStamp [:pick $smsTimeStamp 0 19]
    :set smsMessage [/tool sms inbox get $i message]

    :if ($smsPhone = $number1) do={
     :if ($smsMessage ="?") do={
       :set smsContent "***Команды***\n>ip : Получить IP\n>ipv6 : Получить IPv6\n>reboot : Перезагрузить роутер\n>send num# msg : Отправить сообщение"
       /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
     }
     :if ($smsMessage ="ipv6") do={
       :local faiaddress6 [/tool fetch http-method=get mode=https url="https://$URL/rest/ip/cloud" output=user as-value \
       user=$userapi password=$passwordapi http-header-field="Content-Type: application/json"]
     
       :set faiaddress6 [:pick ($faiaddress6->"data") 0 ([:len ($faiaddress6->"data")]-1)]
       :set faiaddress6 ([:pick $faiaddress6 ([:find $faiaddress6 "public-address-ipv6"]+22) ([:find $faiaddress6 "status"]-3)])
       :set smsContent "IPv6 роутера:\n$faiaddress6"
       /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
       /tool sms inbox remove $i
     }
     :if ($smsMessage ="ip") do={
       :local faiaddress [/tool fetch http-method=get mode=https url="https://$URL/rest/ip/cloud" output=user as-value \
       user=$userapi password=$passwordapi http-header-field="Content-Type: application/json"]
     
       :set faiaddress [:pick ($faiaddress->"data") 0 ([:len ($faiaddress->"data")]-1)]
       :set faiaddress ([:pick $faiaddress ([:find $faiaddress "public-address"]+17) ([:find $faiaddress "public-address-ipv6"]-3)])
       :set smsContent "IP роутера:\n$faiaddress"
       /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
       /tool sms inbox remove $i
     }
     :if ($smsMessage ="reboot") do={
       :set smsContent "Перезагрузка"
       /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
       /tool sms inbox remove $i
       delay 3
       /system/reboot
     }
     :if ( [:pick $smsMessage 0 4 ] ="send") do={
       :if ($smsMessage ~"#") do={
         :set toNumber ([:pick $smsMessage 4 ([:find $smsMessage "#"])])
         :set smsContent ([:pick $smsMessage ([:find $smsMessage "#"]+2 ) ([:len $smsMessage]+1)])
         /tool sms send port=$port phone-number=$toNumber message=$smsContent channel=$channel
         :set smsContent "Сообщение отправлено на $toNumber"
         /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
     } else={
     :set smsContent "Сообщение не отправлено!"
     /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
     } }
    }
     
     :if (($smsMessage != "") && ($smsPhone != $number1)) do={
       :if (($compareNum != $smsPhone ) || ( $compareNum = $smsPhone )) do={
         :set smsContent "От:\n$smsPhone\n$smsTimeStamp\n_____________________________"
         /tool sms send port=$port phone-number=$number1 message=$smsContent channel=$channel
       }
       /tool sms send port=$port phone-number=$number1 message=$smsMessage channel=$channel
       :set compareNum $smsPhone
       }
       /tool sms inbox remove $i
       delay 1
       }
    }
     
     
     
    optio
    Guest
    #6
    0
    05.05.2024 15:36:00
    Я говорю о отправленных сообщениях (исходящие), эти сообщения не удаляются с SIM-карты после отправки через ROS (если только не используется AT-команда). Всё зависит от ёмкости SIM-карты и количества отправленных сообщений, возможно, в вашем случае лимит ещё не достигнут.
     
     
     
    abbio90
    Guest
    #7
    0
    17.05.2024 18:29:00
    Я проверил скрипт на 7 роутерах, и он не работает. Попытался адаптировать, но выдает ошибку «message too long». Пробовал разбивать с помощью :pick. Первые две части обрезаются нормально, а в третьей он снова добавляет заголовок.

    #inserire numero di telefono 1

    :local number1 "+39123456789"

    #----------------------------------------

    #inserire nome azienda

    :local azienda "Mario Rossi - Milano"

    #----------------------------------------



    #----------НЕ ИЗМЕНЯТЬ ЭТИМ БЛОК----------

    #----------------------------------------


    :local smsPhone
    :local port "lte1"
    :local scheduleName "SMS-Forward-Scheduler"
    :local myRunTime 00:30:00

    :if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
    /log error "[SMS Forward script 1.0] Внимание: планировщик не существует."
    /system scheduler add name=$scheduleName interval=$myRunTime start-date=Jan/01/1970 start-time=startup on-event="system script run SMS-Forward-script"
    /log warning "[SMS Forward script 1.0] Внимание: планировщик создан."
    }


    #--------------------------------

    :local tgPrefix "Клиент: $azienda \r\nИдентификатор: $[/system identity get name]\r\n"
    :local smsPhone;
    :local smsTimeStamp;
    :local smsMessage;
    :local smsContent;
    :local i;
    :log info "Скрипт пересылки SMS запущен";
    /tool sms set receive-enabled=yes; delay 2
    :foreach i in=[/tool sms inbox find] do={
    :set $smsPhone [/tool sms inbox get $i phone];
    :set $smsTimeStamp [/tool sms inbox get $i timestamp];
    :set $smsMessage [/tool sms inbox get $i message];
    :set $smsContent "$tgPrefix\nОтправитель: $smsPhone\nДата и время: $smsTimeStamp\nСообщение: $smsMessage \r\n";
    :log info $smsContent;
    :local date ([system clock get date])
    :local time ([/system clock get time])


    #---------------------------------
    #ЗДЕСЬ ВСТАВИТЬ ТЕКСТ УВЕДОМЛЕНИЯ
    :local notify "$smsContent"
    #--------------------------------

    :local textMessage [:pick $notify 0 150]
    :local textMessage2 [:pick $notify 150 300]
    :local textMessage3 [:pick $notify 300 450]


    /tool sms send port=$port phone-number=$number1 message=$textMessage
    :delay 2s
    :if ($textMessage2!="") do={
    /tool sms send port=$port phone-number=$number1 message=$textMessage2
    }
    :delay 2s
    :if ($textMessage3!="") do={
    /tool sms send port=$port phone-number=$number1 message=$textMessage3
    }

    /tool sms inbox remove $i; delay 10; }
    /tool sms set receive-enabled=no;
    :log info "Скрипт пересылки SMS завершен";
     
     
     
    FlowerShopGuy
    Guest
    #8
    0
    03.11.2024 21:01:00
    Привет, есть ли у кого-нибудь скрипт, который может пересылать SMS на электронную почту?
     
     
     
    mikear
    Guest
    #9
    0
    16.11.2024 13:13:00
    Недавно написал скрипт, который по расписанию пересылает все новые входящие SMS-сообщения на мой e-mail. Скрипт удаляет самые старые SMS, пока в папке входящих не останется заданное максимум количество сообщений. Количество сообщений в папке SMS хранится в файле (nrSMSmessages.txt). При запуске скрипта это число сравнивается с текущим количеством SMS во входящих. Если появилось больше (новых) сообщений, они пересылаются по e-mail. Если все письма отправлены успешно, самые старые сообщения удаляются. Если хотя бы одно письмо отправить не удалось, все SMS сохраняются. Скрипт также можно запустить командой по SMS (“:cmd secret script forward-incoming-sms”). Не утверждаю, что скрипт идеален и подходит всем, но он помогает мне держать в курсе все сообщения, которые оператор присылает на SIM-карту в моём роутере (примерно в 1500 км от меня). Надеюсь, будет полезен и вам…

    # RouterOS скрипт для пересылки всех входящих SMS на указанный e-mail  
    # Хранит максимум заданное число SMS во входящих (/tool sms inbox)  
    # Если отправка письма хотя бы для одного сообщения не удалась — сообщения не удаляются  
    # Запускать как задание по расписанию, например, каждые 10 минут  
    # Автор: Mike Bosschaert  
    # Дата: 20241116  
    # Версия: 1.0  
    # Платформа: RouterOS 7.15.3 (Mikrotik Chateau LTE12)  

    # задаём переменные  
       :local eMailTo "youremail@address.com"  
       :local eMailSubject "SMS message from Mikrotik router:"  
       :local maxMessages 10  
       :local filename "flash/nrSMSmessages.txt" ; #обязательно на постоянном диске и БЕЗ ведущего "/"!  
       
    # проверяем, существует ли $filename, если нет — создаём файл  
       :if ([:len [/file find name=$filename]] = 0) do={ /file add type="file" name=$filename content=0; :log info "$filename создан"}
       
    # получаем список сообщений и сохраняем в массив ($inboxData), а также текущее количество SMS во входящих  
       :local inboxData [/tool sms inbox print as-value]
       :local messageCount ([:len $inboxData])

    # читаем количество ранее учтённых SMS из файла  
       :local previousNrSMS [/file get $filename contents]
    # записываем текущее количество SMS в файл $filename  
       /file set $filename contents=$messageCount  

       :local messagesToSend ($messageCount - $previousNrSMS)  
       :log info "SMS во входящих ранее: $previousNrSMS, сейчас: $messageCount, осталось отправить: $messagesToSend"  

    # перебираем список SMS, начиная с первого нового сообщения  
        :local eMailSuccess true  
        :local index ($previousNrSMS + 1)  
       
        :while ($index < ($messageCount)) do={  
           # получаем отправителя, текст сообщения и метку времени из массива $inboxData  
           # так как индексы начинаются с 0, вычитаем 1 из индекса  
           :local sender ([:pick $inboxData ($index-1)]->"phone")
           :local message ([:pick $inboxData ($index-1)]->"message")
           :local timestamp ([:pick $inboxData ($index-1)]->"timestamp")
           
           # отправляем e-mail с информацией  
           :log info "отправка SMS №$index на $eMailTo"  
           /tool e-mail send to="$eMailTo" body="$message" subject="$eMailSubject $timestamp $sender"  
           
           # проверяем, удачно ли отправлено письмо, если нет — не удаляем SMS  
           :local ExitDoLoop false  
           :while ($ExitDoLoop = false) do={  
             :local EMailStatus [/tool e-mail get last-status];
             #:log info "проверка статуса отправки: $EMailStatus"  
             :if ($EMailStatus != "failed" && $EMailStatus != "succeeded") do={ delay 1s; put "."} else={  
               :set ExitDoLoop true;  
               :if ($EMailStatus != "succeeded") do={  
                 :set eMailSuccess false  
                 :log info "отправка e-mail неуспешна, SMS сохранены и будут отправлены при следующем запуске"  
               }  
             }  
           }          
           
           # ждём 10 секунд перед отправкой следующего сообщения  
           :delay 10s  
           :set index ($index +1)  
         }  

    # проверяем, не превышает ли количество SMS максимум, если да — поочерёдно удаляем самое старое (индекс 0)  
    # этот цикл запускается только если все письма отправлены успешно ($eMailSuccess = true)  
        :if ($eMailSuccess = true) do={  
           :log info "все SMS успешно отправлены, удаляем старые сообщения, если превышен лимит хранения"  
           :while ($maxMessages < $messageCount) do={  
             # удаляем самое старое сообщение (индекс 0)  
             /tool sms inbox remove 0  
             # ждём 20 секунд, чтобы RouterOS успел переиндексировать папку входящих  
             :delay 20s  
             # обновляем количество сообщений, если всё ещё превышает лимит — удаляем дальше (индекс 0)  
             :local inboxData [/tool sms inbox print as-value]
             :set messageCount ([:len $inboxData])
            }  
            # после очистки обновляем файл с текущим количеством сообщений  
            /file set $filename contents=$messageCount  
         } else={  
           :log info "отправка e-mail провалилась, восстанавливаем прежнее количество сообщений"  
           /file set $filename contents=$previousNrSMS  
        }
     
     
     
    BillyVan
    Guest
    #10
    0
    26.11.2024 10:42:00
    @mikear Отлично, спасибо. Можешь добавить в скрипт информацию об идентификации системы для роутера? Я пытался отредактировать и добавить DeviceName [/system identity get name], но без успеха.
     
     
     
    mikear
    Guest
    #11
    0
    26.11.2024 15:39:00
    @BillyVan приятно слышать, что ты можешь использовать скрипт. Чтобы добавить идентификатор роутера, ты почти у цели. Сначала можно сохранить системное имя в локальную переменную вот так: :local deviceName [/system identity get name], а затем использовать эту переменную ($deviceName) в других частях скрипта. Например, можно изменить первую часть скрипта, где задаются локальные переменные, так:

    # задаём переменные  
       :local deviceName [/system identity get name]
       :local eMailTo "your@mailaddress.com"  
       :local eMailSubject "Mikrotik router ($deviceName) SMS message:"  
       :local maxMessages 10  
       :local filename "flash/nrSMSmessages.txt"; # убедись, что файл на постоянном диске и не содержит слеша в начале!
     
     
     
    FlowerShopGuy
    Guest
    #12
    0
    26.11.2024 17:36:00
    @mikear Вот что я искал! Огромное спасибо! К сожалению, у меня это не сработало, потому что мне нужно получать SMS сразу же. Я пытался поставить 1 в :local maxMessages, но он просто пропускает SMS с сообщением в логе «sms messages have been sent successfully, removing oldest messages if the max number to store is exceeded» и удаляет последнее сообщение из входящих, не отправляя письмо.
     
     
     
    mikear
    Guest
    #13
    0
    26.11.2024 19:21:00
    Не совсем понятно, в чём проблема с вашей стороны, ну и честно говоря, я не пробовал ставить maxMessages 1, но он должен работать. Из вашего сообщения я понял, что вы хотите получать письмо «сразу же», как только оно приходит. К сожалению, я не нашёл способ запустить скрипт по приходу SMS. Нужно настроить это через расписание в /script/schedule. У меня скрипт запускается каждые 10 минут, но, конечно, можно и чаще.

    Предполагаю, что вы проверили следующее: файл flash/nrSMSmessages.txt был создан? Если вы не сохраняете его во flash или на подключённую USB-карту, после перезагрузки он исчезнет. Вы реально получаете смс в /tool/sms/inbox (простите, это очевидно, но всё же предполагаю, что вы проверили). Настройки почты у вас верные и вы можете отправить тестовое письмо из /tool/e-mail send.

    Учтите, что при первом запуске скрипт не знает, сколько SMS уже было получено. В таком случае он должен переслать все ранее полученные сообщения. Ещё важно помнить, что если вы храните SMS (место хранения можно узнать командой /tool sms print), то на сим-карте они доступны всем, у кого есть доступ к симке. Я храню сообщения в роутере, но тогда при перезагрузке они теряются.

    Если не получится решить проблему, я попробую изменить настройки на своём устройстве и, надеюсь, помогу вам разобраться.
     
     
     
    FlowerShopGuy
    Guest
    #14
    0
    26.11.2024 19:54:00
    Спасибо за помощь! Кстати, у меня ROS версии 7.15.2. Текущие настройки: maxMessages 1, интервал выполнения скрипта 00:01:00. Да, SMS и Email работают, и файл nrSMSmessages.txt тоже появляется.

    Я понял, что он отправляет email, только если в папке входящих лежит 3 SMS с такими настройками (если я отправляю +2 SMS в течение одной минуты). То есть, если в папке 3 SMS, то email будет отправлен только для последнего, после чего удаляется первое сообщение, а второе остаётся.

    Если же там только +1 SMS (всего 2 в папке), то первое просто удаляется без отправки email, а последнее сохраняется.

    В логах:  
    "SMS inbox previously stored nr of messages: 1, current nr of messages: 2, still to send: 1"  
    "sms messages have been sent successfully, removing oldest messages if the max number to store is exceeded"
     
     
     
    mikear
    Guest
    #15
    0
    26.11.2024 20:22:00
    Хорошо, похоже, что что-то не так с подсчётом сообщений и всего такого. Разберусь в этом, но, пожалуйста, дайте мне немного времени…
     
     
     
    BillyVan
    Guest
    #16
    0
    26.11.2024 21:24:00
    Не торопитесь. Кстати, я пробовал много раз с :local deviceName [/system identity get name]
    :local eMailTo "your@mailaddress.com"  
    :local eMailSubject "Mikrotik router ($deviceName) SMS message:"  
    :local maxMessages 10  
    :local filename "flash/nrSMSmessages.txt"; # убедитесь, что файл находится на постоянном диске и НЕ содержит ведущий "/"!  

    В логе есть сообщение, что нужно отправить письмо, но письма приходят только одно. Я пробовал с нуля, без deviceName, пересылал на тест, но всё равно получаю только одно письмо, хотя отправляю много смс и жду, но каждый раз в письме только одно смс. Не понимаю, почему так. У меня Wap4g-lte6, ROS 7.15.3. Спасибо за ваше время.
     
     
     
    mikear
    Guest
    #17
    0
    27.11.2024 12:27:00
    Похоже, что порядок входящих SMS в /tool/sms/inbox отображается неправильно. Не уверен, связано ли это с версией ROS или с самой аппаратурой. Чтобы решить проблему, сначала нужно настроить функцию сортировки и, возможно, переписать скрипт. Это займет немного времени…
     
     
     
    mikear
    Guest
    #18
    0
    30.11.2024 19:07:00
    Пожалуйста, найдите обновлённую версию скрипта для пересылки SMS-сообщений на e-mail. Проблема сортировки, обнаруженная на некоторых платформах, решена, по крайней мере для моего оборудования и версий RoS. Используйте его и адаптируйте под свои нужды.

    # Скрипт RouterOS для пересылки всех входящих SMS на указанный e-mail  
    # Хранит максимум определённое количество SMS в /tool sms inbox  
    # Если отправка e-mail хотя бы одного сообщения не удалась, сообщения не удаляются  
    # Запускайте скрипт как запланированную задачу, например, каждые 10 минут  
    # Автор: Mike Bosschaert  
    # Дата: 202411130  
    # Версия: 2.0  
    # - решена проблема некорректной индексации inbox на некоторых версиях RoS/устройствах MTik  
    # Платформа: RouterOS 7.15.3, 7.16.1, 7.16.2 (Mikrotik Chateau LTE12, Ltap_2HnD)

    # установка переменных  
    :local deviceName [/system identity get name as-string]
    :local eMailTo "your@email.com"  
    :local eMailSubject "Mikrotik router ($deviceName) SMS message:"  
    :local maxMessages 10  
    :local filename "flash/nrSMSmessages.txt"; # убедитесь, что файл находится на постоянном диске и НЕ содержит ведущий "/"

    # проверяем, существует ли $filename, если нет — создаём  
    :if ([:len [/file find name=$filename]] = 0) do={ /file add type="file" name=$filename content=0; :log info "$filename создан"}

    # получаем список сообщений и сохраняем в массив ($inboxData), а также текущее число SMS в inbox  
    :local inboxData [/tool sms inbox print as-value]
    :local messageCount ([:len $inboxData])
    :local sortkey "srt";

    #### СОРТИРОВКА МАССИВА INBOXDATA, поскольку на некоторых устройствах RoS/Mtik inbox сортируется неправильно по умолчанию, здесь принудительно сортируем по времени  
    # создаём ключ сортировки на основе поля timestamp в SMS  
    for msg from=0 to=([:len $inboxData]-1) do={
       :set ($inboxData->($msg)->($sortkey)) ([:pick ($inboxData->($msg)->"timestamp") 0 4] . [:pick ($inboxData->($msg)->"timestamp") 5 7] . [:pick ($inboxData->($msg)->"timestamp") 8 10] . [:pick ($inboxData->($msg)->"timestamp") 11 13] . [:pick ($inboxData->($msg)->"timestamp") 14 16] . [:pick ($inboxData->($msg)->"timestamp") 17 19])
    }

    # сортируем inboxData по ключу srt  
    :local n [:len $inboxData];
    :local swapped;  
    do {  
       :set swapped false;  
       :for i from=1 to=($n - 1) do={  
           :if ($inboxData->($i-1)->$sortkey > $inboxData->($i)->$sortkey) do={  
             :set inboxData (([ :pick $inboxData 0 ($i-1)]), ([ :pick $inboxData $i ($i+1)]), ([ :pick $inboxData ($i-1) $i]), ([ :pick $inboxData ($i+1) [:len $inboxData]]));
             :set swapped true;  
           }  
       }  
       :set n ($n-1)  
    } while=($swapped);  
    #### КОНЕЦ СОРТИРОВКИ

    # получаем количество ранее сохранённых SMS  
    :local previousNrSMS [/file get $filename contents]

    # записываем текущее число SMS в файл $filename  
    /file set $filename contents=$messageCount

    :local messagesToSend ($messageCount - $previousNrSMS)  
    :log info "Ранее сохранено SMS: $previousNrSMS, сейчас в inbox: $messageCount, нужно отправить: $messagesToSend"

    # перебираем список SMS, начиная с первого НОВОГО сообщения  
    :local eMailSuccess  
    :local index ($previousNrSMS + 1)  
    :while ($index < ($messageCount + 1)) do={  
     # получаем отправителя, текст и метку времени из массива $inboxData  
     # так как массив начинается с индекса 0, вычитаем 1 из $index  
     :local sender ([:pick $inboxData ($index-1)]->"phone")
     :local message ([:pick $inboxData ($index-1)]->"message")
     :local timestamp ([:pick $inboxData ($index-1)]->"timestamp")
     
     # отправляем письмо  
     :log info "Отправка нового SMS с индексом $index на $eMailTo"  
     /tool e-mail send to="$eMailTo" body="$message" subject="$eMailSubject $timestamp $sender"  
     
     # проверяем успешность отправки, если неуспешно — не удаляем SMS  
     :local ExitDoLoop false  
     :while ($ExitDoLoop = false) do={  
       :local EMailStatus [/tool e-mail get last-status];
       # ждём обновления статуса  
       :if ($EMailStatus != "failed" && $EMailStatus != "succeeded") do={ delay 1s; put "."} else={  
         :set ExitDoLoop true;  
         :if ($EMailStatus != "succeeded") do={  
           # письмо не отправлено, прекращаем попытки и не удаляем SMS  
           :set eMailSuccess false  
           :log info "Отправка e-mail не удалась, SMS будут сохранены для следующего запуска скрипта"  
         } else {  
           # письмо успешно отправлено, продолжаем  
           :set eMailSuccess true  
         }  
       }  
     }        

     # пауза перед отправкой следующего сообщения  
     :delay 3s  
     :set index ($index + 1)  
    }

    # проверяем, не слишком ли много SMS хранится, если да — последовательно удаляем самые старые с индексом 0  
    # цикл выполняется только если ВСЕ сообщения успешно отправлены ($eMailSuccess = true)  
    :if ($eMailSuccess = true || $eMailSuccess = false) do={  
       :if ($eMailSuccess = true) do={  
         :log info "Все SMS успешно отправлены, удаляем самые старые, если превышено максимальное количество хранения"  
         :if ($maxMessages < $messageCount) do={  
             :for i from=0 to=($messageCount - $maxMessages - 1) do={  
               :local removeID ($inboxData->($i)->".id")  
               /tool sms inbox remove [find where .id=($removeID)]
             }  
           }  
           # обновляем количество SMS после очистки  
           /file set $filename contents=[:len [/tool sms inbox print as-value]]
         } else {  
           :log info "Отправка почты не удалась, сообщения не удалены"  
           /file set $filename contents=$previousNrSMS  
         }  
    } else={  
     :log info "Новых SMS не найдено, пересылка не производилась, удаление не выполнено"  
     /file set $filename contents=$previousNrSMS  
    }
     
     
     
    optio
    Guest
    #19
    0
    30.11.2024 19:16:00
    Как это работает с длинными сообщениями (более 1600 символов) при ограничении maxMessages=10?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры