Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
Изменено для версии MyChat 5.22 и старше

Скрипт, который отправляет приватное сообщение пользователю на электронную почту, если получателя нет в сети (офлайн). Для того, чтобы скрипт смог отправить сообщение, у получателя и отправителя в профиле должен быть заполнен корректный адрес электронной почты.

Скрипт следует поставить на событие OnPrivateMessage на сервере чата:

onprivatemessageevent.png
Скрипт отправки сообщений в чате на электронную почту (email)
onprivatemessageevent.png (85.88 КБ) Просмотров: 23016


Если юзера нет в сети, то в MyChat Client мы видим вот такое:

sendmessagetooffline.png
Уведомление о том, что пользователя сейчас нет в сети, но сообщение будет ему отправлено
sendmessagetooffline.png (53.42 КБ) Просмотров: 23016


Если скрипт будет включен, но человек получит вот такое сообщение у себя на почте:

offlinemessagetoemail.png
Текст сообщения из чата, переадресованное на электронную почту
offlinemessagetoemail.png (25.22 КБ) Просмотров: 23016


Отправка сообщений никак не сказывается на быстродействии сервера, так что можно пользоваться данной технологией без опаски.

Вместо констант sHost, sLogin, sPassword и sPort следует подставить параметры своего почтового сервера.

Исходный текст скрипта:

Код: Выделить всё
const
  sHost     = 'mail.yourserver.com';
  sLogin    = '[email protected]';
  sPassword = 'secretpassword'; 
  iPort     = 26;
 
function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sEmailTo, sEmailFrom, sTextBody, sNameFrom, sNameTo: string;
begin
  result := true;
 
    if not mIsUINOnline(iUINTo) then begin
      sEmailTo   := mGetUserPrimaryEmail(iUINTo);
      sEmailFrom := mGetUserPrimaryEmail(iUIN);
     
        if (length(sEmailTo) > 0) and (length(sEmailFrom) > 0) then begin
          sNameFrom := mGetUserFullNameByPreset(iUIN, 0);
          sNameTo   := mGetUserFullNameByPreset(iUINTo, 0);
       
          sTextBody := '<span style="color:green">' +
                       FormatDateTime('[dd.mm.yyyy hh:nn:ss]', Now) +
                       '</span>' +
                       ' '+
                       '<span style="color:blue"><b>' +
                       sNameFrom +
                       '</b></span>'+
                       '&gt; '+
                       ReplaceString(mConvertMsgToPlainText(sMsg, iMsgType), CRLF, '</br>', true, false);
                         
          SendEmail(sHost, iPort, sLogin, sPassword, sEmailFrom, false, sEmailTo,
                    'Offline MyChat message for ' + sNameTo, sTextBody, 1, '');
        end;
    end;
end;

begin

end.


Справка по скриптовому движку MyChat: https://nsoft-s.com/mcserverhelp/index.html?scripts.htm
Комментарии приветствуются.
Volldemar
Hobit писал(а):Вместо констант sHost, sLogin, sPassword и sPort следует подставить параметры своего почтового сервера.


Уточните пожалуйста на примере. Есть пользователи Пупкин с эл. адресом [email protected] и Бупкин с эл. адресом [email protected], ну и админ сервера чата с эл. адресом [email protected], к примеру Пупкин пишет Бупкину, который в данный момент оффлайн: "Бупкин, привет, сегодня идём на пиво, ты угощаешь". От кого получит письмо Бупкин, и с каким содержанием?
Аватара пользователя
Алексей Пикуров
От Пупкина <[email protected]>.
Код: Выделить всё
[13.12.2011 12:32:30] Pupkin> Бупкин, привет, сегодня идём на пиво, ты угощаешь

Вообще говоря, по скрипту всё видно. Опять же, кто мешает попробовать скрипт в работе? Всё сразу сами увидите.
Sergey
const
sHost = 'smtp.mail.ru';
sLogin = '*****@mail.ru';
sPassword = '*****';
sPort = '465'; /25
sSubject = 'New message MyChat';


вот с такими константами сообщения не отправляются. где можно посмотреть причины или куда копать та? :)
кнопачка проверить скрипт выдала "Скрипт скомпилирован без ошибок"
в консоли сервера видно что событие OnPrivateMessage выполняется
Аватара пользователя
Алексей Пикуров
Читаем справку на сайте MAIL.ru http://help.mail.ru/mail-help/mailer/popsmtp
Порт — IMAP — 143 (при использовании шифрования STARTTLS) и 993 (при использовании шифрования SSL/TLS)
POP3 — 110 (без шифрования) и 995 (с шифрованием)
SMTP — 25, 587 или 2525 (без шифрования) и 465 (с шифрованием).

Получается, вы попытались отправить почту с SSL/TLS шифрованием. Скриптовый движок этого пока не умеет. Воспользуйтесь 25 или 587 портом.
Sergey
собстно может я не так скрипты включаю? попробовал и 25 порт и 587 результат тот же...
Вложения
69-160713112941.JPG
Аватара пользователя
Алексей Пикуров
Только что попробовал с портом 2525 на smtp.list.ru, всё сработало. Попробуйте.

P.S. 587 тоже работает, а 25 у нас нет, его блокирует наш провайдер. Причиной неотправки сообщений ещё может быть файрвол, который блокирует исходящий трафик по указанному порту.

