Consegui buscar e analisar emails com bash-socket-scripting sem qualquer cliente de email. Isso foi facilitado em virtude do meu ISP (Walnut Communications) não exigir que o SSL baixasse e-mails de seu servidor de e-mail. Se eu precisasse fazer isso dentro da rede da Cox Communications, que afirmava verbalmente que eles exigem SSL para fazer o mesmo, teria sido mais difícil, porque o comando openssl s_client -connect pop.cox.net:995 -CApath /etc/ssl/certs
necessário parece ser apenas interativo.
Aqui está o script bash para fazer login em uma conta de e-mail fornecida pelo ISP local que não requer SSL. Esteja ciente de que a senha é texto simples neste exemplo SCRIPT, então você pode querer adicionar uma medida de ocultação de senha para esses comandos.
#!/bin/bash
# interactive use enabled by [ ! -z $PS1 ] && echo...
exec 5<>/dev/tcp/pop3.walnutel.net/110
read -t 2 -u 5 HELO;[ ! -z $PS1 ] && echo "$HELO"
echo -e "user email_account_name_here\r" >&5 #prepend account name with "user "
read -t 2 -u 5 sendyourpassword;[ ! -z $PS1 ] && echo $sendyourpassword
echo -e "pass password_here\r" >&5 #prepend password with "pass "
read -t 2 -u 5 maildroplockedandready;[ ! -z $PS1 ] && echo -e $maildroplockedandready
echo -e "list\r" >&5
echo "" > ~/mailcontent;numofemails=-1;echo "" > ~/email_fetch_parse.log
while read -t 2 -u 5 emailtitle; do
[ ! -z $PS1 ] && echo "$emailtitle"
[ $(( ${#emailtitle} )) -lt 3 ] && break
if [ $(( ${#emailtitle} )) -lt 20 ]; then
#add to array of emailtitlnums
numofemails=$(( $numofemails + 1 ))
emailtitlenums[ $((numofemails)) ]=${emailtitle% *}
fi
done
if [ $((numofemails)) -gt -1 ]; then
for i in 'seq 0 $((numofemails))';do
echo -e "RETR ${emailtitlenums[i]}\r" >&5
boundary=""
while read -t 2 -u 5 mailcontentline;do
[ ! -z $PS1 ] && echo "$mailcontentline"
mailcontentline="${mailcontentline:: -1} " #strip the linefeed and put space there instead
if [ -z "$boundary" ];then [ $(echo "$mailcontentline"|grep -e "^Content-Type: "|grep -c "; boundary=") -gt 0 ] && boundary="$(echo "$mailcontentline"|grep -e "^Content-Type: " -e "; boundary="|/usr/bin/awk -F= '{print $2}')"
else
echo "$(grep -e "search string 1" -e "search string 2,etc" <(echo "$mailcontentline"))" >> ~/mailcontent #save lines of interest
[ $(bc <<<"${#mailcontentline} - ${#boundary}") -eq 4 ] && [ "${mailcontentline:2: -3}" == "${boundary:: -1}" ] && (for i in 'seq 1 4'; do read -t 2 -u 5 mailcontentline;done) && break #
fi
done
done
for i in 'seq 0 $((numofemails))';do # to delete emails immediately
echo -e "dele ${emailtitlenums[i]}\r" >&5
while read -t 2 -u 5 deleteresponse;do [ ! -z $PS1 ] && echo "$deleteresponse";[ $(( ${#deleteresponse} )) -lt 1 ] && break;done
done
# parse ~/mailcontent here if you want. It now contains lines of interest from all emails read
else
[ ! -z $PS1 ] && echo "Inbox is empty" # >> ~/email_fetch_parse.log
fi
echo -e "QUIT\r" >&5
exec 5>&-
Na segunda questão, perguntei que aprendi que o serviço de mensagens de texto do meu provedor de celular parou de aceitar e-mails diretos recentemente do meu sistema [não autenticado]. Isso significa que meu sistema não pode mais me enviar textos de eventos de segurança em casa até que eu receba scripts para autenticar em uma das minhas contas de e-mail de autenticação que ainda é capaz de me enviar mensagens. Portanto, com o shell script, eliminei a necessidade de um cliente de email buscar e-mails, e assim que o script está funcionando para e-mails enviados, meu sistema de segurança não precisará mais de nenhuma ferramenta de email de terceiros, seja mailutils, procmail, sendmail, ou etc. A vantagem para mim é que não terei configurações de configuração desconhecidas para mim e difíceis / inconvenientes para determinar seus valores apropriados necessários em minha aplicação.