В целях чисто познавательных поставил себе задачу, а вот хочу письма которые приходят на 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 если я нигде не опечатался, все должно работать.
вот и решение для коммуникаций
Класс, всё остальное можно дописать(по мере надобности), хорошая идея.