задача - каждый месяц нам присылают журнал, по электронной почте - zip архив с набором html страничек этого журнала.
ну, секретари его перекидывают админам, мы его разархивируем и кладём в директорию внутреннего веб-сервера...
кому надо - ходят и смотрят.
[классический секс]

написали робота. подбирает файл письма, достаёт из него аттачи, пытается их раззиповать в заданную директорию.
при работе страшно ругается, но все ошибки обрабатывает корректно, если аттачментов много - тоже работает корректно.
Код: Выделить всё
jabber$ cat /root/scripts/expert.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
file="/tmp/file.eml"
tmp="/tmp/$$"
dst_dir="/shares/sites/jabber/data/expert/"
# test ock file
test -f $file.lock && exit 64;
# file exists?
test -f $file || exit 32;
# move file
mv $file $file.$$
file=$file.$$
mkdir $tmp
length="`wc -l $file | awk '{print $1}'`"
cd $tmp
grep "Content-Transfer-Encoding: base64" -n $file | awk -F ':' '{print $1}' |
{
while read line
do
mkdir -p $tmp
#echo $line
cd $tmp
# дёргаем файл от надписи 'Content-Transfer-Encoding: base64' до конца
cat $file | tail -`expr $length - $line` > $line.txt
# ищщем номер превой пустой строки
first_empty=`grep -n ^\$ $line.txt | head -1 | awk -F ':' '{print $1}'`
# достаём содержимое файла от первой пустой до конца - начало файла
# c куском письма теперь будет начало приаттаченного файла файла
cat $line.txt | tail -`expr $length - $first_empty` > $line.1.txt
# ищщем пустую строку - теперь это конец файла
first_empty=`grep -n ^\$ $line.txt | head -1 | awk -F ':' '{print $1}'`
# считаем дллинну файла - она изменилась
length_new="`wc -l $line.1.txt | awk '{print $1}'`"
# достаём файл - обрубаем по найденной позиции пустой строки
cat $line.1.txt | tail -`expr $length_new - $first_empty` > $line.zip.b64
# декодируем файл
b64decode -r $line.zip.b64 > $line.zip
cd $dst_dir && unzip -o $tmp/$line.zip
rm -rf $tmp
done
}
rm -rf $tmp
rm $file
jabber$
Код: Выделить всё
jabber$ grep expert /etc/aliases
expert: /tmp/file.eml
jabber$
работает медленно, поэтому файл переименовывается,чтобы не мешаться, так что пока один экземпляр работает можно ещё сыпать и сыпать файлов.
ну, письма, разумеется срезали на входе по отправителю получателю и копии всех валим на робота.
ему пофигу чё там внутри - всё раззипует и сложит
