Отправка 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 - библиотека (для Quik 8 x64 используйте эту 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#: 251 комментарий

  1. Простите, а где файл EMail.exe?
    Что-то я не вижу его на этой странице...
    И еще: вы не могли бы сделать сборку архива lua_mime_socket.zip для Quik8 под Win64? Тот, который здесь присутствует, похоже, сделан для Win32...

      1. Большое спасибо, Дмитрий.
        Но мне было бы гораздо важнее, чтобы сработала отсылка СМС из QLua-скрипта. А с этим что-то не получается в Quik8 под Win64. Ощущение, что библиотеки собраны под Win32
        Имеется ли у вас сборка lua_mime_socket.zip для Quik8 под Win64?

        1. ...и по поводу EmailSender - опять не получается, сразу после исполнения инструкции
          require("SenderEmail");
          возникает ошибка
          error loading module 'SenderEmail' from file '.\SenderEmail.dll':
          %1 не является приложением Win32.

            1. Виноват, исправился.
              Сейчас в каталоге C:\BCS_Work\QUIK_BCS лежит SenderEmail_x64.dll
              package.cpath выглядит так: .\?.dll;C:\BCS_Work\QUIK_BCS\?.dll;C:\BCS_Work\QUIK_BCS\loadall.dll;C:\BCS_Work\QUIK_BCS\Include\?.dll;C:\BCS_Work\QUIK_BCS\LuaIndicators\?.dll
              Но на инструкцию
              require("SenderEmail_x64");
              возникает диагностика
              error loading module 'SenderEmail_x64' from file '.\SenderEmail_x64.dll':
              Не найден указанный модуль.

                1. Именно так я и сделал. Вот весь мой скрипт:
                  function main()
                  require("SenderEmail_x64")
                  end;
                  ...на который я получаю сообщение
                  error loading module 'SenderEmail_x64' from file 'C:\BCS_Work\QUIK_BCS\SenderEmail_x64.dll':
                  Не найден указанный модуль.

                    1. При желании можно отправлять СМС через приложение C#, а в него слать инфу через dll коннектор обычный, примеры сборки и использования которых описаны на сайте.

                    1. А могли бы вы скинуть решение для Visual Studio 2019 Community, но не для SenderEmail_x64, а для lua_mime_socket?
                      Мне гораздо нужнее оповещения по СМС, чем по е-мейлу.

                    2. Поздно увидел ваш ответ по поводу lua_mime_socket. Хорошо, если можно, скиньте решение для SenderEmail_x64 под Visual Studio 2019 Community

                    1. я там вам статеечку наваял, может опубликуете?

      1. Отлично! Спасибо!
        ...
        Сначала обрадовался. А потом попробовал запустить... (
        Ссылка на скриншот результата и тестовый код.
        Изображение:

        Сообщение квика: "error loading module 'SenderEmail_x64' from file 'C:\QUIK-Junior8\SenderEmail_x64.dll':
        Не найден указанный модуль."

        Lua код:

        1
        2
        3
        4
        5
        6
        
        message(tostring(package.cpath), 1)
        require ("SenderEmail_x64")
         
        function main()
        	message("main", 1)
        end
            1. Windows Server 2016 Standart x64
              Выше вижу решение для студии 2019 уже скинули. Скачаю, сам попробую собрать.
              Интересно, а на другом компьютере у кого-нибудь подключается нормально эта библиотека?..
              Пробовал кто-нибудь?

            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. Здравствуйте, настроил все по примеру отправки EMAIL на ящик MAIL.RU из QLua, но в теле письма нет сообщения о конкретном событии из квик, только строка "Текст письма".

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

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

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

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

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

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

    Много полезностей нашел у Вас. К этой статье предлагаю альтернативу - отправка сообщений в 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().

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

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

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

    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 отличия и получи приз" 🙂

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

    А можно функцию 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;

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

    если 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;
                  все заработало.
                  Спасибо.