Ubuntu 15.10 server - Preciso de um cliente de e-mail no meu servidor para obter, ler e analisar e-mails?

0

Eu quero escrever alguns scripts para o meu servidor ler e analisar e-mails em [email protected] para, por exemplo, ajustar a lista de permissões ou a lista negra do firewall do iptables. Ao expandir a automação residencial, terei mais usos para esse recurso.

Eu preciso mesmo de um cliente de e-mail? Eu me pergunto se ter apenas um MTA no meu servidor pode colocar e-mails recebidos em algum lugar do sistema de arquivos onde um script poderia lê-lo e analisá-lo. Eu tenho postfix instalado que está me dando capacidade de envio de e-mail (e me dando o MTA, eu acredito).

A conta de e-mail que o sistema usaria para isso é aquela fornecida pelo ISP do bairro (Walnut Communications). Atualmente, eu não uso essa conta de e-mail para nada nem uso meus servidores para ler e-mails para qualquer outra coisa. Uma pergunta secundária que tenho nessa linha é ' Por que posso enviar e-mails sem que eles sejam autenticados por meio da conta de e-mail Walnutel.net para fornecer as credenciais ou credibilidade que eu achava que a infraestrutura de e-mail da Internet exigiria? '

Se eu pudesse entender essas duas coisas, poderia progredir muito mais. Observe que o servidor é headless, CLI e autônomo, portanto, não tenho nenhum uso para navegar em uma caixa de entrada de e-mail no / por ele.

Editar 25/12/15: Eu aprendi que a metodologia de e-mail que eu procuro é chamada de "bash sockets". Ainda não está claro para mim, em minha pesquisa, se precisarei autenticar com minhas credenciais de conta de e-mail local para enviar e-mails de forma confiável para minha conta do gmail não local e se precisarei usar SSL (TLS, etc). Se for necessário usar SSL / TLS para se comunicar com servidores de e-mail, temo que terei muito trabalho para encontrar exemplos de script bash disso.

    
por kenneth558 19.12.2015 / 02:41

2 respostas

0

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.

    
por kenneth558 16.01.2016 / 22:33
0
% bl0ck_qu0te%

Sim, recuperar e-mail de um servidor de e-mail distante é, por definição, um trabalho do cliente de e-mail. Ele não precisa ser um programa de desktop completo como o Thunderbird, no entanto, fetchmail deve fazer o trabalho para você.

% bl0ck_qu0te%

Pela mesma razão, você pode escrever qualquer endereço no canto superior esquerdo de um envelope antes de colocá-lo na caixa sem provar que você realmente mora lá: certificar a identidade do remetente não é uma meta do sistema.

    
por fkraiem 19.12.2015 / 07:16