Wyślij wiadomość e-mail z załączonym plikiem za pomocą telnet lub netcat

15

Często używam telnet lub netcat do łączenia serwerów smtp w celu wysłania wiadomości e-mail jako testu.

Czy ktoś wie, jak wysłać wiadomość e-mail za pomocą telnet lub netcat, ale również załączyć plik ? Są prawdopodobnie lepsze sposoby, ale nadal chcę wiedzieć :-)

Byłbym zadowolony z rozwiązania wykorzystującego małą powłokę bash do osiągnięcia celu, ale nie chcę używać żadnych innych narzędzi ...

Kyle Brandt
źródło
1
ehlo, prawdopodobnie obejmie to utworzenie załącznika mime w pliku, zakodowanie go, a następnie wklejenie do okna. Chociaż może być bardzo przydatne, aby móc po prostu telnet do serwera SMTP, napisać krótką pocztę i wysłać ją (i mogę), wysyłanie takiego pliku po prostu nie jest bardzo praktyczne. Spróbuj „sendfile” lub „mutt” (nawet jeśli nie lubisz korzystać z narzędzi).
Andrioid
Zaraz po echu '.'; możesz dodać to echo '.'; spać 3; echo „quit”;

Odpowiedzi:

10

Okej, więc wykorzystując komentarze wszystkich jako punkt wyjścia wymyśliłem ten głupi bałagan :-) ...

{ 
    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
źródło
Mimo, ponieważ jestem tylko wysyłanie danych losowych, nie wiem, czy dane są pozostały nienaruszone ...
Kyle Brandt
Masz wyższą tolerancję na nudę niż ja! > uśmiech <
Evan Anderson
Jak mogę to zmienić, aby wysłać określony plik tekstowy?
user987654321,
8

Ick. Musisz zakodować załącznik w base64 i utworzyć nagłówki MIME.

Zamiast generować nową wiadomość „w locie” za każdym razem łatwiej byłoby po prostu wysłać sobie krótką przykładową wiadomość z „prawdziwego” programu pocztowego (wykorzystując pracę wykonaną przez ludzi, którzy ją napisali, aby umieścić załącznik do właściwego kodowania i tworzenia nagłówków MIME).

Zapisz tę wiadomość w pliku tekstowym z nagłówkami (oczywiście usuwając nagłówek transportowy) i po prostu zmodyfikuj / skopiuj / wklej go do telnet lub netcat na przyszłe sesje.

Evan Anderson
źródło
6

Podczas gdy ręczne testowanie serwerów SMTP jest możliwe i wykonalne, użycie zaprojektowanego do tego narzędzia będzie znacznie łatwiejsze.

Ten artykuł wyjaśnia SWAKS . swaks jest przeznaczony do testowania serwera smtp. Obsługuje załączniki, uwierzytelnianie i szyfrowanie!

Hayalci
źródło
+1 Teraz zacznę używać! :-)
Kyle Brandt
4

wymamrotałem ten wpis, gdy szukałem czegoś podobnego. a od awnserów tutaj i niektórych dodatkowych badań udało mi się zrobić ten skrypt.

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

Jedną rzeczą, którą możesz chcieć dodać, jest uwierzytelnianie. Nie potrzebuję tego, więc nie dodałem go.

Myślę, że wymaga to tylko poleceń md5sum , netcat , file , awk i base64 , domyślam się, że są one dość standardowe w większości systemów.

ravenmeister
źródło
Czy w tym rozwiązaniu można łatwo dodawać wiele załączników?
TryTryAgain
3

To właśnie robię, aby wysłać e-mail za pomocą bash. Używam go, aby wysłać mi plik dziennika i zewnętrzny adres IP, możesz go użyć:

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

Mam nadzieję, że to było dla ciebie dobre;)

psirac.

psirac
źródło
3

Telnet - wysyłaj wiadomości e-mail z wieloma załącznikami

kot załącznik. zip | base64> zip.txt
kot załącznik.pdf | base64> pdf.txt

# Content-Type: text / csv; name = „$ FILE” # dla plików CSV
# Content-Type: application / x-msdownload; name = "$ FILE" # dla pliku wykonywalnego
# Content-Type: text / xml; name = "$ FILE" # dla plików xml lub spróbuj application / xml

telnet smtp.server.dom 25

HELO
POCZTA OD: [email protected]
RCPT DO: [email protected]
DANE
Temat: Testowy e-mail
Od: [email protected]
Do: [email protected]
Wersja MIME: 1.0
Content-Type: wieloczęściowy / mieszany; granica = "X - = - = - = - granica tekstu"

--X - = - = - = - granica tekstu
Content-Type: tekst / zwykły

Umieść tutaj swoją wiadomość ...

--X - = - = - = - granica tekstu
Content-Type: application / zip; name = "plik.zip"
Content-Transfer-Encoding: base64
Treść-Dyspozycja: załącznik; nazwa_pliku = „plik.zip”

UEsDBBQAAAAIAG1 + zEoQa .... skopiuj / wklej zip.txt

--X - = - = - = - granica tekstu
Content-Type: text / pdf; name = "file.pdf"
Content-Transfer-Encoding: base64
Treść-Dyspozycja: załącznik; nazwa pliku = „plik.pdf”

UEsDBBQAAAAIAG1 + zEoQa .... skopiuj / wklej pdf.txt

--X - = - = - = - granica tekstu
.

PORZUCIĆ
Anrik
źródło
1
Witaj w serverfault. Osoby, które zamieszczają odpowiedzi takie jak Twoja, są naprawdę mile widziane na tej stronie! :)
gratz
1

Musisz przejrzeć specyfikację protokołu SMTP. Jest to zaskakująco lekka lektura dla specyfikacji technicznej i pomoże ci zrozumieć, jak działa proces e-mail.

W szczególności pamiętaj, że załączniki są konwertowane na typy MIME i kodowane w tekście, więc wszelkie załączniki, które chcesz wysłać przez telnet, musiałyby zostać przekonwertowane na tekst i przesłane jako takie za pomocą protokołu telnet.

sangretu
źródło
1

Jeśli wszystko, co testujesz, to „czy załącznik dostarczył”, być może uciekniesz się przed użyciem standardu załączników sprzed MIME: uuencode. W przeciwieństwie do MIME tworzenie wiadomości jest znacznie prostsze. W przeciwieństwie do MIME nie wymaga żadnych nagłówków. Jednak nie wszyscy klienci poczty rozpoznają pliki nie zakodowane jako załączniki, więc sugeruję przetestowanie, aby sprawdzić, czy możesz ich użyć. Jeśli tak, po prostu zaoszczędziłeś sporo wysiłku. Jeśli tak się nie stanie, prawdopodobnie najlepiej jest zbudować wiadomość MIMEed za pomocą perla lub czegoś innego i przesłać ją przez coś takiego jak NetCat.

Warte zobaczenia.

sysadmin1138
źródło
20 lat temu była to dobra odpowiedź. Nie teraz. Użyj jednej z wielu bibliotek MIME i utwórz wiadomość e-mail zgodną z MIME, wraz z kodowaniem Base64.
james.garriss,