LINUX.ORG.RU
Форум — Admin  

Exim, свой «фильтр»


0

1

Приветствую.

Нужно сделать следующее:
Поднять почтовый сервер (предполагаю Exim*)
Почтовый сервер должен при получении письма на определенный(ые) ящики смотреть в письмо. В письме будет лежать определенный файл.
Обработчик (фильтр) должен посмотреть в этот файл и отправить одно или несколько писем в зависимости от содержимого файла.

насколько я понял это можно сделать через pipe и shadow_copy, но меня смущает, что при этом будет происходить копирование письма через pipe.
Проблема в том, что письма могут быть в районе 500 МБ.
Т.е. лишняя нагрузка на файловую систему...

Есть ли решение, когда Exim просто отдаст ссылку (fd) на файл с письмом и уведомит софт о том, что файл пришел.

Что-то вроде local_scan но срабатывающее не когда пришло в income, а когда уже доставлено в ящик.

Заранее благодарен.

*так как возможно придется пускать и под win32, а его можно пустить в cygwin

★

Последнее исправление: Zur0 (всего исправлений: 1)

А какая задача решается? Мне кажется использование почтового сервера тут крайне лишнее, если возникает мысль пересылать письма по 500метров то что-то явно не так. Тем более что формат почтовых сообщений неэффективен для хранения бинарных данных(во-первых, надо их ещё раскодировать, во-вторых, письмо весит больше чем все вложенные в него файлы) и вообще для обработки.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ну тут как бы вариантов нет.
Это все касается сдачи электронной отчетности. На это есть регламентирующие документы. И это должно работать по smtp.

Так вот надо письмо получить. Посмотреть куда его отправить (понять это можно только открыв письмо и распарсив xml). Подписать своим сертификатом. И отправить в две стороны подписанное письмо.

Как-то так.

Случаи с 500 метровыми файлами редкие, но бывают. И бывают они как обычно в последний день месяца и все сразу.

Zur0 ★
() автор топика

procmail же!

(а зачем тут сервер?, мне fetchmail'а хватает)

Да, и как уже сказали - неэффективно. из 6и бит получается 8 бит, соответственно из 6Мб получится 8Мб почты. Хотя - дело ваше.

насколько я понял это можно сделать через pipe и shadow_copy, но меня смущает, что при этом будет

зря боитесь - PIPE никогда не ложится на диск. А что касается временного файла - смонтируйте /tmp в RAM. Это и с т.з. безопасности полезно, и работает быстро.

drBatty ★★
()
Ответ на: комментарий от drBatty

>procmail же!
гляну. спасибо.

(а зачем тут сервер?, мне fetchmail'а хватает)

Э...
Ну каким еще образом принимать почту от 123@domain.tld в inbox@domain.tld. ну и потом ее уже пересылать на 321@domain_2.tld
??

Да, и как уже сказали - неэффективно. из 6и бит получается 8 бит, >соответственно из 6Мб получится 8Мб почты. Хотя - дело ваше.


Есть закон. :)

зря боитесь - PIPE никогда не ложится на диск

ну на диск то не ложится...
Но при этом будет копирование в памяти через pipe
Т.е. лишний ресурс все равно тратится.


Zur0 ★
() автор топика
Ответ на: комментарий от Zur0

>Э... Ну каким еще образом принимать почту от 123@domain.tld в inbox@domain.tld. ну и потом ее уже пересылать на 321@domain_2.tld ??

у меня - fetchmail+procmail+msmtp. Последняя програмулька отправляет, первая принимает, а вторая сортирует, что куда складывать. Она-же может выполнить любую команду, в т.ч. и отправку.

Вообще-то Ъ админы юзают sendmail, но я в нём не стал разбираться - слишком сложно.

Т.е. лишний ресурс все равно тратится.

копирование выполняется через небольшой буфер в RAM. У вас есть способ лучше? Так вот, ваш «новый способ» будет заведомо хуже PIPE. Или это будет PIPE. ;)

