From: alexch <alexch at alexch.com.ua>
Newsgroups: email
Date: Mon, 30 Apr 2004 14:31:37 +0000 (UTC)
Subject: Настройка сервера для работы с информагенствами
Прелюдия: Так вышло, что компания является подписчиком у некоторых
инфорагенств. Эти агенства каждый день по мейлу сбрасывают своим
подписчикам файлы. Человек в нашей компаниии должен получить эти файлы,
положить их в зашаренную папку и на этом как бы все. Но нет! В нашей
сети люди работающие с полученными документами работают не только на PC,
но и на MAC'ах. Потому и было принято решение содержимое файлов
засовывать в конференции, в формате html, чтоб и с MAC'ов и с PC могли
одинаково читать документ. И в се было бы хорошо, если бы у каждого из
этих ИА были свои сервера новостей для подписчиков. В таком случае они
просто вносят IP адрес нашего сервера в свой файл конфигурации, после
чего наш сервер тянет у них новости по 119 порту. Таким образом
соблюдается единый стандарт подачи новостей. Но толи у них там с
админами не сложилось, толи еще по какой дурной причине, но это
получается страшно неудобно, так как такой файл нужно принять, вырезать
из тела письма, пропустить через конвертор, и даже не через один, и
только тогда запостить в конференцию. Однако мы же крутые админы и не
хотим, чтобы пользователи вручную постили информацию. Следовательно мы
это дело автоматизируем. Но задача осложняется тем, что каждое ИА
считает нужным высылать файлы со своим марафетом и в формате ворда 95,
97 или 2000, есть даже такие которые высылают досовский текст - полный
отстой на мой взгляд. Представляете какой винегрет получается после всех
раскодировок, а особенно когда в файле есть таблицы. Ну да ладно,
закроем глаза на бездарность их админов и будем обходится тем что есть.
Используем:
FreeBSD 4.8
Inn 2.4.0
Wv 0.7.5
Sendmail
Procmail
Предполагается, что Inn и Sendmail у нас уже заинсталены и работают.
Если Inn не установлен - смотри сюда.
Инсталяция Procmail
-------------------
Ставим из портов
cd /usr/ports/mail/procmail
make
make install
make clean
Интеграция Sendmail+Procmail
Для людей незнакомых с назначением пакета Procmail, рекомендую посетить
этот сайт. Предполагаем, что вся почта от ИА будет идти на
info@myinfoserver.com. Следовательно создаём учётную запись info
adduser info
В домашнем каталоге создаем файл .procmailrc где позже мы напишем
правила фильтрации.
touch .procmailrc
Для интерграции Procmail'a c Sendmail'oм дописываем в mc-файл
конфигурации Sendmail'а следующее
Если все сделано правильно, то Sendmail должен работать как и работал раньше.
Инсталяция wv
-------------
На мой взгляд прекрасный разноплановый конвертер, корректно работающий с
украинской буквой "i". Нам же потребуется от него только конвертация
доковских документов в html.
cd /usr/ports/textproc/wv
make
(тут он за собой потянет ~60 мег иксовых библиотек + кучу всякого
барахла, так что придется подождать)
make install
make clean
Никаких настроек для этого пакета не требуется, поэтому сразу переходим
к написанию прокмейловского скрипта
Написание скрипта
-----------------
Как он будет работать?
Мейл с аттачментом проходит через прокмейловский скрипт, где аттачмент
выризается, конвертируется в html, формируется новый мейл с содержимым
html-файла, пересылается на какой-либо адрес нашего сервера, который мы
укажем в aliaes, оттуда постим в конференцию.
Переходим в домашнюю директорию пользователя info и создаем необходимые
временные каталоги.
mkdir temp
mkdir temp/ia
Владельцем каталогов должен быть пользователь info
Открываем файл .procmailrc, который мы создали в домашней директории
юзера info.
:0 w:ms.lock
* (^From:.*info@infoagency.com|^From:.*info@infoagency2.com)
(допускаем, что почта от ИА может приходить с разных серверов)
{
agency=ia
:0 fw: ms.lock
| rm -f temp/$agency/* ;
(очищаем темп-директорию от файлов которые пришли раньше)
uudeview -m -p temp/$agency - ;
(вынимаем аттачмент из тела письма и кладем его в temp/ia)
cd temp/$agency ;
for j in `ls *.doc` ; do
jh=`echo $i|sed -e 's/.txt$/.html/'` ;
wvWare -x wvHtml.xml -c koi8-u $j > $jh ;
(все файлы с расширением doc мы проганяем через конвертер, на выходе
получаем html-файл в кодировке koi8-u)
( formail -A "From: Info-Robot DTKT.COM.UA"
-A "Subject: $jh"
-A "Content-Type: text/html; charset=koi8-u"
-A "Content-Transfer-Encoding: 8bit" ;
cat $jh ; ) | $SENDMAIL info_ia_html@myinfoserver.com ; done
(формируем заголовок нового мейла, вставляем содержимое html - файла и отсылаем)
}
:0 e
| uuencode error.eml|mail -s "Error in HTML" admin@mydomain.com
(в случае збоя в работе скрипта, мы будем получать уведомление)
Редактирование aliases
----------------------
В файл с алиасами нам нужно добавить строчку
info_ia_html: "|/usr/local/news/bin/mailpost infoagency.ia"
(разумеется, что группа infoagency.ia уже должна быть создана. man mailpost)
Дело в том, что есть такой глюк у mailpost'a, который проявляется в том,
что он не хочет постить документы если абзац содержит более чем 500
символов одной строкой (по крайней мере я так насчитал). В каком-то
FAQ'е я прочитал как это дело поправить.
cd /usr/local/news/bin
Открываем на редактирование mailpost и находим кусок текста
my $rest;
$rest .= $_ while (<STDIN>);
$rest =~ s/n*$/n/g; # Remove trailing n except very last
После чего вставляем
unless ($rest =~ /n.+$/) #Assumes no too-long lines if embedded n
{
use Text::Wrap;
$rest = wrap('','',$rest); #wraps to default of 72 columns
}
Далее должно следовать
print TMPFILE $rest;
close TMPFILE ;
Таким образом проблема устранена. Однако может случится такое, что и
после этого Inn будет кидать ошибку. В таком случае необходимо взять
inews из пакета 2.3.х
Доставка полученных новостей на сервера филиалов компании
---------------------------------------------------------
Разумеется, что свежеполученная новость должна быть доставлена на
сервера других филиалов компании. Следовательно нам нужно настроить
фидинг. Открываем файл nntpsend.ctl и пишем
news.branch1.com:news.branch1.com::-t300
news.branch2.com:news.branch2.com::-t300
(за подробностями man nntpsend.ctl)