| |
[Feb. 2nd, 2006|07:06 pm] |
скрипт, который извлекает всю почту, лежащую в какой-либо 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 ] ] |
|
|