Юникс шелл навсегда - [entries|archive|friends|userinfo]
Юникс шелл навсегда

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

[Feb. 2nd, 2006|07:06 pm]
Previous Entry Add to Memories Tell A Friend Next Entry

shell_ljr

[do_]
скрипт, который извлекает всю почту, лежащую в какой-либо IMAP4 директории, и сохраняет локально в виде eml-файлов:



#!/bin/bash
((desc=($RANDOM+10)%1024))
user=$1
shift
passwd=$1
shift
address=$1
if [[ -z "$address" ]]; then
        address=localhost:143
fi
port=${address#*:}
if [[ -z "$port" ]]; then
        port=143
fi
address=${address%:*}
shift
mailbox=$*
if [[ -z "$mailbox" ]]; then
        mailbox=INBOX
fi

num=10
die()
{
echo $*
exit -1
}
imap_cmd_complex()
{
        local response_callback=$1
        shift
        local body_callback=$1
        shift
        echo "a$num $*"$'\r'>&$desc

        local prefix=
        local mess=
        local line=
        #read prefix status mess<&$desc
        local IFS=
        while read line;
        do
                prefix=${line%% *}
                mess=${line#* }
#               echo "prefix: $prefix, mess: $mess"
                if [[ "$prefix" == "*" ]]; then
                        eval $response_callback \$mess
                elif [[ "$prefix" == "a$num" ]]; then
                        local status=${mess%% *};

                        echo "status: $status, text: ${mess#* }"
                        case $status in
                                "OK") return 0
                                ;;
                                "BAD") return -1
                                ;;
                        esac
                else
                        eval $body_callback \$line
                fi
        done<&$desc
        ((num++))
}
imap_cmd()
{
        skip()
        {
                echo dummy>/dev/null
        }

        local response_callback=$1
        shift
        imap_cmd_complex $response_callback skip $*
}
imap_cmd_simple()
{
imap_cmd echo $*
}

on_search()
{
ALL_MESS=$*
ALL_MESS=${ALL_MESS#SEARCH }
}
on_fetch_body()
{
        local line=$*
        if [[ $line != ")" ]]; then
                echo "$line">>$MSG_UID.eml
        fi


#       echo line: $line
}
on_fetch()
{
        local line=$*
        MSG_UID=${line#*FETCH*(UID }
        MSG_UID=${MSG_UID%)*}
        echo UID: $MSG_UID
}
exec_cmd="exec $desc<>/dev/tcp/$address/$port"
eval $exec_cmd
read banner<&$desc
echo "banner: $banner"
#IFS=
imap_cmd_simple "login $user $passwd" || die "Unsuccessfull login"
imap_cmd_simple SELECT \"$mailbox\" || die "Can't select inbox"
imap_cmd on_search SEARCH ALL
echo ALL_MESS: $ALL_MESS 
for mess in $ALL_MESS
do
        imap_cmd on_fetch "fetch $mess UID"
        if [[ ! -e $MSG_UID.eml ]]; then
                imap_cmd_complex echo on_fetch_body  "fetch $mess RFC822"
        fi
done
imap_cmd_simple logout





Пользоваться следующим образом:

FetchMail.sh username passord [ mailserver:port [ folder ] ]
LinkLeave a comment