Envie um email com um arquivo anexado usando telnet ou netcat

15

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

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

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

Kyle Brandt
fonte
1
ehlo, isso provavelmente incluirá a criação de um anexo mime em um arquivo, codifique-o e cole-o em sua janela. Embora possa ser muito útil poder telnetar para um servidor SMTP, escreva um correio curto e envie-o (e eu posso), enviar um arquivo como esse simplesmente não é muito prático. Tente 'sendfile' ou 'mutt' (mesmo que você não goste de usar ferramentas).
1113 Andrioid
Logo após eco '.'; você pode querer adicionar este eco '.'; dormir 3; eco 'sair';

Respostas:

10

Ok, então usando os comentários de todos como ponto de partida, eu vim com 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
Kyle Brandt
fonte
Embora desde que eu estou apenas enviar dados aleatórios, não tenho certeza se os dados são ainda intactos ...
Kyle Brandt
Você tem uma tolerância maior ao tédio do que eu! > smile <
Evan Anderson
Como eu poderia alterar isso para enviar um arquivo de texto específico?
user987654321
8

Ick. Você precisará codificar o anexo em base64 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 uma mensagem de exemplo muito curta de um programa de email "real" (aproveitando o trabalho que as pessoas que a escreveram fizeram para colocar o anexo na codificação adequada e na criação dos 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-o no telnet ou no netcat para sessões futuras.

Evan Anderson
fonte
6

Embora o teste manual de servidores SMTP manualmente seja possível e viável, o uso de uma ferramenta projetada para isso será muito mais fácil.

Este artigo explica SWAKS . O swaks foi desenvolvido para testes do servidor smtp. Suporta anexos, autenticação e criptografia!

hayalci
fonte
+1 Agora, isso é algo que vou começar a usar! :-)
Kyle Brandt
4

entrei nessa entrada enquanto procurava algo do mesmo. e dos awnsers aqui e algumas pesquisas adicionais eu consegui fazer esse 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 o adicionei.

Eu acho que só requer md5sum , netcat , file , awk e os comandos base64 , acho que eles são bastante padrão na maioria dos sistemas.

ravenmeister
fonte
Seria possível adicionar vários anexos facilmente a esta solução?
TryTryAgain
3

É isso que estou fazendo para enviar email com o bash. Eu o uso para me enviar um arquivo de log e um 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.

psirac
fonte
3

Telnet - envie email com vários anexos

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

# Tipo de conteúdo: text / csv; name = "$ FILE" # para arquivos CSV
# Tipo de conteúdo: application / x-msdownload; name = "$ FILE" # para executável
# Tipo de conteúdo: text / xml; name = "$ FILE" # para arquivos xml ou tente application / xml

telnet smtp.server.dom 25

OLÁ
CORREIO DE: [email protected]
RCPT TO: [email protected]
DADOS
Assunto: Test email
De: [email protected]
Para: [email protected]
Versão MIME: 1.0
Tipo de Conteúdo: multipart / misto; limite = "X - = - = - = - limite do texto"

--X - = - = - = - limite do texto
Tipo de Conteúdo: text / plain

Coloque sua mensagem aqui ...

--X - = - = - = - limite do texto
Tipo de conteúdo: application / zip; nome = "arquivo.zip"
Codificação de transferência de conteúdo: base64
Disposição de conteúdo: anexo; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... copiar / colar zip.txt

--X - = - = - = - limite do texto
Tipo de Conteúdo: texto / pdf; nome = "arquivo.pdf"
Codificação de transferência de conteúdo: base64
Disposição de conteúdo: anexo; filename = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... copiar / colar pdf.txt

--X - = - = - = - limite do texto
.

SAIR
Anrik
fonte
1
Bem-vindo ao serverfault. Pessoas que postam respostas como a sua são realmente bem-vindas neste site! :) gratz
bgtvfr
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 email funciona.

Especificamente, saiba que os anexos são convertidos em tipos MIME e codificados em texto; portanto, todos os anexos que você deseja enviar via telnet precisam ser convertidos em texto e transmitidos como tal através do protocolo telnet.

sangretu
fonte
1

Se tudo o que você está testando é 'o anexo foi entregue', é possível que você se acostume a usar o padrão pré-MIME de anexos: uuencode. Ao contrário do MIME, é muito mais simples criar mensagens. Ao contrário do MIME, ele não requer cabeçalhos. No entanto, nem todos os clientes de email reconhecem mais os arquivos codificados como anexos, por isso sugiro testar para ver se você pode usá-lo. Nesse caso, você acabou de economizar muito esforço. Caso contrário, pré-construir 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.

sysadmin1138
fonte
20 anos atrás, essa foi uma boa resposta. Agora não. Use uma das muitas bibliotecas MIME e crie um email compatível com MIME, completo com a codificação Base64.
James.garriss