Envie um email com um arquivo anexado usando telnet ou netcat

14

Costumo usar telnet ou netcat para conectar servidores smtp para enviar um email como um teste.

Alguém sabe como você enviaria um email usando telnet ou netcat mas também anexaria um arquivo ? Provavelmente existem maneiras melhores, mas eu ainda quero saber :-)

Eu ficaria feliz com uma solução que usa um pouco de bash shell para atingir o objetivo, mas não quer usar outras ferramentas ...

    
por Kyle Brandt 10.07.2009 / 15:55

9 respostas

9

Ok, então, usando os comentários de todos como ponto de partida, eu criei essa bagunça boba :-) ...

{ 
    sleep 5; 
    echo 'ehlo';
    sleep 3;
    echo 'MAIL FROM:<[email protected]>';
    sleep 3; 
    echo 'RCPT TO: <kyle@test_dest.com>';
    sleep 3;
    echo 'DATA';
    sleep 3;
    echo -e 'To:[email protected]\nMIME-Version: 1.0 (mime-construct 1.9)\nContent-Type: application/zip\nContent-Transfer-Encoding: base64\n\n';
    dd if=/dev/urandom bs=4 count=10 2>/dev/null | openssl base64;
    echo '.';
} | telnet mx1.testdest.com 25
    
por 10.07.2009 / 20:55
8

Ick. Você terá que codificar com base64 o anexo e criar os cabeçalhos MIME.

Em vez de gerar uma nova mensagem "on the fly" a cada vez, provavelmente seria mais fácil enviar por e-mail uma mensagem de exemplo muito curta de um programa de e-mail "real" (aproveitando o trabalho que as pessoas que escreveram) coloque o anexo na codificação correta e crie os cabeçalhos MIME).

Salve essa mensagem em um arquivo de texto com seus cabeçalhos (removendo o cabeçalho de transporte, é claro) e apenas modifique / copie / cole em telnet ou netcat para sessões futuras.

    
por 10.07.2009 / 16:02
6

Embora seja possível e viável testar manualmente os servidores SMTP à mão, é muito mais fácil usar uma ferramenta projetada para isso.

Este artigo explica SWAKS . swaks é projetado para testes de servidor SMTP. Suporta anexos, autenticação e criptografia!

    
por 10.07.2009 / 21:18
4

eu peguei essa entrada enquanto procurava algo do mesmo. e dos telespectadores aqui e mais alguma pesquisa eu consegui fazer este script.

#!/bin/sh

# Default reception
TOEMAIL="[email protected]";
# Default Subject
SUBJECT="You got mail - $DATE";
# Default Contents
MSGBODY="Hello, this is the default message body";
# Default Attachment
#ATTACHMENT="/tmp/testoutput"
# Default smtp server
mailserver="smtp.server.ltd"
mailserverPort="25"

showUsage() {
        echo "$0 -a /file/to/attach [-m /message/file] [-M \"Message string\"] -s \"subject\" -r [email protected]"
        echo
        echo "The attachment (-a) is required, if no attachment is used then rather use sendmail directly."
}

fappend() {
    echo "$2">>$1;
}
DATE='date'

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# This might need correction to work on more places, this is tested at a ubuntu 13.10 machine.  #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
domain='grep search /etc/resolv.conf | awk '{print $2;}''
computer='hostname'
user='whoami'
FREMAIL="$user@$computer.$domain"

while getopts "M:m:a:s:r:" opt; do
  case $opt in
        s)
          SUBJECT="$OPTARG - $DATE"
          ;;
        r)
          TOEMAIL="$OPTARG"
          ;;
        m)
          MSGBODY='cat $OPTARG'
          ;;
        M)
          MSGBODY="$OPTARG"
          ;;
        a)
          ATTACHMENT="$OPTARG"
          ;;
        :)
          showUsage
          ;;
        \?)
          showUsage
          ;;
  esac
done

if [ "$ATTACHMENT" = "" ]; then
        showUsage
        exit 1
fi

MIMETYPE='file --mime-type -b $ATTACHMENT'
TMP="/tmp/tmpmail_"'date +%N';
BOUNDARY='date +%s|md5sum|awk '{print $1;}''
FILENAME='basename $ATTACHMENT'

DATA='cat $ATTACHMENT|base64'

rm $TMP 2> /dev/null

fappend $TMP "EHLO $computer.$domain"
fappend $TMP "MAIL FROM:<$FREMAIL>"
fappend $TMP "RCPT TO:<$TOEMAIL>"
fappend $TMP "DATA"
fappend $TMP "From: $FREMAIL"
fappend $TMP "To: $TOEMAIL"
fappend $TMP "Reply-To: $FREMAIL"
fappend $TMP "Subject: $SUBJECT"
fappend $TMP "Content-Type: multipart/mixed; boundary=\"$BOUNDARY\""
fappend $TMP ""
fappend $TMP "This is a MIME formatted message.  If you see this text it means that your"
fappend $TMP "email software does not support MIME formatted messages."
fappend $TMP ""
fappend $TMP "--$BOUNDARY"
fappend $TMP "Content-Type: text/plain; charset=UTF-8; format=flowed"
fappend $TMP "Content-Disposition: inline"
fappend $TMP ""
fappend $TMP "$MSGBODY"
fappend $TMP ""
fappend $TMP ""
fappend $TMP "--$BOUNDARY"
fappend $TMP "Content-Type: $MIMETYPE; name=\"$FILENAME\""
fappend $TMP "Content-Transfer-Encoding: base64"
fappend $TMP "Content-Disposition: attachment; filename=\"$FILENAME\";"
fappend $TMP ""
fappend $TMP "$DATA"
fappend $TMP ""
fappend $TMP ""
fappend $TMP "--$BOUNDARY--"
fappend $TMP ""
fappend $TMP "."
fappend $TMP "quit"

