Я часто использую telnet или netcat для подключения к smtp-серверам для отправки электронного письма в качестве теста.
Кто-нибудь знает, как бы вы отправили электронное письмо с помощью telnet или netcat но также прикрепите файл? Наверное, есть способы получше, но я все же хочу знать :-)
Я был бы доволен решением, в котором для достижения цели используется небольшая оболочка bash, но я не хочу использовать какие-либо другие инструменты ...
Хорошо, поэтому, взяв за основу все комментарии, я придумал этот глупый беспорядок :-) ...
{
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
Ик. Вам нужно будет закодировать вложение base64 и создать заголовки MIME.
Вместо того, чтобы каждый раз создавать новое сообщение «на лету», вероятно, было бы проще просто отправить себе по электронной почте очень короткий пример сообщения из «настоящей» почтовой программы (используя работу, проделанную людьми, написавшими его, для размещения вложения в правильную кодировку и создание заголовков MIME).
Сохраните это сообщение в текстовом файле с его заголовками (конечно, удалив транспортный заголовок) и просто измените / скопируйте / вставьте его в telnet или netcat для будущих сеансов.
Хотя ручное тестирование серверов SMTP вручную возможно и жизнеспособно, использование инструмента, предназначенного для этого, будет намного проще.
Эта статья объясняет SWAKS. swaks предназначен для тестирования smtp-серверов. Поддерживает вложения, аутентификацию и шифрование!
Я подытожил эту запись, пока искал что-то похожее. и от авторов здесь и из некоторых дополнительных исследований мне удалось сделать этот скрипт.
#!/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, файл, awk и base64 команды, я думаю, они довольно стандартные для большинства систем.
Это то, что я делаю, чтобы отправлять электронную почту с помощью 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
Надеюсь, тебе понравилось;)
псирак.
Telnet - отправка электронной почты с несколькими вложениями
cat attachment.zip | base64 > zip.txt cat attachment.pdf | base64 > pdf.txt # Content-Type: text/csv; name="$FILE" # for CSV files # Content-Type: application/x-msdownload; name="$FILE" # for executable # Content-Type: text/xml; name="$FILE" # for xml files or try application/xml telnet smtp.server.dom 25 HELO MAIL FROM: email@server.com RCPT TO: email@server.com DATA Subject: Test email From: email@server.com To: email@server.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="X-=-=-=-text boundary" --X-=-=-=-text boundary Content-Type: text/plain Put your message here... --X-=-=-=-text boundary Content-Type: application/zip; name="file.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="file.zip" UEsDBBQAAAAIAG1+zEoQa.... copy/paste zip.txt --X-=-=-=-text boundary Content-Type: text/pdf; name="file.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="file.pdf" UEsDBBQAAAAIAG1+zEoQa.... copy/paste pdf.txt --X-=-=-=-text boundary . QUIT
Вам необходимо ознакомиться со спецификацией протокола SMTP. Это на удивление легкое прочтение технической спецификации, которое поможет вам понять, как работает процесс электронной почты.
В частности, имейте в виду, что вложения преобразуются в типы MIME и кодируются в тексте, поэтому любые вложения, которые вы хотите отправить через telnet, должны быть преобразованы в текст и переданы как таковые через протокол telnet.
Если все, что вы тестируете, - это «доставлено ли вложение», возможно, вам сойдет с рук стандарт вложений до MIME: uuencode. В отличие от MIME, создавать сообщения намного проще. В отличие от MIME, он не требует заголовков. Однако не все почтовые клиенты больше распознают файлы с uuencoded как вложения, поэтому я предлагаю протестировать, чтобы увидеть, можете ли вы его использовать. Если это так, вы просто сэкономили много усилий. Если это не так, то, вероятно, лучше всего заранее создать ваше сообщение MIMEed через perl или что-то еще и пропустить его через что-то вроде NetCat.
Стоит посмотреть.
Для этой работы есть замечательный Perl-скрипт. Вы можете найти это здесь:
http://www.logix.cz/michal/devel/smtp-cli/
smtp-cli v2.9
Автор сценария: Михал Людвиг (c) 2003-2011 гг. http://smtp-cli.logix.cz
Я сам им пользуюсь и он отлично работает, спасибо Михалу;)