使用telnet或netcat发送带有附件的电子邮件


15

我经常使用telnet或netcat连接smtp服务器以发送电子邮件作为测试。

有谁知道您将如何使用telnet或netcat发送电子邮件,同时附加文件?可能有更好的方法,但是我仍然想知道:-)

我对使用一个小的bash shell来实现目标的解决方案感到满意,但不想使用任何其他工具...


1
ehlo,这可能包括在文件中创建一个mime附件,对其进行编码,然后将其粘贴到您的窗口中。能够远程登录到SMTP服务器非常有用,写一封短消息然后发送(我可以),然后发送这样的文件不是很实用。尝试使用“ sendfile”或“ mutt”(即使您不喜欢使用工具)。
2009年

回声“。”之后;您可能要添加此回显“。”;睡3; 回声“退出”;

Answers:


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

尽管由于我只是发送随机数据,所以不确定数据是否保持不变...
Kyle Brandt

您比我对乏味的容忍度更高!>微笑<
Evan Anderson

我该如何更改以发送特定的文本文件?
user987654321 '16

8

ck 您将需要对附件进行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

您可能要添加的一件事是身份验证。我不需要它,所以我没有添加它。

我认为它只需要md5sumnetcatfileawkbase64命令,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

希望对你有好处;)

psirac。


3

Telnet-发送带有多个附件的电子邮件

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

哈罗
邮件发件人:email@server.com
RCPT至:email@server.com
数据
主题:测试电子邮件
来自:email@server.com
至:email@server.com
MIME版本:1.0
内容类型:多部分/混合;boundary =“ X-=-=-=-文本边界”

--X-=-=-=-文字边界
内容类型:文本/纯文本

将您的消息放在这里...

--X-=-=-=-文字边界
内容类型:application / zip; name =“ file.zip”
内容传输编码:base64
内容处置:附件;filename =“ file.zip”

UEsDBBQAAAAIAG1 + zEoQa ....复制/粘贴zip.txt

--X-=-=-=-文字边界
内容类型:text / pdf;name =“ file.pdf”
内容传输编码:base64
内容处置:附件;filename =“ file.pdf”

UEsDBBQAAAAIAG1 + zEoQa ....复制/粘贴pdf.txt

--X-=-=-=-文字边界
。

放弃

1
欢迎使用serverfault。非常欢迎在您的网站上发布像您这样的答案的人!:) gratz
bgtvfr

1

您需要查看SMTP协议规范。对于技术规范而言,这是令人惊讶的轻松阅读,它将帮助您了解电子邮件流程的工作方式。

具体来说,请注意将附件转换为MIME类型并以文本编码,因此,您要通过telnet发送的任何附件都必须转换为文本并通过telnet协议进行传输。


1

如果您要测试的只是“附件是否已交付”,则可能无法使用附件的MIME前标准:uuencode。与MIME不同,创建消息要简单得多。与MIME不同,它不需要任何标题。但是,并非所有邮件客户端都将uuencoded文件识别为附件,因此我建议进行测试以查看是否可以使用它。如果是这样,您就节省了很多精力。如果不是这样,那么通过perl或其他方式预先构造MIME消息并通过NetCat之类的管道将其传递可能是可行的方法。

值得一看。


20年前,这是一个很好的答案。现在不要。使用许多MIME库之一,并创建具有Base64编码的MIME兼容电子邮件。
james.garriss 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.