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


15

私はしばしばテストとしてメールを送信するためにtelnetまたはnetcatを使用してsmtpサーバーを接続します。

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

私は目標を達成するために小さなbashシェルを使用するソリューションに満足していますが、他のツールを使用したくない...


1
ehlo、これにはおそらく、ファイルにMIME添付ファイルを作成し、エンコードしてからウィンドウに貼り付けることが含まれます。SMTPサーバーにtelnetで接続し、短いメールを書いて送信することは非常に便利ですが、私はそうすることができますが、そのようなファイルを送信することはあまり実用的ではありません。「sendfile」または「mutt」を試してください(ツールを使用したくない場合でも)。
アンドリオイド2009

エコー '。'の直後; このエコー '。'を追加することもできます。睡眠3; echo 'quit';

回答:


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

私は、ランダムなデータを送信しておりますので、データはそのまま...残っていないことを確認場合が
カイルブラント

あなたは私よりも高いテディウム耐性を持っています!>スマイル<
エヴァンアンダーソン

これを変更して特定のテキストファイルを送信するにはどうすればよいですか?
-user987654321

8

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

毎回「オンザフライ」で新しいメッセージを生成するのではなく、「本物の」電子メールプログラムから非常に短い例のメッセージを自分で電子メールで送信する方が簡単でしょう。適切なエンコーディングに変換し、MIMEヘッダーを作成します)。

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


6

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

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


+1これが私が使い始めようとしているものです!:-)
カイルブラント

4

私は同じものを探していたときにこのエントリにつまずいた。そして、ここの天才から、私はなんとかこのスクリプトを作ることができました。

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

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

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


このソリューションに複数の添付ファイルを簡単に追加することは可能でしょうか?
TryTryAgain

3

これは、bashでメールを送信するために行っていることです。ログファイルと外部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

それがあなたにとって良かったと思います;)

サイラック。


3

Telnet-複数の添付ファイル付きのメールを送信

猫attachment.zip | base64> zip.txt
猫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

ヒーロー
MAIL FROM:email@server.com
RCPT TO:email@server.com
データ
件名:テストメール
From:email@server.com
宛先:email@server.com
MIMEバージョン:1.0
コンテンツタイプ:multipart / mixed; boundary = "X-=-=-=-text boundary"

--X-=-=-=-テキスト境界
コンテンツタイプ:テキスト/プレーン

ここにメッセージを入れてください...

--X-=-=-=-テキスト境界
コンテンツタイプ:application / zip; name = "file.zip"
コンテンツ転送エンコード:base64
Content-Disposition:添付; filename = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... zip.txtのコピー/貼り付け

--X-=-=-=-テキスト境界
コンテンツタイプ:text / pdf; name = "file.pdf"
コンテンツ転送エンコード:base64
Content-Disposition:添付; filename = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... pdf.txtのコピー/貼り付け

--X-=-=-=-テキスト境界
。

終了する

1
serverfaultへようこそ。あなたのような答えを投稿する人は、このウェブサイトで本当に歓迎されています!:) gratz
bgtvfr

1

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

具体的には、添付ファイルはMIMEタイプに変換され、テキストでエンコードされるため、Telnet経由で送信する添付ファイルはすべてテキストに変換し、Telnetプロトコル経由で送信する必要があります。


1

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

一見の価値があります。


20年前、これは良い答えでした。今はやめろ。多くのMIMEライブラリの1つを使用して、Base64エンコーディングを備えたMIME準拠の電子メールを作成します。
james.garriss

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.