netcat $mailserver $mailserverPort < $TMP >> $TMP
rc="$?"
if [ "$rc" -ne "0" ]; then
    echo "Returncode: $rc"
    echo "Please inspect $TMP"
else
    rm $TMP;
fi

Uma coisa que você pode querer adicionar é a autenticação. Eu não preciso disso, então eu não adicionei.

Acho que só é necessário md5sum , netcat , , awk e arquivo64 comandos, acho que eles são bastante padrão na maioria dos sistemas.

    
por 18.09.2013 / 15:00
3

Isso é o que estou fazendo para enviar e-mail com bash. Eu uso para me enviar um arquivo de log e endereço IP externo, fique à vontade para usá-lo:

#!/bin/bash
# Send email from bash with attachment
# by Psirac - www.subk.org
[email protected]
[email protected]
mailserver=smtp.test.com
mylogin='echo 'MYUSERNAME' | openssl base64'
mypassword='echo 'MYPASSWORD' | openssl base64'
myip='wget -qO- icanhazip.com'
myfile='cat /tmp/mytest.log | openssl base64'
mydate='date'

exec 9<>/dev/tcp/$mailserver/25
echo "HELO routeur.tripfiller" >&9
read -r temp <&9
#echo "$temp"
echo "auth login" >&9
read -r temp <&9
#echo "$temp"
echo "$mylogin=" >&9
read -r temp <&9
#echo "$temp"
echo "$mypasswd=" >&9
read -r temp <&9
#echo "$temp"
echo "Mail From: $from" >&9
read -r temp <&9
#echo "$temp"
echo "Rcpt To: $to" >&9
read -r temp <&9
#echo "$temp"
echo "Data" >&9
read -r temp <&9
#echo "$temp"
echo "To:$to" >&9
echo "MIME-Version: 1.0" >&9
echo "Subject: Test mail sended at $mydate" >&9
echo "From: $from" >&9
echo "To: $to" >&9
echo "Content-Type: multipart/mixed; boundary=sep" >&9
echo "--sep" >&9
echo "Content-Type: text/plain; charset=UTF-8" >&9
echo "Here your text..." >&9
echo "External IP adress: $myip" >&9
echo "--sep" >&9
echo "Content--Type: text/x-log; name=\"mytest.log\"" >&9
echo "Content-Disposition: attachment; filename=\"mytest.log\"" >&9
echo "Content-Transfer-Encoding: base64" >&9
echo "" >&9
echo "$myfile" >&9
echo "--sep--" >&9
echo "." >&9
read -r temp <&9
echo "$temp"
echo "quit" >&9
read -r temp <&9
echo "$temp"
9>&-
9<&-
#echo "All Done. See above for errors"
exit 0

Espero que tenha sido bom para você;)

psirac.

    
por 11.08.2012 / 16:19
3

Telnet - enviar e-mail com vários anexos

cat attachment.zip | base64 > zip.txt
cat attachment.pdf | base64 > pdf.txt

# Content-Type: text/csv; name="$FILE"                        # for CSV files
# Content-Type: application/x-msdownload; name="$FILE"    # for executable 
# Content-Type: text/xml; name="$FILE"                        # for xml files or try application/xml

telnet smtp.server.dom 25

HELO
MAIL FROM: [email protected]
RCPT TO: [email protected]
DATA
Subject: Test email
From: [email protected]
To: [email protected]
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="X-=-=-=-text boundary"

--X-=-=-=-text boundary
Content-Type: text/plain

Put your message here...

--X-=-=-=-text boundary
Content-Type: application/zip; name="file.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="file.zip"

UEsDBBQAAAAIAG1+zEoQa.... copy/paste zip.txt

--X-=-=-=-text boundary
Content-Type: text/pdf; name="file.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="file.pdf"

UEsDBBQAAAAIAG1+zEoQa.... copy/paste pdf.txt

--X-=-=-=-text boundary
.

QUIT
    
por 13.06.2017 / 02:53
1

Você precisará revisar a especificação do protocolo SMTP. É uma leitura surpreendentemente leve para uma especificação técnica e ajudará você a entender como o processo de e-mail funciona.

Especificamente, perceba que os anexos são convertidos em tipos MIME e codificados em texto, portanto quaisquer anexos que você gostaria de enviar via telnet teriam que ser convertidos em texto e transmitidos como tal através do protocolo telnet.

    
por 10.07.2009 / 16:01
1

Se tudo o que você está testando é 'o anexo entregou', você pode usar o padrão de anexos pré-MIME: uuencode. Ao contrário do MIME, é muito mais simples criar mensagens. Ao contrário do MIME, não requer cabeçalhos. No entanto, nem todos os clientes de e-mail reconhecem arquivos uuencoded como anexos, então sugiro testar para ver se você pode usá-los. Se isso acontecer, você acabou de poupar muito esforço. Se isso não acontecer, pré-construir a sua mensagem MIMEed via perl ou algo assim, e canalizá-la através de algo como o NetCat é provavelmente o caminho a percorrer.

Vale uma olhada.

    
por 10.07.2009 / 16:47
1

Existe um maravilhoso script Perl para este trabalho. Você pode encontrá-lo aqui:

link

smtp-cli v2.9

Script é do autor: Michal Ludvig (c) 2003-2011 link

Eu mesmo uso e funciona muito bem, graças ao Michal;)

    
por 11.12.2011 / 15:23