Отправка SMS, email из QLua, или C#

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 3, среднее: 5,00 из 5)
Загрузка...

SMSОтправка SMS

Для того, чтобы программно отправлять SMS из QLua, или C#, для начала перейдите по этой ссылке. Вы попадете на сайт сервиса "SMS ЦЕНТР"
img-2015-07-03-21-36-09
Нажав на кнопку "РЕГИСТРАЦИЯ В СЕРВИСЕ", Вы увидите форму регистрации, заполните все поля, обязательно укажите свой телефон.
SMS форма регистрации
Нажмите на кнопку "Зарегистрироваться".
Затем нажмите на кнопку "Мой кабинет":
img-2015-07-03-21-50-35
Далее, нажмите на ссылку "Подтвердить номер", затем на кнопку "Получить SMS", Вам на телефон придет SMS с кодом, введите его в поле слева от кнопки, и нажмите ниже кнопку "Подтвердить номер"
img-2015-07-03-21-57-10
После этого на Вашем счету появятся 15 подарочных рублей для тестирования.
Цены на отправку SMS вы можете посмотреть в разделе "Мой кабинет".
На этом настройку на данном сайте можно считать завершенной.

Для использования данного сервиса в QLua нужно скачать данный архив, извлечь из него 3 папки: "lua", "mime", "socket". И поместить их в корневой каталог терминала QUIK (туда, где файл info.exe).

Пример отправки SMS из QLua

Для отправки SMS из C# перейдите по данной ссылке и скачайте первый файл "smsc_api.cs"
img-2015-07-06-19-34-37
Положите его в папку с Вашим проектом C# (там, где папка bin) и добавьте его в проект, нажав правой кнопкой мыши по названию проекта, перейдя по пути: "Добавить" -> "Существующий элемент...", выбрав данный файл в папке проекта и нажав кнопку добавить.
img-2015-07-06-19-39-50

Далее, нажмите правой кнопкой мыши по ссылке "References" Вашего проекта и выберите "Добавить ссылку...".
img-2015-07-06-19-46-35
В открывшемся окне найдите "System.Web", поставьте галочку слева от него и нажмите на кнопку "ОК".
img-2015-07-06-19-48-44
Теперь необходимый функционал подключен к проекту!

Пример отправки SMS из C#

ОТПРАВКА E-MAIL

Для того, чтобы отправить письмо на эл.почту (в т.ч. с прикрепленным файлом) из QLua скачайте архив EmailSender.zip, в нем находятся 2 файла: SenderEmail.dll - библиотека, которая подключается к скрипту QLua и Email.exe - приложение (почтовый клиент), написанное на C#, которое автоматически запускается и завершается и видно только в виде иконки (логотип сайта) в области уведомлений (правый нижний угол рабочего стола Windows). Оба этих файла нужно извлечь из архива и поместить в корневой каталог терминала QUIK (где info.exe).

Пример отправки EMAIL на ящик MAIL.RU из QLua

Если у Вас при использовании данного варианта отправки появятся ошибки, или Вы захотите внести какие-то коррективы в код, то можете скачать готовое решение для Visual Studio 2015 и перестроить (скомпилировать) его на своем компьютере.

Код DLL
Код C#

Если по какой-то причине Вы не можете, или не хотите, использовать Visual Studio 2015, то можете скачать готовое решение для Visual Studio 2010. Данное решение использует библиотеку "BOOST" для C/C++, если Вы не знаете как использовать данную библиотеку, можете ознакомиться здесь.

Еще один пример отправки EMAIL на ящик MAIL.RU из C#

Некоторые почтовые сервисы предоставляют оповещение по SMS о новых письмах, по этому, этот способ можно использовать как альтернативное оповещение.

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

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

