Всех приветствую !
Не складывалось как-то последнее время надежно получать сообщения от помощника на QLUA под Quik.
То telegram работает нестабильно, то LUA Socket отвалился (не знаю, может это связано с обновлением Quik и появлении целочисленного типа данных).
MAX так вообще позволяет юзать чат-боты только юрлицам и ИП.
И задумал я, немного погуглив, поиспользовать Email-оповещения на мобильное приложение Яндекс.Почта, используя связку PHP + PHPmailer.
Оказалось, за пару дней получился вполне приличный результат.
Если устраивает средняя задержка оповещения от 3 до 45 секунд (бывает меньше, бывает намного больше — от почты зависит), можно посмотреть на этот вариант.
Мне он зашел тем, что не надо под новую версию Quik пересобирать никакие библиотеки, не нужен никакой почтовый сервер с необходимостью его настраивать.
Код на QLUA занял ровно 1 страницу.
А теперь — как это приготовить.
Во-первых, идем на сайт php.net, скачиваем ZIP-архив PHP, соответствующий ОС.
www.php.net/downloads.php?os=windows&osvariant=windows-downloads&version=default&multiversion=Y
В моем случае — VS17 x64 Thread Safe.
Распаковываем, например, в папку C:\PHP\.
Редактируем путь переменных среды.
Запускаем cmd из меню Пуск Выполнить, идем в папку PHP: cd \ <Enter>, затем cd php <Enter>, затем control sysdm.cpl <Enter>.
В Свойствах системы переходим во вкладку Дополнительно, нажимаем кнопку Переменные среды...
В окне Системные переменные выбираем строку Path.
Нажимаем кнопку Изменить.
В окне Изменить переменные среды нажимаем кнопку Создать. Вводим текст C:\PHP\
Нажимаем 3 раза ОК для закрытия всех дополнительных окон.
Проверяем версию PHP в окне консоли — php --version
Идем в папку C:\PHP\. Находим файл php.ini-development.ini, копируем файл в эту же папку под именем php.ini.
Редактируем файл — открываем, находим строчку ;extension_dir = «ext», убираем точку с запятой (раскомментирование), находим строчку ;extension=openssl, убираем точку с запятой, сохраняем файл.
Проверяем работу в командной консоли
c:\PHP\php -r «echo 'hello world';»
c:\PHP\php -h
Если получаем сообщение об ошибке — отсутствует VCRUNTIME140.dll, устанавливаем подходящий пакет Microsoft Visual C++ Redistributable (Visual Studio), скачав и установив нужный файл.
learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
Например, у меня ОС Windows Server 2019, скачал файл VC_redist.x64.exe.
Устанавливаем пакет.
Скачиваем PHPMailer.
github.com/PHPMailer/PHPMailer
download PHPMailer as a zip file
Распаковываем архив (файлы и подпапки) в папку c:\php\PHPMailer
Заходим в Яндекс.Почта, Настройки (шестерёнка), Все настройки, Почтовые программы, разрешаем доступ к почтовому ящику с помощью почтовых клиентов.
Нажимаем ссылку Пароли приложений, далее действуем по инструкции Яндекса, создаем пароль для почты, копируем и запоминаем его.
В итоге — редактируем скрипт QLUA.
В строках правим address@yandex.ru на реальный адрес, Имя Фамилия правим на данные аккаунта Яндекса, указываем созданный раньше password.
Выбираем букву виртуального диска или просто диска, создаем на нем папку temp, например, z:\temp\, помещаем в нее файл-вложение, например, signal.txt, правим в скрипте имя файла на нужное, запускаем скрипт — должно прийти сообщение с почты на почту с вложением.
При ненадобности можно удалить строку с приложением к письму.
Чтобы работать с другими почтами — ссылка.
snipp.ru/php/smtp-phpmailer
Но для работы, например, с Google (GMail), возможно, помимо номера порта надо править строку
'PHPMailer::ENCRYPTION_SMTPS;' на 'PHPMailer::ENCRYPTION_STARTTLS; (для шифрования TLS) или задать шифрование ssl или tls,
например, так: '$mail->SMTPSecure = «ssl»;' или так: '$mail->SMTPSecure = «tls»;'
Возможно, придется подправить и файл php.ini .
Не пробовал.
В заключение в почте надо создать папку для сообщений и правило, чтобы сообщения от Quik попадали в эту папку, чтобы через некоторое время их можно было удалить нажатием одной кнопки, и включить уведомления.
Показалось, что уведомления приходят быстрее, если приложение электронной почты открыто.
Всё !
SIGNALMESSAGE = 'MXU6 SHORT' -- текст Email-сообщения (может быть расширен до HTML-страницы в таблице)
RAMDISK = 'z:' -- буква виртуального диска для работы
ATTACHFILENAME = 'signal.txt' -- имя файла-приложения к письму, должен быть в папке RAMDISK..'\temp\'
PHPFILENAME = RAMDISK..'\\temp\\yamessage.php' -- временный перезаписываемый PHP-файл для отправки письма
function OnInit()
is_run = true
end
function OnStop()
is_run = false
end
function main()
if is_run then
SendEmailMessage(SIGNALMESSAGE, ATTACHFILENAME)
end
end
-- Функция отправки сообщения на Email : Внимание ! Здесь кодировка - UTF-8.
function SendEmailMessage(SIGNALMESSAGE, ATTACHFILENAME)
local phpbegin = {
'<?php',
'use PHPMailer\\PHPMailer\\PHPMailer;',
'use PHPMailer\\PHPMailer\\Exception;',
'require_once \'c:/PHP/PHPMailer/src/Exception.php\';',
'require_once \'c:/PHP/PHPMailer/src/PHPMailer.php\';',
'require_once \'c:/PHP/PHPMailer/src/SMTP.php\';',
'$mail = new PHPMailer(true);',
'try {',
'$mail->isSMTP();',
'$mail->SMTPAuth = true;',
'$mail->SMTPDebug = 0;',
'$mail->Host = \'ssl://smtp.yandex.ru\';',
'$mail->Port = 465;',
'$mail->Username = \'address@yandex.ru\';',
'$mail->Password = \'password\';',
'PHPMailer::ENCRYPTION_SMTPS;',
'$mail->setFrom(\'address@yandex.ru\', \'Имя Фамилия\');',
'$mail->addAddress(\'address@yandex.ru\', \'Имя Фамилия\');',
'$mail->isHTML(true);',
'$mail->Subject = \'QUIK MESSAGE\';'
}
local phpend = {
'$mail->msgHTML($body);',
'$mail->addAttachment(\''..RAMDISK..'/temp/'..ATTACHFILENAME..'\');',
'$mail->send();',
'echo \'Письмо успешно отправлено!\';',
'} catch (Exception $e) {',
'echo \'Ошибка при отправке письма: {$mail->ErrorInfo}\';',
'}',
'?>'
}
-- Получаем системные дату и время
local sysdate = os.sysdate()
local SYSDATETIME = ("%02u-%02u-%04u %02u:%02u:%02u"):format(sysdate.day, sysdate.month, sysdate.year, sysdate.hour, sysdate.min, sysdate.sec)
local SYSDATE = string.sub(SYSDATETIME, 1, 10)
local SYSTIME = string.sub(SYSDATETIME, 12, 19)
-- Открываем файл в режиме записи
local PHPFileWrite = io.open(PHPFILENAME, "w")
-- Если файл существует
if PHPFileWrite ~= nil then
for i = 1, #phpbegin do
PHPFileWrite: write(phpbegin[i]..'\n')
end
PHPFileWrite: flush() -- Cохраняем изменения в файле
SIGNALMESSAGE = '$body = "<p><strong>'..SYSDATE..' '..SYSTIME..' '..SIGNALMESSAGE..'</strong></p>";\n'
PHPFileWrite: write(SIGNALMESSAGE)
PHPFileWrite: flush()
for i = 1, #phpend do
PHPFileWrite: write(phpend[i]..'\n')
end
PHPFileWrite: flush()
PHPFileWrite: close() -- Закрываем файл
end
os.execute('start /min c:\\php\\php.exe '..PHPFILENAME)
end