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

Postfix Filter

Добавлено: 2008-02-10 10:32:14
kozak
Привет всем!

Возникла проблема с постфиксом, при создании мною завершающего фильтра в цепочке Postfix...

Система, работает приблизительно так:

EMAIL -> clamfilter -> spamfilter -> procfilter -> MAILBOX

Письмо приходит, проходит все фильтры (где используется передача письма по SMTP), но когда проходит через последний, где файл физически перемещается в директорию, вот тут проблемка... Permission denied

Постфикс работет под mailer:maildrop
Фильтры работают под mfilter:maildrop

Все зависимости и права на директории установлены верно (проверено)

Пользователи:

Код: Выделить всё

mailer:*:125:125:Mailer:/chroot/mail:/bin/sh
mfilter:*:126:127:eMail Filter Agent:/chroot/mfilter:/bin/sh
Группы:

Код: Выделить всё

mailer:*:125:
maildrop:*:126:mailer,mfilter,partner
mfilter:*:127:
Вот кусок master.cf

Код: Выделить всё

10.10.10.40:25 inet n - n - 10 smtpd
    -o content_filter=forwarder

127.0.0.1:25 inet n - n - - smtpd
#    -o content_filter=forwarder

127.0.0.1:10025 inet n - n - 5 smtpd
    -o content_filter=clamfilter

127.0.0.1:10026 inet n - n - 5 smtpd
    -o content_filter=spamfilter

127.0.0.1:10027 inet n - n - 5 smtpd
    -o content_filter=procfilter

Код: Выделить всё

forwarder unix - n n - 5 pipe
    flags=RD user=mfilter
    argv=/chroot/mfilter/forwarder.pl "localhost:10025" "${sender}" "${recipient}"

clamfilter unix - n n - 5 pipe
    flags=R user=mfilter
    argv=/chroot/mfilter/clamfilter.pl "localhost:10026" "${sender}" "${recipient}"

spamfilter unix - n n - 5 pipe
    flags=R user=mfilter
    argv=/chroot/mfilter/spamfilter.pl "localhost:10027" "${sender}" "${recipient}"

procfilter unix - n n - 5 pipe
    flags=R user=mfilter
    argv=/chroot/mfilter/procfilter.pl "localhost:10028" "${sender}" "${recipient}"
Вот почтовая директория:

Код: Выделить всё

bash-3.1# ls -l
total 8
drwxrwx---   3 mailer  maildrop  512 11 июл  2007 .new
drwxrwx---   6 mailer  maildrop  512  7 фев 15:48 folder_1
drwxrwx---   8 mailer  maildrop  512  7 фев 15:48 folder_2
drwxrwx---  16 mailer  maildrop  512  7 фев 15:48 folder_3
В чем может быть дело, почему perl-скрипт с правами mfilter:maildrop не может сохранить письмо в почтовую директорию c правами mailer:maildrop!????

Re: Postfix Filter

Добавлено: 2008-02-11 0:47:15
paranoidchaos
почитай на сайте постфикса мануал Filter.README

и как я понял и как сам делал сторонний фильтр сам письмо в почтовую папку класть не должен
после обработки фильтром письма он опять отправляет её и уже постфикс пропускает через себя

вот как у меня (стандартно по мануалу)

master.cf

Код: Выделить всё

smtp      inet  n       -       n       -       -       smtpd
    -o content_filter=spamfilter

.......
...................
................................

# ClamAV scan filter
scan    unix  -       -       n       -       16       smtp
    -o smtp_send_xforward_command=yes

# For injecting mail back into Postfix from the filter
127.0.0.1:10026 inet n       -       n       -       -       smtpd
   -o content_filter=
   -o smtpd_authorized_xforward_hosts=127.0.0.1

#############################################################
spamfilter    unix  -       n       n       -       -       pipe
  flags=Rq user=spamd argv=/usr/local/bin/antispam -f ${sender} -- ${recipient}
/usr/local/bin/antispam это сам филтр

и в файле main.cf в самом начале добавляешь строчку фильтра антивируса

Код: Выделить всё

content_filter = scan:127.0.0.1:10025
после проверки на спам письмо отправляетс ядальше на Клам и он сам после проверки отправляет письмо постфиксу

в твоей ситуации посоветовалбы поставь проверку Кламом последней и всё будет окей

Re: Postfix Filter

Добавлено: 2008-02-11 10:13:48
kozak
Спасибо.

Да, но у меня проблема в том, что конечный фильтр должен проверять письмо на Spam-flag="NO" / "YES"
и в результате перемещать тело письма соответсвенно в "INBOX/new" или "INBOX/.Spam/new"

Методы передачи письма отдельной программе, такой как Procmail или Mail.....(что-то там) не работают,
т.к. почтовая система исользует виртуальные почтовые ящики и данные хранит в MySQL.

Т.е. что-то как-то нужно думать...

Что можно сделать!?

Re: Postfix Filter

Добавлено: 2008-02-11 11:13:57
kozak
Может есть еще способ финального распределения писем по папкам!?

Re: Postfix Filter

Добавлено: 2008-02-11 20:42:02
paranoidchaos

Код: Выделить всё

#!/bin/sh

INSPECT_DIR=/var/spool/spamd
FILTER_SPAMC="/usr/bin/spamc -u spamd -U /var/run/spamd/spamd.sock"
SENDMAIL="/usr/sbin/sendmail -i"
LEARN="/usr/bin/sa-learn --siteconfigpath=/etc/mail/spamassassin --spam"
EX_TEMPFAIL=75
EX_UNVAILABLE=69

trap "rm -f in.$$" 0 1 2 3 15

cd $INSPECT_DIR

cat | $FILTER_SPAMC >in.$$ || { echo Cannot save mail to fail; exit $EX_EX_TEMPFAIL; }

SPAM_FLAG=`head -n 20 in.$$ | grep "X-Spam-Flag: YES"`

if test $SPAM_FLAG!=="X-Spam-Flag: YES"
then
           $SENDMAIL "$@" <in.$$
else
           $LEARN <in.$$
fi

exit $?
вот мой реальный (мануальный) фильтр и кратко опишу

получается почта сохраняется в в папке обработки почты и пихается в фильтр спамассассина

а спам ассассин тока метит письма и всё

у дальше идёт обработка уже проверенного на спам письма

выбираются первые 20 строк специально (примитивный фильтр грепом) может порсто в тексте письма содержаться X-Spam-Flag: YES ))

вот и в условии порверяем наличие строки в заголовке письма если есть в моём варианте то письмо отправляется на обучение а если нету то письмо повтороно оправляется уже постфиксу

думаю ясно в чём дело можно обучалку заменить на команду перемещения письма в нужную папку