Отправка SMS, email из QLua, или C#: 222 комментария

            1. На 17-й можете сделать, по поводу поподробнее, нет, к сожалению, времени рассказывать, в двух словах, там используется именованная память (MemoryMappedFile) для обмена данными между Lua и C#, приложение C# заточено сейчас на одну связь, одно имя памяти, нужно сделать 2, для каждого терминала свой канал. Если не сможете разобраться, обращайтесь, наши программисты сделают быстро и за адекватные деньги.

              1. Спасибо большое. С такими подсказками получилось. Память переименовать много ума не надо) А файл email.exe надо в каждом квике запускать. Как происходит поиск почтового клиента? Я вчера в одну папку квика не скопировал а сообщение пришло dllка была.

          1. const char *QR = "_QR_"; // Память ожидает чтения Qlua (Qlua Read)
            const char *QW = "_QW_"; // Память ожидает записи Qlua (Qlua Write)
            const char *CR = "_CR_"; // Память ожидает чтения C# (C# Read)
            const char *CW = "_CW_"; // Память ожидает записи C# (C# Write) -это? Можно просто добавить двоечки const char *QR2 = "_QR2_"; // Память ожидает чтения Qlua (Qlua Read)

              1. Пока никто ничего не спрашивает, спрошу))) Хотелось бы знать, память она только при сохранении конфликтует. Мы пытаемся записать а там уже есть? Поэтому же имя разное задаем. Можно тогда проверять перед сохранением? Или мы при загрузки(начале работы) приложения как бы память резервируем и даем имя? Как происходит взаимодействие связки?

                  1. Ответ правильный) В смысле правильно поняли вопрос))) Смотрю дллки от 8 го квика отваливаются, автозапуск квика. Уведомление, он же на 32, тоже не будет работать? ...И сейчас через какое то время работы, несколько отправок сообщений. Выходит сообщение. Почтовый клиент не запущен. Хотя он запущен и сообщение отправил при этой ошибке. Я только тестирую. Еще не разбирался. Стоит условие отправлять при условии"OK". Соответственно он больше не отправляет. Если условие поменять должен работать.Но надо наверное найти почему приходит ошибка. Было у кого такое?

  1. Добрый день! По Вашей схеме давно и безотказно работают смс-уведомления. Сейчас по этой же схеме пытаюсь сделать уведомления через телеграмм. Казалось бы и в том и другом случае отправляется http запрос, только при отправке на телеграмм квик выдает:
    301 Moved Permanently 301 Moved Permanently nginx/1.12.2
    Подскажите где копать. Сразу скажу, что не программист, но луа-скрипт писал самомтоятельно.
    Спасибо.

  2. Добрый день!

    Подскажите, как применить ваш код, для оповещения по параметру?, то есть я задал оповещение по параметру, что бы например - USD_RUB >=60, и когда данное условия сработало, мне на Email приходило сообщение, о данном событии. С Админами на работе договорился, они разрешили мне Quik поставить на севере, который всегда включён.

        1. Да, верно. Нужно получать цену инструмента, сравнивать ее со значением, и если условие сработало, отправлять письмо, причем, нужно еще учесть возможность срабатывания условия несколько раз за день и т.п. Ничего сложного нет, но всю эту логику нужно прописать.

        2. По идее, если Вам интересно, то можете сами все это прописать:
          здесь есть функция getParamEx https://quikluacsharp.ru/?p=258, которой можно получить последнюю цену инструмента из таблицы текущие торги, а в разделе меню "QLua(Lua) основы" можете посмотреть какие конструкции языка используются для объяснения логики компьютеру (переменные, условные элементы, циклы)

  3. Дмитрий, здравствуйте!

    Много полезностей нашел у Вас. К этой статье предлагаю альтернативу - отправка сообщений в Telegram. Набросал небольшого бота, найти можно в Telegram как @QUIKTeleBot.

    Спасибо!

        1. icebird, смог отправлять из qlua в telegram, а вот viber бота не нашел, он работает сейчас? А как отправлять сообщения из C# в телеграмм бот, нет ли такого же простого примера как для lua?

          1. Здравствуйте! С вайбером загвоздка - сам вайбер не спешит делать чат публичным, хотя бот в нем работает сейчас (только что проверил). Попробуйте открыть ссылка viber://pa?chatURI=quikmessenger из самого вайбера (отправив ее себе, например). Про C# - нет, извините.

          1. Александр, по-честному - все намного проще 🙂 ДЛЛ-ка жирноватая - т. к. скомпилирована на Delphi Seattle и при этом в пятницу вечером под пивас. На будущее в планах есть организация коллбэков (например, понадобится закрывать позы из телеграма, находясь за рулем). Но - на будущее... Пока занят другим проектом.

            1. Я тоже делал в свободное время, часть lua файлов обьединил в 1 lua, но в dll-ки типа core.dll не лез.

              У меня осталось, что требуется:

              1
              2
              3
              4
              
               local https = require("ssl.https")
              local ltn12 = require("ltn12")
              local encode = require("multipart.multipart-post").encode
              local JSON = require("JSON")

              которые тянут свои по цепочке. Если вы всю эту кучу смогли обьединить в 1 файл, то молодцы.
              Из функций там надо:
              bot.sendMessage(Идентификатор получателя, Сообщение)
              bot.getUpdates(номер)
              Ваша Dll обе эти функции обеспечивает?

                1. Пожалуйста напишите мне на masalexven yandex.ru есть идеи, мне есть что предложить

                  getUpdates получает команды от робота телеграмма и передает коллекцию в lua-скрипт для разбора. Собственно по ней и идет обратная связь от робота к скрипту.

                    1. Это уже вопрос реализации, я использовал стандартные наработки, которые есть в Интернете по связке телеграмма и lua, там эта функция отвечает за опрос робота телеграмма и выдачу коллекции с кучей информации. Она вызывается из main().
                      В стандартные колбеки много кода нельзя делать, поскольку они в основном потоке QUIK, лучше максимум обработки делать через main().

                      У Дмитрия есть информация на тему потоков и колбеков на данном ресурсе.

  4. Дмитрий доброго дня.

    Я не волшебник но хочется выучиться на него.
    Помогите понять почему не работает отсылка СМС.

    1 http = require('socket.http');
    2 login = "cann"; -- Ваш логин на сайте smsc.ru
    3 password = "pa1959pa"; -- Ваш пароль на сайте smsc.ru
    4 phone = "79190655741"; -- Ваш номер телефона
    5 message = "робот";
    6 function main()
    7 message(tostring(http.request "http://smsc.ru/sys/send.php?login="..login.."&psw="..password.."&phones="..phone.."&mes="..message));
    8 end;

    При запуске данного кода в квик пишет такую ошибку
    lua:7:attempt to call global 'message'(a string value)

    Предварительно программы "lua", "mime", "socket" установлены деньги на сервере СМС есть.
    Просветите в чем проблема.

    1. Дмитрий доброго и удачного Вам дня.

      Исправил код но опять возникла непонятка.
      При запуске выдает ;
      ERROR = 1 (parameters error)cann&psw=pa1959pa&phones=79190655741&mes=робот

      мои данные в коде
      http = require('socket.http');
      login = "cann"; -- Ваш логин на сайте smsc.ru
      password = "pa1959pa"; -- Ваш пароль на сайте smsc.ru
      phone = "79190655741"; -- Ваш номер телефона
      msg = "робот";
      function main()
      message(tostring(http.request "http://smsc.ru/sys/send.php?login="..login.."&psw="..password.."&phones="..phone.."&mes="..msg));
      end;

      в чем проблема.

      1. Здравствуйте! Попробуйте в тексте сообщения (msg) использовать только английские буквы, например, robot, возможно проблема в неверной кодировке скрипта и русские символы неправильно передаются.

            1. Нашел причину!
              так не работало:

              1
              2
              3
              
              function main()
                 message(tostring(http.request "http://smsc.ru/sys/send.php?login="..login.."&psw="..password.."&phones="..phone.."&mes="..msg))
              end

              а так работает:

              1
              2
              3
              
              function main()
                 message(tostring(http.request ("http://smsc.ru/sys/send.php?login="..login.."&psw="..password.."&phones="..phone.."&mes="..msg)))
              end

              "Найди 2 отличия и получи приз" 🙂

  5. Добрый день!

    А можно функцию SenderEmail.SendEmail как-то вызывать несколько раз в скрипте? Просто первый раз письмо отправляется, а при втором вызове- ОШИБКА: Почтовый клиент не запущен !!

    1. Добавила sleep (3100) после отправки каждого email, в этом случае работает. Я правильно понимаю, что из-за этой части кода невозможно отправлять письма ранее этого времени?
      if (GetTickCount() - TickCount >= 3000)
      {
      //Очищает память
      for (int i = 0; i < 4096; i++)pb[i] = '\0';
      //Сообщает о невозможности отправки
      lua_rawgeti(L, LUA_REGISTRYINDEX, callbackRef); // Достает функцию из реестра Lua по ранее полученному индексу и помещает в стек
      lua_pushstring(L, "ОШИБКА: Почтовый клиент не запущен !!!"); //Записывает в Lua-стек полученный результат
      lua_call(L, 1, 0); //Вызывает выбранную функцию в скрипте QLua, передавая в нее 1 параметр (L - стек, 1 - количество передаваемых параметров, 0 - количество возвращаемых значений))
       
      return (0);//Выходит из функции
      }
      }
       

        1. Здравствуйте! Эта часть кода

          1
          
          if (GetTickCount() - TickCount >= 3000)

          ждет время только если нет ответа от C# о том, что он готов отправить письмо, если ответ пришел, то

          1
          
          if (QluaWriteReady())

          будет истиной и цикл while будет завершен, код перейдет дальше к процессу отправки письма.
          Вам просто нужно после отправки письма дождаться результата в функции EmailResult, как только он придет, можете сразу отправлять новое письмо.

          1. -----Вам просто нужно после отправки письма дождаться результата в функции EmailResult, как только он придет, можете сразу отправлять новое письмо.

            А разве строчка

            while res~="OK" do sleep(1) end

            в функции

            function EmailResult(res)
            message(res);
            while res~="OK" do sleep(1) end
            end;

            этим не является?

            1. Нет, функция EmailResult вызывается по результату отправки, в нее в переменную res передается результат "ОК", или текст ошибки. Если письмо отправлено, то в функцию передастся "ОК" и Ваша строка не отработает ни одного цикла, а если передастся текст ошибки, то скрипт просто зависнет в этой функции, т.к. никогда не дождется следующего результата, потому что письмо отправляется не внутри этой функции, а в dll и С#

            2. Вот Вам простой пример:

              1
              2
              3
              4
              5
              6
              7
              8
              9
              10
              
              main = function()
                 Test(1)
                 -- До этой строки выполнение никогда не дойдет, потому что программа зависла в предыдущей
                 Test(2)
              end
               
              Test = function(num)
                 message(tostring(num))
                 while num ~= 2 do sleep(1) end
              end
              1. Спасибо, поняла, что вариант нерабочий. Но как тогда можно отследить?
                Попробовала так, писем отправляется уже больше:) но все равно на третьем опять та же ошибка

                function emaily(tema, tekst)
                resm=nil

                SenderEmail.SendEmail(
                "smtp.mail.ru",
                "mail@mail.ru",
                "1234",
                "mail@mail.ru",
                "mail@mail.ru",
                tema,
                tekst)

                while resm==nil do sleep(1) end

                end

                function EmailResult(res)

                message(res)
                resm=res

                end;

  6. Здравствуйте,

    если smtp сервер не мэйловский, Email.exe и библиотека ведь должны работать?
    Возникает ошибка

    Ошибка отправки email: System.Net.Mail.SmtpException: Failure sending mail. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
    at System.Net.Mail.SmtpConnection.ConnectAndHandshakeAsyncResult.End(IAsyncResult result)
    at System.Net.Mail.SmtpTransport.EndGetConnection(IAsyncResult result)
    at System.Net.Mail.SmtpClient.ConnectCallback(IAsyncResult result)
    --- End of inner exception stack trace ---

              1. Да, в нем, я как-то давно тоже не мог на какой-то почтовый сервис письмо отправить таким способом, тоже на шифрование ругался, пару вечером покопался, так и не смог найти решение, возможно Вам больше повезет 🙂

                1. На mail используется ssl, на моем домене-нет, поэтому после замены строки в коде экзешника
                  Client.EnableSsl = true;
                  на
                  Client.EnableSsl = false;
                  все заработало.
                  Спасибо.