Kirim email dengan file terlampir menggunakan telnet atau netcat

15

Saya sering menggunakan telnet atau netcat untuk menghubungkan server smtp untuk mengirim email sebagai ujian.

Apakah ada yang tahu bagaimana Anda akan mengirim email menggunakan telnet atau netcat tetapi juga melampirkan file ? Mungkin ada cara yang lebih baik, tetapi saya masih ingin tahu :-)

Saya akan senang dengan solusi yang menggunakan shell bash kecil untuk mencapai tujuan, tetapi tidak ingin menggunakan alat lain ...

Kyle Brandt
sumber
1
ehlo, ini mungkin termasuk membuat lampiran mime dalam file, menyandikannya dan kemudian menempelkannya ke jendela Anda. Meskipun bisa sangat berguna untuk hanya bisa telnet ke server SMTP, menulis surat pendek dan mengirimkannya (dan saya bisa), mengirim file seperti itu tidak terlalu praktis. Coba 'sendfile' atau 'mutt' (bahkan jika Anda tidak suka menggunakan alat).
Andrioid
Tepat setelah gema '.'; Anda mungkin ingin menambahkan gema ini '.'; tidur 3; gema 'berhenti';

Jawaban:

10

Oke, jadi menggunakan komentar semua orang sebagai titik awal saya membuat kekacauan konyol ini :-) ...

{ 
    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
sumber
Meskipun karena saya hanya mengirim data acak, tidak yakin apakah data tetap utuh ...
Kyle Brandt
Anda memiliki toleransi yang lebih tinggi terhadap kebosanan daripada saya! > tersenyum <
Evan Anderson
Bagaimana saya bisa mengubah ini untuk mengirim file teks tertentu?
user987654321
8

Ya Anda harus base64 menyandikan lampiran dan membuat header MIME.

Daripada menghasilkan pesan baru "on the fly" setiap kali, mungkin akan lebih mudah hanya mengirim email kepada diri sendiri pesan contoh yang sangat singkat dari program email "nyata" (meningkatkan pekerjaan yang dilakukan orang-orang yang menulisnya untuk meletakkan lampiran) ke dalam pengkodean yang tepat dan membuat header MIME).

Simpan pesan itu ke dalam file teks dengan tajuknya (tentu saja menghapus tajuk transpor), dan cukup modifikasi / salin / tempel ke telnet atau netcat untuk sesi selanjutnya.

Evan Anderson
sumber
6

Sementara pengujian tangan server SMTP dengan tangan dimungkinkan dan dapat dilakukan, menggunakan alat yang dirancang untuk ini akan jauh lebih mudah.

Artikel ini menjelaskan SWAKS . swaks dirancang untuk pengujian server smtp. Mendukung lampiran, otentikasi, dan enkripsi!

hayalci
sumber
+1 Sekarang ini sesuatu yang akan saya mulai gunakan! :-)
Kyle Brandt
4

saya tersandung pada entri ini ketika saya sedang mencari sesuatu yang sama. dan dari awnsers di sini dan beberapa penelitian tambahan saya berhasil membuat skrip ini.

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

Satu hal yang mungkin ingin Anda tambahkan adalah otentikasi. saya tidak membutuhkannya jadi saya belum menambahkannya.

Saya pikir itu hanya membutuhkan perintah md5sum , netcat , file , awk dan base64 , id kira itu cukup standar di sebagian besar sistem.

ravenmeister
sumber
Apakah mungkin menambahkan beberapa lampiran dengan mudah, ke solusi ini?
TryTryAgain
3

Inilah yang saya lakukan untuk mengirim email dengan bash. Saya menggunakannya untuk mengirimi saya file log dan alamat IP eksternal, silakan menggunakannya:

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

Semoga itu baik untukmu;)

psirac.

psirac
sumber
3

Telnet - kirim email dengan beberapa lampiran

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

# Content-Type: text / csv; name = "$ FILE" # untuk file CSV
# Content-Type: application / x-msdownload; name = "$ FILE" # untuk dieksekusi
# Content-Type: text / xml; name = "$ FILE" # untuk file xml atau coba aplikasi / xml

telnet smtp.server.dom 25

HALO
MAIL FROM: [email protected]
RCPT KE: [email protected]
DATA
Subjek: Uji email
Dari: [email protected]
Kepada: [email protected]
MIME-Versi: 1.0
Tipe-Konten: multipart / campuran; batas = "X - = - = - = - batas teks"

--X - = - = - = - batas teks
Jenis-Konten: teks / polos

Letakkan pesan Anda di sini ...

--X - = - = - = - batas teks
Jenis-Konten: aplikasi / zip; name = "file.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... salin / rekatkan zip.txt

--X - = - = - = - batas teks
Jenis-Konten: teks / pdf; name = "file.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... copy / paste pdf.txt

--X - = - = - = - batas teks
.

BERHENTI
Anrik
sumber
1
Selamat datang di serverfault. Orang-orang yang memposting jawaban seperti Anda sangat disambut di situs web ini! :) gratz
bgtvfr
1

Anda harus meninjau spesifikasi protokol SMTP. Ini bacaan yang sangat mengejutkan untuk spesifikasi teknis, dan akan membantu Anda memahami bagaimana proses email bekerja.

Secara khusus, sadari bahwa lampiran dikonversi menjadi tipe MIME dan disandikan dalam teks, sehingga setiap lampiran yang ingin Anda kirim melalui telnet harus dikonversi menjadi teks dan ditransmisikan melalui protokol telnet.

sangretu
sumber
1

Jika semua yang Anda uji adalah 'lakukan pengiriman lampiran', Anda mungkin dapat menggunakan standar lampiran pra-MIME: uuencode. Tidak seperti MIME, jauh lebih mudah untuk membuat pesan. Tidak seperti MIME, tidak perlu header. Namun, tidak semua klien email mengenali file yang uuencoded sebagai lampiran lagi jadi saya sarankan pengujian untuk melihat apakah Anda dapat menggunakannya. Jika ya, Anda baru saja menghemat banyak usaha. Jika tidak, maka pra-membangun pesan MIMEed Anda melalui perl atau sesuatu dan menyalurkannya melalui sesuatu seperti NetCat mungkin adalah cara yang harus dilakukan.

Layak dilihat.

sysadmin1138
sumber
20 tahun yang lalu ini adalah jawaban yang bagus. Tidak sekarang. Gunakan salah satu dari banyak perpustakaan MIME dan buat email yang sesuai dengan MIME, lengkap dengan pengkodean Base64.
james.garriss