ส่งอีเมลพร้อมไฟล์แนบโดยใช้ telnet หรือ netcat


15

ฉันมักจะใช้ telnet หรือ netcat เพื่อเชื่อมต่อเซิร์ฟเวอร์ smtp เพื่อส่งอีเมลเป็นแบบทดสอบ

ไม่มีใครรู้ว่าคุณจะส่งอีเมลโดยใช้ telnet หรือ netcat แต่แนบไฟล์ด้วยหรือไม่ อาจมีวิธีที่ดีกว่านี้ แต่ฉันยังต้องการทราบ :-)

ฉันจะมีความสุขกับวิธีแก้ปัญหาที่ใช้ bash shell เล็กน้อยเพื่อให้บรรลุเป้าหมาย แต่ไม่ต้องการใช้เครื่องมืออื่น ๆ ...


1
เช่นนี้อาจรวมถึงการสร้างไฟล์แนบ mime ในไฟล์เข้ารหัสและวางลงในหน้าต่างของคุณ ในขณะที่มันมีประโยชน์มากที่จะสามารถเพียงแค่ telnet ไปยังเซิร์ฟเวอร์ SMTP เขียนจดหมายสั้น ๆ และส่งมัน (และฉันทำได้) การส่งไฟล์แบบนั้นไม่จริง ลอง 'sendfile' หรือ 'mutt' (แม้ว่าคุณไม่ต้องการใช้เครื่องมือ)
Andrioid

หลังจากเสียงก้อง '.'; คุณอาจต้องการเพิ่มเสียงสะท้อนนี้ '.'; นอน 3 echo 'เลิก';

คำตอบ:


10

โอเคดังนั้นการใช้ความคิดเห็นของทุกคนเป็นจุดเริ่มต้นฉันจึงคิดเรื่องยุ่ง ๆ นี้ :-) ...

{ 
    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

แม้ว่าตั้งแต่ฉันเพียงแค่การส่งข้อมูลแบบสุ่มไม่แน่ใจว่าข้อมูลที่เหลืออยู่เหมือนเดิม ...
ไคล์ Brandt

คุณมีความอดทนต่อความน่าเบื่อมากกว่าฉัน! > smile <
Evan Anderson

ฉันจะแก้ไขสิ่งนี้เพื่อส่งไฟล์ข้อความเฉพาะได้อย่างไร
user987654321

8

ick คุณจะต้อง base64 เข้ารหัสสิ่งที่แนบมาและสร้างส่วนหัว MIME

แทนที่จะสร้างข้อความใหม่ "ทันที" ในแต่ละครั้งมันอาจจะง่ายกว่าเพียงแค่ส่งอีเมลตัวอย่างข้อความสั้น ๆ จากโปรแกรมอีเมล "ของจริง" (ใช้ประโยชน์จากงานที่คนเขียนเขียนไว้เพื่อนำไฟล์แนบมาด้วย) ในการเข้ารหัสที่เหมาะสมและสร้างส่วนหัว MIME)

บันทึกข้อความนั้นลงในไฟล์ข้อความที่มีส่วนหัว (เอาส่วนหัวการขนส่งของหลักสูตร) ​​และเพียงแค่ปรับเปลี่ยน / คัดลอก / วางลงใน telnet หรือ netcat สำหรับเซสชันในอนาคต


6

ในขณะที่การทดสอบเซิร์ฟเวอร์ SMTP ด้วยมือเป็นไปได้และเป็นไปได้การใช้เครื่องมือที่ออกแบบมาสำหรับสิ่งนี้จะง่ายขึ้นมาก

บทความนี้จะอธิบาย SWAKS swaks ออกแบบมาสำหรับการทดสอบเซิร์ฟเวอร์ smtp รองรับไฟล์แนบการรับรองความถูกต้องและการเข้ารหัส!


+1 นั่นคือสิ่งที่ฉันจะเริ่มใช้! :-)
Kyle Brandt

4

ฉันรู้สึกไม่สบายใจกับรายการนี้ในขณะที่ฉันกำลังค้นหาบางสิ่งที่เหมือนกัน และจาก awnsers ที่นี่และการวิจัยเพิ่มเติมฉันจัดการเพื่อให้สคริปต์นี้

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

สิ่งหนึ่งที่คุณอาจต้องการเพิ่มคือการรับรองความถูกต้อง ฉันไม่ต้องการมันดังนั้นฉันไม่ได้เพิ่ม

ฉันคิดว่ามันต้องใช้คำสั่งmd5sum , netcat , file , awkและbase64เท่านั้น id เดาว่ามันเป็นมาตรฐานที่ค่อนข้างดีในระบบส่วนใหญ่


เป็นไปได้ไหมที่จะเพิ่มสิ่งที่แนบหลายรายการในโซลูชันนี้
TryTryAgain

3

นี่คือสิ่งที่ฉันกำลังทำเพื่อส่งอีเมลด้วยทุบตี ฉันใช้มันเพื่อส่งไฟล์บันทึกและที่อยู่ IP ภายนอกให้ฉันรู้สึกอิสระที่จะใช้:

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

