Каков наилучший метод для получения отправителя / субъекта из pop3 acct через командную строку?
Мне просто нужно получить только адрес электронной почты отправителя и тему письма из учетной записи pop3, из командной строки или сценария BASH. Я работаю на компьютерах MacOS X, но хочу избежать AppleScript. Я смотрел на getmail_fetch
, но, похоже, это сводит на нет всю электронную почту - я надеялся на что-то более эффективное в пространстве / времени. Есть какой-то очевидный трюк, который я пропускаю?
2 ответа
Решение с использованием наследства ш.
#!/bin/sh
#
#
STATE=1
USER=myname
PASS=mypass
HOST=mail.example.com
PORT=pop3
MSGFILE=/tmp/msgid
POPFILE=/tmp/popcmds
DONE=/tmp/popdone
doneproc()
{
cat $DONE.tail $DONE.telnet | while read p; do kill -9 $p; done
rm -f $POPFILE $MSGFILE $DONE.tail $DONE.telnet
exit
}
reqmsg()
{
MSGID=`head -1 $MSGFILE`
if [ -z "$MSGID" ]; then echo "QUIT" >>$POPFILE; doneproc; fi
tail -n +2 $MSGFILE > $MSGFILE-
mv $MSGFILE- $MSGFILE
echo "TOP $MSGID" >>$POPFILE
}
rm -f $MSGFILE $DONE.tail $DONE.telnet
> $MSGFILE
> $POPFILE
sh -c "echo \$\$ > $DONE.tail; exec tail -f $POPFILE" | sh -c "echo \$\$ > $DONE.telnet; exec telnet $HOST $PORT" | while read -t 10 f
do
case "$STATE" in
1) case "$f" in
+OK*) echo "USER $USER" >>$POPFILE; STATE=2;;
esac;;
2) case "$f" in
+OK*) echo "PASS $PASS" >>$POPFILE; STATE=3;;
*) echo "Bad response to user command ($f)" >&2; exit 1;;
esac;;
3) case "$f" in
+OK*) echo "LIST" >>$POPFILE; STATE=4;;
*) echo "Bad response to password command ($f)" >&2; exit 1;;
esac;;
4) case "$f" in
+OK*) STATE=5;;
*) echo "Bad response to LIST command ($f)" >&2; exit 1;;
esac;;
5) case "$f" in
.*) reqmsg; STATE=6;;
[0-9]*) msgid=`echo $f | awk '{print $1;}'`
echo $msgid >> $MSGFILE;;
*) echo "Bad response to LIST command ($f)" >&2; exit 1;;
esac;;
6) case "$f" in
+OK*) STATE=7;;
*) echo "Bad response to TOP command ($f)" >&2; exit 1;;
esac;;
7) case "$f" in
.*) echo "---"; reqmsg; STATE=6;;
From:*) echo $f;;
Subject:*) echo $f;;
esac;;
*) echo STATE $STATE and got $f;;
esac
done
Решение с использованием современного bash.
#!/bin/bash
#
#
STATE=1
USER=myname
PASS=mypass
HOST=mail.example.com
PORT=pop3
declare -A MSGIDS
declare -i NUMID
NUMID=0
declare -i CURID
CURID=0
coproc telnet $HOST $PORT
reqmsg()
{
if [ $CURID = $NUMID ]; then echo "QUIT" >&${COPROC[1]}; fi
echo "TOP ${MSGIDS[$CURID]}" >&${COPROC[1]}
((CURID++))
}
while read -t 10 f <&${COPROC[0]}
do
case "$STATE" in
1) case "$f" in
+OK*) echo "USER $USER" >&${COPROC[1]}; STATE=2;;
esac;;
2) case "$f" in
+OK*) echo "PASS $PASS" >&${COPROC[1]}; STATE=3;;
*) echo "Bad response to user command ($f)" >&2; exit 1;;
esac;;
3) case "$f" in
+OK*) echo "LIST" >&${COPROC[1]}; STATE=4;;
*) echo "Bad response to password command ($f)" >&2; exit 1;;
esac;;
4) case "$f" in
+OK*) STATE=5;;
*) echo "Bad response to LIST command ($f)" >&2; exit 1;;
esac;;
5) case "$f" in
.*) reqmsg; STATE=6;;
[0-9]*) read msgid size < <(echo $f)
MSGIDS[$NUMID]=$msgid
((NUMID++));;
*) echo "Bad response to LIST command ($f)" >&2; exit 1;;
esac;;
6) case "$f" in
+OK*) STATE=7;;
*) echo "Bad response to TOP command ($f)" >&2; exit 1;;
esac;;
7) case "$f" in
.*) echo "---"; reqmsg; STATE=6;;
From:*) echo $f;;
Subject:*) echo $f;;
esac;;
*) echo STATE $STATE and got $f;;
esac
done
Я только что проверил эти сценарии на Linux Mint Quiana и Scientific Linux, оба работают нормально, с небольшими изменениями. Как и в предыдущем комментарии, TOP на моем сервере, похоже, нужны 2 аргумента, но, поскольку вы просматриваете только заголовки почты, просто добавьте пробел и 0 в конце команды TOP (0 содержит только заголовки почты), т.е.
(первый сценарий)
echo "TOP $MSGID 0" >>$POPFILE
или (второй сценарий)
echo "TOP ${MSGIDS[$CURID]} 0" >&${COPROC[1]}
Мне также нужно было изменить "read -t 10 f" на "read -t 50 f", так как мой POP3-сервер кажется довольно медленным.
Scientific Linux был доволен вызовом оболочки "sh", однако Mint требовалось, чтобы ссылки на "sh" были изменены на "bash", тогда все было хорошо
Наконец, чтобы не оставлять свой пароль POP3 в файле скрипта, лучше попросить его запустить скрипт:
т.е.
echo "enter password for this POP3 email connecton"
read password
PASS=$password