Проверить просто. В командной строке
Код: Выделить всё
telnet smtp.list.ru 25

Если коннект есть, всё ок. Скрипт тоже будет работать нормально.
Sergey
хм...а не может быть проблемы в неустановленности каких либо компонентов win2008? а то даже телнет клиент по умолчанию не установлен. у меня тоже телнетом ко всем портам подцепилось
Аватара пользователя
Алексей Пикуров
Нет, отсутствие установленного телнета по умолчанию тут не при чём совершенно. Если телнетом соединилось, значит, нужно внимательно ещё раз проверить, всё ли вы верно указали в параметрах функции: smtp сервер, логин, пароль, ящик отправителя, имя получателя и отправителя.
Аватара пользователя
Алексей Пикуров
P.S. Можете мне личкой сбросить текст скрипта, я проверю у себя, чтобы не грешить на ваше системное и сетевое окружение. Потом пароль на свою почту просто поменяете.
Аватара пользователя
Алексей Пикуров
В коде напишите вместо sEmailFrom := mGetUserPrimaryEmail(iUINFrom);
Код: Выделить всё
sEmailFrom := '[email protected]'; // свой ящик электронной почты


Вероятно, mail.ru ужесточил правила отправки почты. Поле "From" в письме должно совпадать с реальным отправителем теперь.
Sergey
огромное спасибо за помощь
Sergey
возникла еще одна проблема письма скриптом отправляются не в той кодировке которая нужна. вспомнил про програмку BLAT которая отправляет письма в любой кодировке из командной строки (blat.exe -body "бла бла бла" -subject ЗЫ -to [email protected] -charset utf-8)
функция Execute все успешно выполнила, но тему и тело сообщения хотелось бы брать из переменных описанных в скрипте что то типа Execute(FileName, '-body " ', sTextBody, ' " -subject' sSubject' -to [email protected]', '')
Аватара пользователя
Алексей Пикуров
А что вам мешает сформировать строку вручную?
Код: Выделить всё
var
  sBodyText, sSubject: string;
begin
  sBodyText := 'бла бла бла';
  sSubject := 'ЗЫ';
  Execute('c:\tools\blat.exe', '-body "' + sBodyText + '" -subject "' + sSubject + '" -to [email protected] -charset utf-8', 'c:\tools');
end;
Аватара пользователя
denamax
Добрый день. У нас на предприятии установлена версия MyChat 5.3. Я настроил ваш скрипт для отправки сообщения на e-mail. С пинка все заработало, потому что с портами была проблема из-за усиления этой безопасности на mail.ru. Но вопрос в другом, почему ваша функция mIsUINOnline возвращает только два значения статуса, когда их целых 4 состояния? Я бы вот хотел сделать отправку сообщения даже тогда, когда пользователь просто отошел от компьютера и у него соответственно статус "Не в сети", который невозможно получить никакой вашей функцией. Поэтому я хотел бы уточнить расширены ли возможности этой функции в более поздних версиях? Потому что в вашей онлайн-справке я ничего такого не увидел. [smilie=search.gif]
Аватара пользователя
Алексей Пикуров
Здравствуйте.

Такой возможности нет, но я сделаю функцию для определения текущего статуса, а не только определения онлайн юзер или офлайн. Отпишу в этой теме.
Аватара пользователя
Алексей Пикуров
Функция реализована, релиз на днях.

Код: Выделить всё
var
  iState: integer;
begin
  iState := mGetUserState(iUIN);
end;

Статусов всего 4:
state_offline: -1 (получатель офлайн);
state_free: 0 (получатель в сети и активен);
state_away: 1 (получатель онлайн, но его нет на месте);
state_dnd: 2 (получатель онлайн, выставил статус "не беспокоить").

Справка по функции mGetUserState
Аватара пользователя
Алексей Пикуров
Функция SendEmail переписана, изменены параметры и добавлены новые (шифрованные соединения, форматы писем, атачи файлов, список получателей). Если вы её используете и переходите на новую версию MyChat, пожалуйста, ознакомьтесь с изменениями и документацией:

viewtopic.php?p=23717#p23717
Аватара пользователя
Алексей Пикуров
Скрипт основательно подправлен: viewtopic.php?p=6480#p6480

Добавлена HTML разметка, сделаны нормальные переводы строк, есть поддержка SSL/TLS для работы с публичными почтовыми сервисами типа GMail, Mail.ru или Яндекс.Почта.

Тема остаётся той же, если будут вопросы — задавайте.
Аватара пользователя
denek
Добрый день. работает ли отправка через защищенное соединение по 465 порту ? не получается настроить скрипт для Yandex почты.
Аватара пользователя
Алексей Пикуров
Да, работает. Насколько я помню, яндекс требует процедуру предварительной аутентификации перед использованием своего ящика через smtp.
Аватара пользователя
denek
а можно где-то в логах увидеть , почему сообщение не уходит?
Аватара пользователя
denek
заработало после включения в настройках сервера smtp и только на 25 порту. Теперь вопрос по кодировке.. есть возможность настроить?
Аватара пользователя
Алексей Пикуров
Поясните свой вопрос. Приведите пример кода и покажите, что с ним не так.