drBatty ★★
()
Ответ на: комментарий от drBatty

я же писал про local_scan

Так вот он передает fd в функцию.

Т.е. не надо ничего копировать. Тебе отдали файловый дескриптор и с ним и работаешь.

Но с ним проблема в том, что он вызывается не на том этапе.

Zur0 ★
() автор топика
Ответ на: комментарий от drBatty

drBatty> fetchmail

Не принимает (по smtp), а вытягивает (по pop3/imap) — разница есть, да?

sdio ★★★★★
()
Ответ на: комментарий от drBatty

Вообще-то Ъ админы юзают sendmail

ну нах его :). Он нравится только тем кто убил кучу времени на изучение m4 и теперь не знают куда девать свои знания.

true_admin ★★★★★
()
Ответ на: комментарий от Zur0

а откуда письмо получается? Может не создавать лишних сущностей а сразу генерить подписанные письма и слать?

PS бедный спул, письма по 500метров...

PPS не разбираюсь в бухгалтерии, но нифигаж себе отчётность на 500 метров. Или это от xml так разбухает?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

>а откуда письмо получается? Может не создавать лишних сущностей а сразу генерить подписанные письма и слать?

Письмо от клиента. Мы звено по середине. Письмо подписано клиентом. Но так - же подписывается и нами.

PS бедный спул, письма по 500метров...

Это редкость и крайний случай. Но он будет каждый месяй/квартал.
Причем будет куча куда более мелких писем (на порядок-два).
Но проблема в том, что нужно рассчитывать, что весь поток почты будет приходить в течении недели...

PPS не разбираюсь в бухгалтерии, но нифигаж себе отчётность на 500 метров. Или это от xml так разбухает?

Xml... Но дело не столько в нем. Это один из видов отчетов. Среднесписочная численность сотрудников. Из этого вытекает что таких, у кого этот файл будет большой не так много...

Zur0 ★
() автор топика

Еще возникла мысль...
По идее же можно использовать incron.
Натравить его на нужный каталог (в каталог, куда будет сваливаться вся входящая почта)

Сейчас попробовал... Работает и нужный скрипт вызывается (событие ON_MOVED_TO)...
Вроде все он.

Но смущает что будет при нагрузке и куче одновременных (или почти одновременных) событий.

Кто-нибудь использовал его для чего-то серьезного.

Т.е. хотелось бы быть уверенным, что он не упадет и будет работать ожидаемо...

Zur0 ★
() автор топика
Ответ на: комментарий от Zur0

Ну и плюс не понятно есть-ли подобный механизм под win32.
Так как решение скорее всего должно быть и под оффтопик

Zur0 ★
() автор топика

В общем читайте доку, она рулез :)
Все оказалось гораздо проще.
Через pipe можно передать то, что нужно. И имя файла с письмом в том числе.


Zur0 ★
() автор топика
Ответ на: комментарий от Zur0

Поторопился...
Имя файла мне отдавал костыль на incrond
А вот через пайп гонится все письмо...

Zur0 ★
() автор топика
Ответ на: комментарий от Zur0

А вот через пайп гонится все письмо...

Ну и что? :-) В случае procmail, письмо лежит и в файле, и прогоняется через pipe. В любом случае, 500 мегабайт через pipe...

$ time { dd if=/dev/zero bs=512 count=1024k | cat >/dev/null ; }
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 1,37433 s, 391 MB/s

real	0m1.383s
user	0m0.234s
sys	0m2.174s

Полторы секунды. Проблем то?

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>Ну и что? :-)
да я уже смирился :)

В любом случае, 500 мегабайт через pipe...

ну в /dev/null то не интересно

Вот мой результат в тестовой виртуалке:

root@mta:~# du -s msg.64
414992   msg.64

root@mta:~# time cat msg.64 > /dev/null

real   0m0.411s
user   0m0.016s
sys   0m0.388s

root@mta:~# time cat msg.64 > msg.64.1

real   0m9.989s
user   0m0.028s
sys   0m3.732s


Zur0 ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.