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 ...


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:<Test@test.com>';
    sleep 3; 
    echo 'RCPT TO: <kyle@test_dest.com>';
    sleep 3;
    echo 'DATA';
    sleep 3;
    echo -e 'To:kyle@testdest.com\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

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.


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!


+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="myEmail@domain.ltd";
# 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 receiver@domain.com"
        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.


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
from=myfromadress@test.com
to=mytoadress@test.com
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.


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@server.com
RCPT TO: email@server.com
DADOS
Assunto: Test email
De: email@server.com
Para: email@server.com
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

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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.