klink0v (klink0v) wrote,
klink0v
klink0v

Categories:

Автоматическое вытаскивание аттачей из писем

А теперь серьёзный технический сисадминский псто. Под катом куча непонятных букаф и цифирь.

Допустим, некий сервис периодически шлёт нам на определённый почтовый ящик письма с вложениями (аттачами). Например, VoIP-провайдер так выдаёт картинки со страничками входящих факсов. Или мониторинг какие-нибудь графики-отчёты выплёвывает. Или контрагенты счета-акты засылают. Да и мало ли ещё чего. Хочется поиметь архив всей этой радости в одном месте, да чтоб был красиво упорядочен. Для этого нужно:


  1. Получить письмо.

  2. Выдрать из него аттач.

  3. Сложить аттач в правильную папку на диске.

Я тут спросил у нашего виндового сисадмина hvostat_hvostat, возьмётся ли он за решение такой задачи. Он ответил: "Нуу-у-у-у, навскидку надо будет развернуть Exchange"... Вот спасибо, добрый человек. Ставить ради такого пустяка софтину, стоящую офиглион рублей. Вот за что я люблю линукс, там подобные финты можно выписывать за полдня (и то если не знать как делать) с помощью двух утилит суммарным размером 150 килобайт. Итак, нам понадобятся:


  • uudeview - инструмент для декодирования base64 и не только

  • mpop - простенький почтовый клиент

Сперва создадим отдельного пользователя, чтобы из-под него запускать всю эту радость. Можно, конечно, и от рута, но это моветон.

addgroup --system --gid 200 mailfetcher
adduser --system --shell /usr/sbin/nologin --uid 200 --gid 200 mailfetcher

Потом пойдём к нему домой, создатим там папочку для складывания готовых архивов, либо симлинк на такую папочку (по вкусу). А также положим туда конфигурационный файл для mpop.

cd /home/mailfetcher
sudo -u mailfetcher mkdir archive
sudo -u mailfetcher touch .mpoprc
chmod 600 .mpoprc
cat >> .mpoprc

И скормим так любимому линуксоидами котику (cat) конфиг примерно вот такого содержания.

account default
host mail.mysuperserver.com
tls off
auth user
user my-reports@mysuperserver.com
password supersecretpassword
delivery mda "/home/mailfetcher/sorter"
keep off

Параметры "tls", "host", "user", "password", "auth", понятное дело, у каждого будут свои. Тут всё зависит от почтового сервера в каждом конкретном случае. Последняя строчка говорит, нужно ли оставлять письмо на сервере после того как его оттуда заберут. Для отладки очень удобно ставить "on", а перед запуском в production не забыть переключить в "off". И да, предупреждаю сразу. Если у вас почтовый сервер - Яндекс, то класть он хотел с прибором на ваши настройки. Письма будут оставаться в ящике в любом случае (это не баг, это фича). Что касается строчки "delivery mda", то там надо указать путь к скрипту, которому будет скармливаться на стандартный вход содержимое каждого извлечённого из почтового ящика письма по отдельности. То есть, сколько в ящике накопилось писем на момент запуска mpop, столько раз будет запущен этот скрипт.

Касательно содержимого такого скрипта универсальных рецептов быть не может, каждому своё. Лично я раскладываю поступающие мне PDF-документы по папкам в зависимости от даты и времени. Примерно вот так:

#!/bin/bash
DIRPRE="/home/mailfetcher/archive"
export LANG=ru_RU.UTF-8

[ -d $DIRPRE ] || die "Directory root tree does not exist"
YEAR=`/bin/date +%Y`
MONTH=`/bin/date +%m_%B`
DAY=`/bin/date +%d_%A`
TIME=`/bin/date +%H.%M`

[ -d "$DIRPRE/$YEAR" ] || /bin/mkdir "$DIRPRE/$YEAR"
[ -d "$DIRPRE/$YEAR/$MONTH" ] || /bin/mkdir "$DIRPRE/$YEAR/$MONTH"
[ -d "$DIRPRE/$YEAR/$MONTH/$DAY" ] || /bin/mkdir "$DIRPRE/$YEAR/$MONTH/$DAY"
[ -d "$DIRPRE/$YEAR/$MONTH/$DAY/$TIME" ] || /bin/mkdir "$DIRPRE/$YEAR/$MONTH/$DAY/$TIME"

cd "$DIRPRE/$YEAR/$MONTH/$DAY/$TIME"

cat | /usr/bin/uudeview +a -z -q +e .pdf -

Скрипт просто создаёт структуру каталогов: год, месяц, день, время. Если нужной папки на момент запуска не существует, она создаётся. Прокомментировать тут надо разве что вторую и последнюю строчку. Со второй понятно - куда складывать всю эту радость. Важно убедиться, чтобы туда были права на запись для пользователя "mailfetcher". С последней чуть-чуть поинтереснее.

Как всегда, любимый котик (cat) хватает всё со стандартного входа скрипта (а там, внезапно, выхлоп от mpop-а, то есть тело письма). И тут же pipe-ом отправляет его на стандартный вход uudeview. "+a" - переименовать если такой файл уже есть (защита от дурака, вдруг в папке уже есть файл с таким же названием как в аттаче), "-z" - более строгое следование MIME-стандартам, "-q" - молчать-бояться, "+e" говорит что мы хотим сохранять только файлы с определённым расширением (в моём случае "pdf"), "-" - брать исходный материал со стандартного входа.

Дальше засовываем в crontab строчку вида

* * * * * mailfetcher /usr/bin/mpop -q
И, собственно, всё.

И да, нужно упомянуть ещё один момент. Хорошо бы фильтровать входящие письма на предмет возможного спама. Лично я делаю это средствами почтового сервера. Но если он нам неподконтролен, то можно попросить у mpop имя отправителя при помощи шаблона "%F" и потом в скрипте проанализировать его на предмет "надо - не надо".

А вы говорите, Exchange... Кстати, если кто скажет, как всё то же самое можно реализовать под виндой, милости прошу на холивар. :)

Tags: linux, администрирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments