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


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

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.


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!


+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="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

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.


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

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

psirac.


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@server.com
RCPT DO: email@server.com
DANE
Temat: Testowy e-mail
Od: email@server.com
Do: email@server.com
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Ć

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.


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.


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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.