Отправьте электронное письмо с прикрепленным файлом, используя telnet или netcat.


15

Я часто использую telnet или netcat для подключения серверов smtp для отправки электронной почты в качестве теста.

Кто-нибудь знает, как вы отправите электронное письмо с помощью telnet или netcat, но также приложите файл ? Есть, вероятно, лучшие способы, но я все еще хочу знать :-)

Я был бы счастлив с решением, которое использует небольшую оболочку bash для достижения цели, но не хотел бы использовать другие инструменты ...


1
ehlo, это, вероятно, будет включать в себя создание MIME-вложения в файле, его кодирование и вставка в окно. Хотя может быть очень полезно иметь возможность просто подключиться к SMTP-серверу через telnet, написать короткое письмо и отправить его (и я могу), отправка такого файла не очень практична. Попробуйте 'sendfile' или 'mutt' (даже если вы не любите использовать инструменты).
Андриоид

Сразу после эха '.'; вы можете добавить это эхо '.'; спать 3; эхо 'уйти';

Ответы:


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

Одна вещь, которую вы можете добавить, это аутентификация. Мне это не нужно, поэтому я не добавил его.

Я думаю, что для этого нужны только команды md5sum , netcat , file , awk и base64 , я думаю, они довольно стандартны в большинстве систем.


Можно ли легко добавить несколько вложений в это решение?
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 - отправьте письмо с несколькими вложениями

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
ПОЧТА ОТ: email@server.com
RCPT TO: email@server.com
ДАННЫЕ
Тема: Тестовое письмо
От: email@server.com
Кому: email@server.com
MIME-версия: 1.0
Тип контента: составной / смешанный; border = "X - = - = - = - текстовая граница"

--X - = - = - = - граница текста
Тип контента: текст / обычный

Поместите ваше сообщение здесь ...

--X - = - = - = - граница текста
Тип контента: приложение / почтовый индекс; имя = "file.zip"
Content-Transfer-Encoding: base64
Содержание-Диспозиция: вложение; имя файла = "file.zip"

UEsDBBQAAAAIAG1 + zEoQa .... копировать / вставить zip.txt

--X - = - = - = - граница текста
Тип контента: текст / pdf; имя = "file.pdf"
Content-Transfer-Encoding: base64
Содержание-Диспозиция: вложение; имя файла = "file.pdf"

UEsDBBQAAAAIAG1 + zEoQa .... копировать / вставить pdf.txt

--X - = - = - = - граница текста
,

УВОЛИТЬСЯ

1
Добро пожаловать в serverfault. Люди, которые публикуют ответы, подобные вашим, действительно приветствуются на этом сайте! :) gratz
bgtvfr

1

Вам нужно будет ознакомиться со спецификацией протокола SMTP. Это удивительно легкий текст для технической спецификации, и он поможет вам понять, как работает процесс электронной почты.

В частности, следует понимать, что вложения преобразуются в типы MIME и кодируются в тексте, поэтому любые вложения, которые вы хотите отправить через telnet, должны быть преобразованы в текст и переданы как таковые по протоколу telnet.


1

Если все, что вы тестируете, это «доставили ли вложения», возможно, вам не удастся использовать стандарт вложений до MIME: uuencode. В отличие от MIME, создавать сообщения намного проще. В отличие от MIME он не требует никаких заголовков. Однако не все почтовые клиенты распознают файлы с кодировкой uuenco как вложения, поэтому я предлагаю проверить, можно ли их использовать. Если это произойдет, вы только что сэкономили много сил. Если этого не произойдет, то, вероятно, стоит предварительно сконструировать ваше сообщение MIMEed через perl или что-то еще и передать его через что-то вроде NetCat.

Стоит посмотреть.


20 лет назад это был хороший ответ. Не сейчас. Используйте одну из многих библиотек MIME и создайте MIME-совместимое письмо, дополненное кодировкой Base64.
james.garriss

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.