web-dev-qa-db-ja.com

telnetまたはnetcatを使用してファイルが添付されたメールを送信する

私は、テストとして電子メールを送信するために、TelnetまたはNetcatを使用してSMTPサーバーに接続することがよくあります。

Telnetまたはnetcatを使用して電子メールを送信する方法を知っている人はいますかただし、ファイルも添付してください?おそらくもっと良い方法がありますが、私はまだ知りたいです:-)

少しbashシェルを使用して目標を達成するソリューションに満足しますが、他のツールは使用したくありません...

15
Kyle Brandt

さて、みんなのコメントを出発点として使って、このばかげた混乱を思いつきました:-) ...

{ 
    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
10
Kyle Brandt

いや。添付ファイルをbase64エンコードし、MIMEヘッダーを作成する必要があります。

毎回「オンザフライ」で新しいメッセージを生成するのではなく、「実際の」電子メールプログラムから非常に短いサンプルメッセージを自分に電子メールで送信する方がおそらく簡単です(それを書いた人が添付ファイルを作成するために行った作業を利用する)適切なエンコーディングに変換し、MIMEヘッダーを作成します)。

そのメッセージをヘッダー付きのテキストファイルに保存し(もちろんトランスポートヘッダーは削除します)、将来のセッションのためにメッセージを変更/コピー/ telnetまたはnetcatに貼り付けます。

8
Evan Anderson

SMTPサーバーを手動で手動でテストすることは可能で実行可能ですが、このために設計されたツールを使用するとはるかに簡単になります。

この記事ではSWAKSについて説明します 。 swaksは、smtpサーバーのテスト用に設計されています。添付ファイル、認証、暗号化をサポートしています!

6
hayalci

同じものを探していたときに、このエントリを偶然見つけました。そして、ここの日除けから、私がこのスクリプトを作成することができた追加の研究があります。

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

追加したいのは認証です。必要ないので追加しませんでした。

md5sumnetcatfileawkおよびbase64のみが必要だと思いますコマンドは、ほとんどのシステムでかなり標準的だと思います。

4
ravenmeister

これは、bashでメールを送信するために行っていることです。私はログファイルと外部IPアドレスを送信するために使用します。自由に使用してください。

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

よかったね;)

psirac。

3
psirac

Telnet-複数の添付ファイルを含む電子メールを送信

 cat attachment.Zip | base64> Zip.txt 
 cat attachment.pdf | base64> pdf.txt 
 
#Content-Type:text/csv; name = "$ FILE"#CSVファイルの場合
#Content-Type:application/x-msdownload; name = "$ FILE"#実行可能ファイル
#Content-Type:text/xml; name = "$ FILE"#xmlファイルの場合、またはapplication/xml 
 
 telnet smtp.server.dom 25 
 
 HELO 
 MAIL FROM :[email protected] 
 RCPT TO:[email protected] 
 DATA 
 Subject:Test email 
 From:[email protected] 
 To:[email protected] 
 MIME-Version:1.0 
 Content-Type:multipart/mixed; border = "X-=-=-=-text境界" 
 
-X-=-=-=-text境界
 Content-Type:text/plain 
 
ここにメッセージを入力してください... 
 
-X-=-=-=-text border 
 Content-Type:application/Zip; name = "file.Zip" 
 Content-Transfer-Encoding:base64 
 Content-Disposition:attachment; filename = "file.Zip" 
 
 UEsDBBQAAAAIAG1 + zEoQa ....コピー/貼り付けZip.txt 
 
-X-=-=-=-テキスト境界
コンテンツタイプ:text/pdf; name = "file.pdf" 
 Content-Transfer-Encoding:base64 
 Content-Disposition:attachment; filename = "file.pdf" 
 
 UEsDBBQAAAAIAG1 + zEoQa .... pdf.txtをコピーして貼り付け
 
-X-=-=-=-テキスト境界
。
 
 QUIT 
3
Anrik

SMTPプロトコルの仕様を確認する必要があります。技術仕様については驚くほど読みやすく、電子メールプロセスのしくみを理解するのに役立ちます。

特に、添付ファイルはMIMEタイプに変換されてテキストにエンコードされるため、Telnet経由で送信する添付ファイルはすべてテキストに変換し、Telnetプロトコル経由で送信する必要があることに注意してください。

1
sangretu

テストしているすべてが「添付ファイルの配信を行った」場合、添付ファイルのMIME以前の標準であるuuencodeを使用して問題を回避できる可能性があります。 MIMEとは異なり、メッセージを作成する方がはるかに簡単です。 MIMEとは異なり、ヘッダーは必要ありません。ただし、すべてのメールクライアントがuuencodeされたファイルを添付ファイルとして認識しなくなったため、使用できるかどうかをテストすることをお勧めします。もしそうなら、あなたは自分自身に多大な労力を節約しました。そうでない場合は、Perlまたは何かを介してMIMEされたメッセージを事前に構築し、NetCatのようなものを介してそれをパイプすることはおそらく進むべき道です。

一見の価値があります。

1
sysadmin1138

この仕事には素晴らしいPerlスクリプトがあります。あなたはそれをここで見つけることができます:

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

smtp-cli v2.9

スクリプトは作成者から:Michal Ludvig(c)2003-2011 http://smtp-cli.logix.cz

私はそれを自分で使用し、それはミカルのおかげで素晴らしい作品です;)

1
readyblue