В целях чисто познавательных поставил себе задачу, а вот хочу письма которые приходят на e-mail получать на свой Jabber клиент, а так же хочу иметь возможность сразу ответить отправителю.
Задача поставлена, будем думать...
И так для приготовления нам требуется
1) XMPP сервер
2) SMTP сервер
3) как обычно желание
[spoiler]
Идея:
Создаем smtp домен jabber.server куда нам будут писать письма, сравнивать будем по маске %user%@jabber.server если %user% соответствует пользователю кор. портала, то перешлем ему письмо. Письмо мы получили, теперь нужно на него как-то ответить, для этого заведем в кор. портале учетку для системных нужд, например назовем ее robot вот от этого пользователя и будем получать сообщения с нашей электронкой, и через него же будем отправлять их на внешний мир.
Решение:
Для отправки письма будем разбирать его по шаблону,
когда мы пишем письмо на внешний e-mail то мы отправляем нашему пользователю robot сообщение вида
строка 1: test@mail.ru - в этой строке может быть посторонний текст, главное чтобы был корретный e-mail адрес, требуется для упрощения ответов, нажатием кнопки "цитировать" в jabber клиенте
строка 2: Subject: тема - строка темы письма если есть Subject: то то что после него считается темой письма
строка 3 и т.д. сам текст письма.
Соответственно при приеме письма формируем сообщение чтобы оно соответствовало нашему шаблону, тогда получится его корректно цитировать.
Релизация:
1) Создаем почтовый ящик типа "Внутренний SMTP сервер"
2) Задаем ему в параметрах обслуживать домен jabber.server
3) Создаем корректную MX запись на DNS сервере для обслуживания домена
4) Создаем правило для обработки писем
Тип правила - ручное
Применять при получении почты
Условие:
Получатель содержит @jabber.server
Действие:
на PHP скрипте
Удалить сообщение
Не обрабатывать другими правилами
5) создаем событие для обработки ответов
6) Создаем тип почтового события XMPP_2MAIL
с описанием
Отправка сообщения из Jabber на e-mail
#MAIL_FROM# - от кого
#MAIL_TO# - кому
#SUBJECT# - тема письма
#TEXT# - текст письма
и к нему почтовый шаблон.
7) перезапускаем smtp сервер и тестируем
P.S если я нигде не опечатался, все должно работать.
Задача поставлена, будем думать...
И так для приготовления нам требуется
1) XMPP сервер
2) SMTP сервер
3) как обычно желание
[spoiler]
Идея:
Создаем smtp домен jabber.server куда нам будут писать письма, сравнивать будем по маске %user%@jabber.server если %user% соответствует пользователю кор. портала, то перешлем ему письмо. Письмо мы получили, теперь нужно на него как-то ответить, для этого заведем в кор. портале учетку для системных нужд, например назовем ее robot вот от этого пользователя и будем получать сообщения с нашей электронкой, и через него же будем отправлять их на внешний мир.
Решение:
Для отправки письма будем разбирать его по шаблону,
когда мы пишем письмо на внешний e-mail то мы отправляем нашему пользователю robot сообщение вида
строка 1: test@mail.ru - в этой строке может быть посторонний текст, главное чтобы был корретный e-mail адрес, требуется для упрощения ответов, нажатием кнопки "цитировать" в jabber клиенте
строка 2: Subject: тема - строка темы письма если есть Subject: то то что после него считается темой письма
строка 3 и т.д. сам текст письма.
Соответственно при приеме письма формируем сообщение чтобы оно соответствовало нашему шаблону, тогда получится его корректно цитировать.
Релизация:
1) Создаем почтовый ящик типа "Внутренний SMTP сервер"
2) Задаем ему в параметрах обслуживать домен jabber.server
3) Создаем корректную MX запись на DNS сервере для обслуживания домена
4) Создаем правило для обработки писем
Тип правила - ручное
Применять при получении почты
Условие:
Получатель содержит @jabber.server
Действие:
на PHP скрипте
preg_match("'<(.*?)>'is", $arMessageFields["FIELD_FROM"], $from); $message = $from[1]."\n"; $message .= "Subject: ".$arMessageFields["SUBJECT"]."\n"; $message .= $arMessageFields["BODY"]."\n"; $to = $arMessageFields["FIELD_TO"]; preg_match("'([a-zA-Z0-9]*?)@'is", $to, $matches); if($matches[1]) { $rsUser = CUser::GetByLogin($matches[1]); $arUser = $rsUser->Fetch(); } if($arUser["ID"]>0) { $arFields = array( "FROM_USER_ID" => 10, //ID системного пользователя Robot "TO_USER_ID" => $arUser["ID"], "MESSAGE" => $message, "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE_TYPE" => "P", ); CSocNetMessages::Add($arFields); } |
Удалить сообщение
Не обрабатывать другими правилами
5) создаем событие для обработки ответов
AddEventHandler("socialnetwork", "OnBeforeSocNetMessagesAdd", Array("MyClass", "OnBeforeSocNetMessagesAddHandler")); class MyClass { function OnBeforeSocNetMessagesAddHandler($fields) { if($fields["TO_USER_ID"] == "10") { $rows = explode("\n", $fields["MESSAGE"]); preg_match("/[a-zA-Z0-9\._-]+@[a-z0-9.-]+/is", $rows[0], $emails); if(isset($emails[0])) { preg_match("'Subject: (.*?)$'is", $rows[1], $subjs); unset($rows[0]); unset($rows[1]); $text = implode("\n", $rows); $rsUser = CUser::GetByID($fields["FROM_USER_ID"]); $arUser = $rsUser->Fetch(); $arEventFields = Array( "MAIL_FROM" => $arUser["LOGIN"]."@jabber.server", "MAIL_TO" => $emails[0], "SUBJECT" => $subjs[1], "TEXT" => $text, ); CEvent::SendImmediate("XMPP_2MAIL", "s1", $arEventFields); } return false; } return true; } } |
6) Создаем тип почтового события XMPP_2MAIL
с описанием
Отправка сообщения из Jabber на e-mail
#MAIL_FROM# - от кого
#MAIL_TO# - кому
#SUBJECT# - тема письма
#TEXT# - текст письма
и к нему почтовый шаблон.
7) перезапускаем smtp сервер и тестируем
P.S если я нигде не опечатался, все должно работать.