Invia un'e-mail con un file allegato utilizzando telnet o netcat


15

Uso spesso telnet o netcat per connettere server smtp per inviare una e-mail come test.

Qualcuno sa come manderesti un'email tramite telnet o netcat ma allega anche un file ? Probabilmente ci sono modi migliori, ma voglio ancora sapere :-)

Sarei felice con una soluzione che utilizza una piccola shell bash per raggiungere l'obiettivo, ma non voglio usare altri strumenti ...


1
ehlo, questo probabilmente includerà la creazione di un allegato mime in un file, la codifica e quindi lo incolla nella tua finestra. Mentre può essere molto utile essere in grado di telnetare solo su un server SMTP, scrivere una breve e-mail e inviarlo (e posso), inviare un file del genere non è molto pratico. Prova 'sendfile' o 'mutt' (anche se non ti piace usare gli strumenti).
Andrioid,

Subito dopo l' eco '.'; potresti voler aggiungere questo eco '.'; dormire 3; echo 'quit';

Risposte:


10

Ok, quindi usando i commenti di tutti come punto di partenza mi sono inventato questo stupido pasticcio :-) ...

{ 
    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

Anche se dato che sto solo inviando dati casuali, non sono sicuro che i dati rimangano intatti ...
Kyle Brandt,

Hai una tolleranza maggiore per il tedio di me! > smile <
Evan Anderson,

Come posso alterarlo per inviare un file di testo specifico?
user987654321

8

Ick. Dovrai codificare in base64 l'allegato e creare le intestazioni MIME.

Invece di generare un nuovo messaggio "al volo" ogni volta, probabilmente sarebbe più semplice inviarti un breve messaggio di esempio da un "vero" programma di posta elettronica (sfruttando il lavoro che le persone che l'hanno scritto hanno fatto per mettere l'allegato nella codifica corretta e nella creazione delle intestazioni MIME).

Salva quel messaggio in un file di testo con le sue intestazioni (rimuovendo ovviamente l'intestazione del trasporto) e modificalo / copia / incolla in telnet o netcat per sessioni future.


6

Mentre il test manuale dei server SMTP è possibile e fattibile a mano, l'utilizzo di uno strumento progettato per questo sarà molto più semplice.

Questo articolo spiega SWAKS . swaks è progettato per il test del server smtp. Supporta allegati, autenticazione e crittografia!


+1 Ora è qualcosa che inizierò a usare! :-)
Kyle Brandt,

4

ho tremato su questa voce mentre cercavo qualcosa dello stesso. e dai produttori di tende e altre ricerche sono riuscito a realizzare questo 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

Una cosa che potresti voler aggiungere è l'autenticazione. non ne ho bisogno quindi non l'ho aggiunto.

Penso che richieda solo i comandi md5sum , netcat , file , awk e base64 , immagino che siano piuttosto standard nella maggior parte dei sistemi.


Sarebbe possibile aggiungere facilmente più allegati a questa soluzione?
Prova TryAgain

3

Questo è quello che sto facendo per inviare e-mail con bash. Lo uso per inviarmi un file di registro e un indirizzo IP esterno, sentitevi liberi di usarlo:

#!/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

Spero che sia stato buono per te;)

psirac.


3

Telnet: invia e-mail con più allegati

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

# Content-Type: text / csv; name = "$ FILE" # per i file CSV
# Content-Type: application / x-msdownload; name = "$ FILE" # per eseguibile
# Content-Type: text / xml; name = "$ FILE" # per file xml o prova application / xml

telnet smtp.server.dom 25

HELO
POSTA DA: email@server.com
RCPT A: email@server.com
DATI
Oggetto: Email di prova
Da: email@server.com
A: email@server.com
Versione MIME: 1.0
Tipo di contenuto: multipart / misto; limite = "X - = - = - = - limite del testo"

--X - = - = - = - limite del testo
Tipo di contenuto: testo / semplice

Metti il ​​tuo messaggio qui ...

--X - = - = - = - limite del testo
Tipo di contenuto: application / zip; name = "file.zip"
Codifica trasferimento-contenuto: base64
Disposizione del contenuto: allegato; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... copia / incolla zip.txt

--X - = - = - = - limite del testo
Tipo di contenuto: testo / pdf; name = "file.pdf"
Codifica trasferimento-contenuto: base64
Disposizione del contenuto: allegato; filename = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... copia / incolla pdf.txt

--X - = - = - = - limite del testo
.

SMETTERE

1
Benvenuti in serverfault. Le persone che pubblicano risposte come la tua sono davvero benvenute su questo sito! :) gratz
bgtvfr

1

Dovrai rivedere le specifiche del protocollo SMTP. È una lettura sorprendentemente leggera per una specifica tecnica e ti aiuterà a capire come funziona il processo di posta elettronica.

In particolare, renditi conto che gli allegati vengono convertiti in tipi MIME e codificati in testo, quindi qualsiasi allegato che desideri inviare tramite telnet dovrebbe essere convertito in testo e trasmesso come tale tramite il protocollo telnet.


1

Se tutto ciò che stai testando è "ha consegnato l'allegato", potresti probabilmente cavartela usando lo standard pre-MIME degli allegati: uuencode. A differenza di MIME, creare messaggi è molto più semplice. A differenza di MIME, non richiede intestazioni. Tuttavia, non tutti i client di posta riconoscono più i file codificati come allegati, quindi suggerisco di provare per vedere se puoi usarli. Se lo fa, ti sei appena risparmiato un sacco di sforzo. In caso contrario, pre-costruire il tuo messaggio MIME tramite perl o qualcosa del genere e reindirizzarlo attraverso qualcosa come NetCat è probabilmente la strada da percorrere.

Vale la pena dare un'occhiata.


20 anni fa questa è stata una buona risposta. Non adesso. Utilizzare una delle molte librerie MIME e creare un'e-mail conforme a MIME, completa di codifica Base64.
james.garriss,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.