หวังว่ามันจะดีสำหรับคุณ;)

psirac


3

Telnet - ส่งอีเมลพร้อมไฟล์แนบหลายรายการ

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

# Content-Type: text / csv; name = "$ FILE" # สำหรับไฟล์ CSV
# Content-Type: application / x-msdownload; name = "$ FILE" # สำหรับปฏิบัติการ
# เนื้อหาประเภท: ข้อความ / xml; name = "$ FILE" # สำหรับไฟล์ xml หรือลองใช้แอปพลิเคชัน / xml

telnet smtp.server.dom 25

HELO
จดหมายจาก: email@server.com
RCPT TO: email@server.com
ข้อมูล
เรื่อง: ทดสอบอีเมล
จาก: email@server.com
ถึง: email@server.com
MIME-Version: 1.0
เนื้อหาประเภท: หลายส่วน / ผสม; ขอบเขต = "X - = - = - = - ขอบเขตข้อความ"

--X - = - = - = - ขอบเขตข้อความ
ประเภทเนื้อหา: ข้อความ / ธรรมดา

ใส่ข้อความของคุณที่นี่ ...

--X - = - = - = - ขอบเขตข้อความ
ประเภทเนื้อหา: แอปพลิเคชัน / zip; name = "file.zip"
การถ่ายโอนเนื้อหาเข้ารหัส: base64
การจัดการเนื้อหา: สิ่งที่แนบมา; ชื่อไฟล์ = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... คัดลอก / วาง zip.txt

--X - = - = - = - ขอบเขตข้อความ
ประเภทเนื้อหา: ข้อความ / pdf; name = "file.pdf"
การถ่ายโอนเนื้อหาเข้ารหัส: base64
การจัดการเนื้อหา: สิ่งที่แนบมา; ชื่อไฟล์ = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... คัดลอก / วาง pdf.txt

--X - = - = - = - ขอบเขตข้อความ
.

เลิก

1
ยินดีต้อนรับสู่ serverfault ผู้ที่โพสต์คำตอบเช่นคุณยินดีต้อนรับจริงๆในเว็บไซต์นี้! :) gratz
bgtvfr

1

คุณจะต้องทบทวนข้อกำหนดโปรโตคอลของ SMTP เป็นการอ่านข้อมูลจำเพาะทางเทคนิคที่น่าประหลาดใจและจะช่วยให้คุณเข้าใจวิธีการทำงานของอีเมล

โดยเฉพาะให้ตระหนักว่าสิ่งที่แนบมาจะถูกแปลงเป็นประเภท MIME และเข้ารหัสเป็นข้อความดังนั้นไฟล์แนบใด ๆ ที่คุณต้องการส่งผ่าน telnet จะต้องถูกแปลงเป็นข้อความและส่งผ่านเช่นนั้นผ่านโปรโตคอล telnet


1

หากสิ่งที่คุณกำลังทดสอบคือ 'ส่งสิ่งที่แนบมา' คุณอาจหลีกเลี่ยงการใช้สิ่งที่แนบมาด้วยมาตรฐาน pre-MIME: uuencode ซึ่งแตกต่างจาก MIME มันง่ายกว่ามากในการสร้างข้อความ ซึ่งแตกต่างจาก MIME มันไม่จำเป็นต้องมีส่วนหัวใด ๆ อย่างไรก็ตามไคลเอนต์อีเมลบางรายไม่รู้จักไฟล์ uuencoded เป็นไฟล์แนบอีกต่อไปดังนั้นฉันขอแนะนำให้ทดสอบเพื่อดูว่าคุณสามารถใช้งานได้หรือไม่ ถ้าเป็นเช่นนั้นคุณจะต้องพยายามอย่างมาก หากไม่เป็นเช่นนั้นให้สร้างข้อความ MIMEed ของคุณล่วงหน้าด้วย perl หรือบางสิ่งบางอย่างแล้วส่งไปยังบางสิ่งเช่น NetCat น่าจะเป็นวิธีที่ควรดำเนินการ

คุ้มค่าดู


20 ปีที่แล้วนี่เป็นคำตอบที่ดี ไม่ใช่ตอนนี้. ใช้หนึ่งในห้องสมุด MIME จำนวนมากและสร้างอีเมลที่สอดคล้องกับ MIME พร้อมด้วยการเข้ารหัส Base64
james.garriss

1

มีสคริปต์ Perl ที่ยอดเยี่ยมสำหรับงานนี้ คุณสามารถค้นหาได้ที่นี่:

http://www.logix.cz/michal/devel/smtp-cli/

smtp-cli v2.9

สคริปต์มาจากผู้แต่ง: Michal Ludvig (c) 2003-2011 http://smtp-cli.logix.cz

ฉันใช้มันด้วยตัวเองและใช้งานได้ดีขอบคุณมิคาล;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.