Страница 1 из 1

Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Пн дек 05, 2011 11:45 pm
Алексей Пикуров
Изменено для версии MyChat 5.22 и старше

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

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

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


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

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


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

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


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

Вместо констант 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
Комментарии приветствуются.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт дек 13, 2011 11:08 am
Volldemar
Hobit писал(а):Вместо констант sHost, sLogin, sPassword и sPort следует подставить параметры своего почтового сервера.


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

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт дек 13, 2011 1:36 pm
Алексей Пикуров
От Пупкина <[email protected]>.
Код: Выделить всё
[13.12.2011 12:32:30] Pupkin> Бупкин, привет, сегодня идём на пиво, ты угощаешь

Вообще говоря, по скрипту всё видно. Опять же, кто мешает попробовать скрипт в работе? Всё сразу сами увидите.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 9:10 am
Sergey
const
sHost = 'smtp.mail.ru';
sLogin = '*****@mail.ru';
sPassword = '*****';
sPort = '465'; /25
sSubject = 'New message MyChat';


вот с такими константами сообщения не отправляются. где можно посмотреть причины или куда копать та? :)
кнопачка проверить скрипт выдала "Скрипт скомпилирован без ошибок"
в консоли сервера видно что событие OnPrivateMessage выполняется

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 9:39 am
Алексей Пикуров
Почему порт 465?

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 9:44 am
Алексей Пикуров
Читаем справку на сайте 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 портом.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 10:36 am
Sergey
собстно может я не так скрипты включаю? попробовал и 25 порт и 587 результат тот же...

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 10:49 am
Алексей Пикуров
Только что попробовал с портом 2525 на smtp.list.ru, всё сработало. Попробуйте.

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

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

Если коннект есть, всё ок. Скрипт тоже будет работать нормально.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 11:24 am
Sergey
хм...а не может быть проблемы в неустановленности каких либо компонентов win2008? а то даже телнет клиент по умолчанию не установлен. у меня тоже телнетом ко всем портам подцепилось

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 11:51 am
Алексей Пикуров
Нет, отсутствие установленного телнета по умолчанию тут не при чём совершенно. Если телнетом соединилось, значит, нужно внимательно ещё раз проверить, всё ли вы верно указали в параметрах функции: smtp сервер, логин, пароль, ящик отправителя, имя получателя и отправителя.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 11:54 am
Алексей Пикуров
P.S. Можете мне личкой сбросить текст скрипта, я проверю у себя, чтобы не грешить на ваше системное и сетевое окружение. Потом пароль на свою почту просто поменяете.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 12:58 pm
Алексей Пикуров
В коде напишите вместо sEmailFrom := mGetUserPrimaryEmail(iUINFrom);
Код: Выделить всё
sEmailFrom := '[email protected]'; // свой ящик электронной почты


Вероятно, mail.ru ужесточил правила отправки почты. Поле "From" в письме должно совпадать с реальным отправителем теперь.

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Вт июл 16, 2013 1:29 pm
Sergey
огромное спасибо за помощь

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Чт июл 18, 2013 10:36 am
Sergey
возникла еще одна проблема письма скриптом отправляются не в той кодировке которая нужна. вспомнил про програмку BLAT которая отправляет письма в любой кодировке из командной строки (blat.exe -body "бла бла бла" -subject ЗЫ -to [email protected] -charset utf-8)
функция Execute все успешно выполнила, но тему и тело сообщения хотелось бы брать из переменных описанных в скрипте что то типа Execute(FileName, '-body " ', sTextBody, ' " -subject' sSubject' -to [email protected]', '')

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Чт июл 18, 2013 2:37 pm
Алексей Пикуров
А что вам мешает сформировать строку вручную?
Код: Выделить всё
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;

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Пт июл 31, 2015 3:10 pm
denamax
Добрый день. У нас на предприятии установлена версия MyChat 5.3. Я настроил ваш скрипт для отправки сообщения на e-mail. С пинка все заработало, потому что с портами была проблема из-за усиления этой безопасности на mail.ru. Но вопрос в другом, почему ваша функция mIsUINOnline возвращает только два значения статуса, когда их целых 4 состояния? Я бы вот хотел сделать отправку сообщения даже тогда, когда пользователь просто отошел от компьютера и у него соответственно статус "Не в сети", который невозможно получить никакой вашей функцией. Поэтому я хотел бы уточнить расширены ли возможности этой функции в более поздних версиях? Потому что в вашей онлайн-справке я ничего такого не увидел. [smilie=search.gif]

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Пт июл 31, 2015 3:36 pm
Алексей Пикуров
Здравствуйте.

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

Re: Скрипт для отправки сообщения на E-mail

СообщениеДобавлено: Пн авг 03, 2015 6:51 pm
Алексей Пикуров
Функция реализована, релиз на днях.

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

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

Справка по функции mGetUserState

Re: Скрипт для отправки сообщения на E-mail

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

viewtopic.php?p=23717#p23717

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Вт сен 13, 2016 6:49 pm
Алексей Пикуров
Скрипт основательно подправлен: viewtopic.php?p=6480#p6480

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

Тема остаётся той же, если будут вопросы — задавайте.

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Пт авг 20, 2021 4:26 pm
denek
Добрый день. работает ли отправка через защищенное соединение по 465 порту ? не получается настроить скрипт для Yandex почты.

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Пт авг 20, 2021 8:15 pm
Алексей Пикуров
Да, работает. Насколько я помню, яндекс требует процедуру предварительной аутентификации перед использованием своего ящика через smtp.

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Пт авг 20, 2021 8:43 pm
denek
а можно где-то в логах увидеть , почему сообщение не уходит?

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Пт авг 20, 2021 9:23 pm
denek
заработало после включения в настройках сервера smtp и только на 25 порту. Теперь вопрос по кодировке.. есть возможность настроить?

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Сб авг 21, 2021 2:38 am
Алексей Пикуров
Поясните свой вопрос. Приведите пример кода и покажите, что с ним не так.

Re: Скрипт для отправки сообщения на E-mail, если получатель офлайн (нет в сети)

СообщениеДобавлено: Вт авг 24, 2021 5:26 pm
Алексей Пикуров
Ожидаю вашего ответа.