Автоматизация для бедных. Часть 3 – обработка входящей почты. Fetchmail, procmail и другие

Понадобилось автоматизировать прием некоторой специфической почты. Содержание тела письма не важно, вложения необходимо сохранить на сервере для дальнейшего использования.

Выбор связки fetchmail / procmail в качестве решения вполне очевиден.
$ sudo apt-get install fetchmail procmail incron

Дальше начинается интересное – fetchmail не работает для отдельного пользователя, если нет глобальной конфигурации в /etc/fetchmailrc. И права тоже должны быть установлены корректно.

$ ls -l /etc/fetchmailrc
-rw------- 1 fetchmail root 271 Jan 11 22:08 /etc/fetchmailrc

Нам необходимо забирать всю почту, протокол pop3s с использованием SSL, отдать на обработку юзеру mailman. Период обращения к почтовому серверу – 3 минуты:

$ sudo cat /etc/fetchmailrc
#### .fetchmailrc

set daemon 180
set logfile /var/log/fetchmail.log

poll mail.domail.tld proto POP3
user "robot@domain.tld" pass "password" is "mailman" preconnect "date >> /var/log/fetchmail.log"
ssl
fetchall
no keep
no rewrite
mda "/usr/bin/procmail -f %F -d %T";

На стороне mailman находится конфигурация procmail. Сохраняем все входящие сообщения и отдельно сохраняем вложения, передавая их uudeview для распаковки:
$ cat .procmailrc
:0
*^content-Type:
{
:0c
$HOME/emailbackup
:0fw
| uudeview -i +a +o -p $HOME/attachments -
}

Каталоги ~/emailbackup и ~/attachments необходимо создать заранее.

После создания файлов на диске incron их положит на сервер. Это гораздо быстрее и эффективнее, чем обработка по crontab.
$ incrontab -l
/home/mailman/attachments/ IN_CREATE mv $@/$# /mnt/files/INBOX/

Подробная информация по incron на IBM Developer: “Планирование операций обработки событий в файловой системе”

Теперь начинаются костыли.
Иногда, по какой-то непонятной причине, incron не перемещает файлы на сервер. Приходится их подбирать по расписанию, каждые 5 минут:
*/5 * * * * /usr/bin/find /home/mailman/attachments -mmin +1 -type f -exec mv '{}' /mnt/files/INBOX/ \; > /dev/null

Еще один костыль для латышского языка. Файлы с неправильными названиями на национальных языках иногда не обрабатываются скриптами. Есть замечательная утилита для переименования файлов со слетевшими кодировками:
*/5 * * * * /usr/bin/find /home/mailman/attachments -mmin +1 -type f -exec /usr/bin/convmv -f cp1257 -t utf8 -r --notest '{}' \; > /dev/null

Может, не самое оптимальное решение, но работает. Буду рад советам и предложениям.

Leave a comment

Your comment