Postfix Filter

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Postfix Filter

Непрочитанное сообщение kozak » 2008-02-10 10:32:14

Привет всем!

Возникла проблема с постфиксом, при создании мною завершающего фильтра в цепочке 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!????
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
paranoidchaos
мл. сержант
Сообщения: 80
Зарегистрирован: 2007-12-13 10:58:23

Re: Postfix Filter

Непрочитанное сообщение paranoidchaos » 2008-02-11 0:47:15

почитай на сайте постфикса мануал 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
после проверки на спам письмо отправляетс ядальше на Клам и он сам после проверки отправляет письмо постфиксу

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

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-11 10:13:48

Спасибо.

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

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

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

Что можно сделать!?
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-11 11:13:57

Может есть еще способ финального распределения писем по папкам!?
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
paranoidchaos
мл. сержант
Сообщения: 80
Зарегистрирован: 2007-12-13 10:58:23

Re: Postfix Filter

Непрочитанное сообщение paranoidchaos » 2008-02-11 20:42:02

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

#!/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) переместить письмо в папку спам

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-12 11:13:59

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-12 11:20:02

не скажи....
пример не по теме, но всё же.
есть картинки, для каждой картинки есть запись в базе.
при отображении их пользователю проверка делалась путём поиска в базе.
поиск производился по ключевым уникальным полям.
переход на проверку существования файла, вместо поиска по БД уменьшил время выполнения скрипта на порядок..
=======
файловая система очень быстрая....
многие операции куда быстрей чем в базе.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-12 11:50:52

Картинки можно хранить в БД, генерировать их с GD, как в прочем, я уже давно делаю.
lissyara писал(а):переход на проверку существования файла, вместо поиска по БД уменьшил время выполнения скрипта на порядок..
Не правда. Проверка записи по ID займет не больше времени...
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-12 13:29:14

вечером тест сделаю - там скрипт в десять строк будет...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
paranoidchaos
мл. сержант
Сообщения: 80
Зарегистрирован: 2007-12-13 10:58:23

Re: Postfix Filter

Непрочитанное сообщение paranoidchaos » 2008-02-12 19:09:22

усп не заметил

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-12 20:46:15

файлы тестим - 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 ;
вопросы? замечания? Предложения?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-12 20:53:14

нашёл баг в скрипте
первый заход проепался - 6 с чем-то секунд.

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

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

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

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

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

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

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

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

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-19 13:35:28

Убедительно. Согласен, в скорости сомнений нет.

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

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-19 14:24:08

выкиньте уже ваш постфикс чтоли...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
paranoidchaos
мл. сержант
Сообщения: 80
Зарегистрирован: 2007-12-13 10:58:23

Re: Postfix Filter

Непрочитанное сообщение paranoidchaos » 2008-02-19 19:22:40

запускай перл скрипт с правами mailer :?

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-26 15:04:28

Пробовал....

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

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

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)
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-26 15:05:09

lissyara писал(а):выкиньте уже ваш постфикс чтоли...
Завтра... =)
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Postfix Filter

Непрочитанное сообщение Fastman » 2008-02-26 15:29:52

lissyara писал(а):выкиньте уже ваш постфикс чтоли...
От так сразу выкиньте ))) Он работает и кушать не просит )
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-26 15:30:45

когда просит - что делать??
мутный он...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Postfix Filter

Непрочитанное сообщение Fastman » 2008-02-26 15:53:24

lissyara писал(а):когда просит - что делать??
мутный он...
Пока работает - не будем менять ) Если будем сетку реконфигурить и железо менять - обязательно экзим поставлю )
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-02-28 11:42:53

Блин, хватит флудить в моей теме!!! :evil:

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

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

Может кто знает как запустить в перл-скрипте команду от имени другого пользователя!?
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Postfix Filter

Непрочитанное сообщение Alex Keda » 2008-02-28 12:24:34

&copy; Белое солнце пустыни, старичики с ящиком динамита... писал(а):давно здесь сидим...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
kozak
сержант
Сообщения: 240
Зарегистрирован: 2007-07-20 15:22:54
Откуда: Запорізька Січ

Re: Postfix Filter

Непрочитанное сообщение kozak » 2008-03-03 8:52:26

lissyara писал(а):
&copy; Белое солнце пустыни, старичики с ящиком динамита... писал(а):давно здесь сидим...
Может передашь свое настроетние?
А то я что-то не пойму... ты о чем?
Діла добрих оновляться, Діла злих згинуть. Т. Г. Шевченко.