(думаю можно обработать строку заголовка КОМУ и в зависимости от расположения почтовых ящиков (ну по разному у кого как maildir/user@domain или maildir/domain/user или maildir/domain/user@domain) переместить письмо в папку спам

Re: Postfix Filter

Добавлено: 2008-02-12 11:13:59
kozak
Paranoidchaos, ты не совсем меня правильно понял... Проблемы с определением по хэдеру "Спам" / "Хам" нет.
Я это совсем просто с помощью Perl-скрипта делаю, используя Mail::Procmail.

С помощью Mail::Procmail разделяю все заголовки и записываю в том порядке, в котором мне нужно,
т.к. в будущем собираюсь перейти на хранение писем в базе данных, т.к. работа с файлами откровенно говоря sucks...=/

Re: Postfix Filter

Добавлено: 2008-02-12 11:20:02
Alex Keda
не скажи....
пример не по теме, но всё же.
есть картинки, для каждой картинки есть запись в базе.
при отображении их пользователю проверка делалась путём поиска в базе.
поиск производился по ключевым уникальным полям.
переход на проверку существования файла, вместо поиска по БД уменьшил время выполнения скрипта на порядок..
=======
файловая система очень быстрая....
многие операции куда быстрей чем в базе.

Re: Postfix Filter

Добавлено: 2008-02-12 11:50:52
kozak
Картинки можно хранить в БД, генерировать их с GD, как в прочем, я уже давно делаю.
lissyara писал(а):переход на проверку существования файла, вместо поиска по БД уменьшил время выполнения скрипта на порядок..
Не правда. Проверка записи по ID займет не больше времени...

Re: Postfix Filter

Добавлено: 2008-02-12 13:29:14
Alex Keda
вечером тест сделаю - там скрипт в десять строк будет...

Re: Postfix Filter

Добавлено: 2008-02-12 19:09:22
paranoidchaos
усп не заметил

Код: Выделить всё

т.к. почтовая система исользует виртуальные почтовые ящики и данные хранит в MySQL.
а данные то есть письма сами в базе хранить возможно? (подскажите чёто не читал про это )

Re: Postfix Filter

Добавлено: 2008-02-12 20:46:15
Alex Keda
файлы тестим - 1 заход

Код: Выделить всё

Время работы = 6.16210818291 ; картинок насчитано = 9629
2 заход

Код: Выделить всё

Время работы = 0.141422986984 ; картинок насчитано = 9629
3 заход

Код: Выделить всё

Время работы = 0.137713909149 ; картинок насчитано = 9629
сиквель (все тесты)

Код: Выделить всё

Fatal error: Maximum execution time of 30 seconds exceeded in /home/lissyara/www/data/auto.lissyara.su/speed.test.php on line 48
Скрипт:

Код: Выделить всё

<?php

// считываем текущее время
$start_time = microtime();
// разделяем секунды и миллисекунды
//(становятся значениями начальных ключей массива-списка)
$start_array = explode(" ",$start_time);
// это и есть стартовое время
$start_time = $start_array[1] + $start_array[0];

//Пароли для подключения к MySQL
$db_host = "localhost";
$db_user = "lissyara_auto";
$db_passwd = "xxxxx"
$db_db = "lissyara_auto";
//Пытаемся приконнектится к БД
if(!mysql_pconnect($db_host,$db_user,$db_passwd))
{
	// в случае неудачного коннекта, делаем редирект на статическую страницу
	// ибо нехера посетителям пропадать
	// страница - условно статическая - реально - та же динамика, тока все переменные
	// изначально заданы
	@header("Location:http://" . $_SERVER["HTTP_HOST"] . $request_dir . "/db_connect_error.php");
	// выходим, нах.
	exit;
}
//Выбираем базу данных
mysql_select_db($db_db);

// общая часть - выгребаем список картинок
$sql = "SELECT * FROM `catalog_images`";
$spisok = mysql_query("SELECT * FROM `catalog_images`");
//var_dump($sql);
// абстрактный счётчик
$i = 0;
while ($row_id = mysql_fetch_assoc($spisok)){
	// image path
	$image_path = $_SERVER["DOCUMENT_ROOT"] . "/images/" . $row_id['mark'] . "/" . $row_id['model'] . "/" . $row_id['mark'] . "_" . $row_id['model'] . "_" . $row_id['image_number'] . "_h100.jpeg";
// 	echo $image_path . "\n";
	// query
	$sql = "SELECT `image_id` FROM `catalog_images` WHERE `image_id`='" . $row_id['image_id'] . "'";
	// разница
	if($_GET['what'] == "file"){
		if(file_exists($image_path)){ // картинка есть
			$i++;
		}
	}else{
		if(mysql_query("SELECT * FROM `catalog_images`")){
			$i++;
		}
	}
}

// Выводим время генерации скрипта
$end_time = microtime();
$end_array = explode(" ",$end_time);
$end_time = $end_array[1] + $end_array[0];
// вычитаем из конечного времени начальное
$time = $end_time - $start_time;

echo "Время работы = $time \n; картинок насчитано = $i \n";

?>
таблица:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `catalog_images` (
  `image_id` int(6) NOT NULL auto_increment,
  `mark` varchar(32) character set cp1251 collate cp1251_bin NOT NULL default '',
  `model` varchar(32) character set cp1251 collate cp1251_bin NOT NULL default '',
  `image_number` int(3) NOT NULL default '0',
  `image_width` int(3) NOT NULL default '0',
  `image_height` int(3) NOT NULL default '0',
  `add_date` int(32) NOT NULL default '0',
  `resized` tinyint(1) NOT NULL default '0',
  `img_description` varchar(128) character set cp1251 collate cp1251_bin NOT NULL default '',
  PRIMARY KEY  (`image_id`),
  UNIQUE KEY `mark` (`mark`,`model`,`image_number`),
  KEY `mark_model` (`mark`,`model`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9732 ;
вопросы? замечания? Предложения?

Re: Postfix Filter

Добавлено: 2008-02-12 20:53:14
Alex Keda
нашёл баг в скрипте
первый заход проепался - 6 с чем-то секунд.

Код: Выделить всё

Время работы = 0.46533703804 ; картинок насчитано = 9636

Код: Выделить всё

Время работы = 0.439134120941 ; картинок насчитано = 9636

Код: Выделить всё

Время работы = 0.438429832458 ; картинок насчитано = 9636
баг - я ж запрос выше составил - тока на ключ проверку.
получилось так.

Код: Выделить всё

		if(mysql_query($sql)){
			$i++;
		}
итого - чисто поиск по ключу - в 3-4 раза медленней.
вот так. это чисто по ключу.

Re: Postfix Filter

Добавлено: 2008-02-19 13:35:28
kozak
Убедительно. Согласен, в скорости сомнений нет.

Но мы совсем далеко ушли от темы проблема не решена. Спам в Входящие продолжает падать =(

Код: Выделить всё

В чем может быть дело, почему perl-скрипт с правами mfilter:maildrop не может сохранить письмо в почтовую директорию c правами mailer:maildrop!????
I need help.... :|

Re: Postfix Filter

Добавлено: 2008-02-19 14:24:08
Alex Keda
выкиньте уже ваш постфикс чтоли...

Re: Postfix Filter

Добавлено: 2008-02-19 19:22:40
paranoidchaos
запускай перл скрипт с правами mailer :?

Re: Postfix Filter

Добавлено: 2008-02-26 15:04:28
kozak
Пробовал....

Безрезультатно...

Код: Выделить всё

Feb 26 14:01:02 wwwserver postfix/error[45667]: 946BF60: to=<office@privatproekt.com>, relay=none, delay=1.4, delays=0.38/1/0/0.01, dsn=4.3.0, status=deferred (unknown mail transport error)

Re: Postfix Filter

Добавлено: 2008-02-26 15:05:09
kozak
lissyara писал(а):выкиньте уже ваш постфикс чтоли...
Завтра... =)

Re: Postfix Filter

Добавлено: 2008-02-26 15:29:52
Fastman
lissyara писал(а):выкиньте уже ваш постфикс чтоли...
От так сразу выкиньте ))) Он работает и кушать не просит )

Re: Postfix Filter

Добавлено: 2008-02-26 15:30:45
Alex Keda
когда просит - что делать??
мутный он...

Re: Postfix Filter

Добавлено: 2008-02-26 15:53:24
Fastman
lissyara писал(а):когда просит - что делать??
мутный он...
Пока работает - не будем менять ) Если будем сетку реконфигурить и железо менять - обязательно экзим поставлю )

Re: Postfix Filter

Добавлено: 2008-02-28 11:42:53
kozak
Блин, хватит флудить в моей теме!!! :evil:

Мы не выбор МТА обсуждаем!

Между прочем, проблема, не решена до сих пор!

Может кто знает как запустить в перл-скрипте команду от имени другого пользователя!?

Re: Postfix Filter

Добавлено: 2008-02-28 12:24:34
Alex Keda
&copy; Белое солнце пустыни, старичики с ящиком динамита... писал(а):давно здесь сидим...

Re: Postfix Filter

Добавлено: 2008-03-03 8:52:26
kozak
lissyara писал(а):
&copy; Белое солнце пустыни, старичики с ящиком динамита... писал(а):давно здесь сидим...
Может передашь свое настроетние?
А то я что-то не пойму... ты о чем?