guest@amper.me /blog $

Получаем уведомления о новой почте в jabber

Был у меня настроен почтовик на базе Postfix'а.
Понадобилось еще поднять Jabber. Был выбран ejabberd.
Базы используются для них разные, совсем скрестить их пока не смог) Пользователи в jabbere практически дублируют таковых в базе постфикса.

И тут подумалось: а почему бы не получать уведомления о новой почте в jabber? Ну и решил это реализовать.
Сначала искались готовые решения, потом просто занимался курением гугла... В общем определил, что реализуется это как дополнительный фильтр для обработчика очереди Postfix'а.
Начались поиски примеров фильтров. Нашел. На перле. Так как он мне не нравится, решил переписать на более близком мне php =)

Содержимое письма передается фильтру через stdin. Далее, после каких-либо действий фильтру нужно вернуть письмо обратно в очередь. Делается это с помощью sendmail.

Сообщения в jabber отправляются с помощью XMPPHP

В итоге, скриптик получился такой:
Код php:
#!/usr/bin/php

<?php
include "mysql.class.php"; //стащенный откуда-то класс для работы с mysql, удобно просто
include "XMPP.php";

$db = new db;

mb_internal_encoding("utf8"); //это нужно для правильной перекодировки
//читаем письмо
$datamail = file_get_contents("php://stdin");

//сохраняем письмо в файл, который потом скормим сендмейлу
$m_file = "/var/opt/jmail/inc/".md5(microtime());
file_put_contents($m_file,$datamail);

system("/usr/sbin/sendmail -t -i $mailto < $m_file");
unlink($m_file);

//разбиваем письмо по строкам, для извлечения заголовков
$data = explode("/n", $datamail);

$patterns = array(
  'Return-Path',
  'X-Original-To',
  'Delivered-To',
  'Received',
  'To',
  'Message-Id',
  'Date',
  'From',
  'Subject',
);

$headers = array();

//разбираем заголовки
foreach ($data as $data_line)
{
	$pattern_match_exists = false;
	if ((substr($data_line,0,1)==' ' || substr($data_line,0,1)=="t") && $last_match)
	{
		$headers[$last_match][] = $data_line;
		continue;
	}

	foreach ($patterns as $key => $pattern)
	{
		$preg_pattern = '/^' . $pattern .': (.*)$/';
		preg_match($preg_pattern, $data_line, $matches);
		if (count($matches))
		{
			$headers[$pattern][] = $matches[1];
			$pattern_match_exists = true;
			$last_match = $pattern;
		}
	}
	if (!$pattern_match_exists)
	{
		$headers['UNMATCHED'][] = $data_line;
	}
}

//извлекаем тему письма
if (!isset($headers['Subject'][0]))
{
	$headers['Subject'][0] = "Без темы";
}
else
{
	$headers['Subject'][0] = mb_decode_mimeheader($headers['Subject'][0]);
}

//парсим остальные заголовки
$mailfrom = mb_decode_mimeheader($headers['From'][0]);
$mailto = mb_decode_mimeheader($headers['To'][0]);
$mailsubj = $headers['Subject'][0];

$pattern = '/([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*@([a-z0-9])' .
'(([a-z0-9-])*([a-z0-9]))+' . '(.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)/i';

preg_match ($pattern, $mailto, $mailto);

foreach ($mailto as $user)
{
	list($mailuser,$maildomain) = explode("@",$user);
	if ($maildomain == "wzor.ws")
	{

		//тут пишем сами проверки
		$mailuser = проверка существования юзера;

		if ($mailuser)
		{
			$msg = "$user, у Вас новое письмо!/n/nОт: $mailfrom/nТема: $mailsubj";

			//посылаем уведомление
			$conn = new XMPPHP_XMPP('jabber сервер', 5222, 'аккаунт для уведомлений',
				 'пароль', 'mailbot', 'домен', $printlog=False, $loglevel=LOGGING_INFO);
			$conn->connect();
			$conn->processUntil('session_start');
			$conn->message($user, $msg);
			$conn->disconnect();
		}
	}
}
?>



© Amper, 2011-2018
Время генерации страницы: 0.0024с. SQL запросов: 2