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


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

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

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


14
2017-07-10 13:55


Источник


ehlo, это, вероятно, будет включать создание вложений mime в файле, кодирование и вставка в ваше окно. Хотя может быть очень полезно иметь возможность просто подключиться к SMTP-серверу, написать короткую почту и отправить ее (и я могу), отправка такого файла просто не очень практична. Попробуйте «sendfile» или «mutt» (даже если вы не любите использовать инструменты). - Andrioid
Сразу после echo '.'; вы можете добавить это эхо '.'; сон 3; echo 'quit';


Ответы:


Хорошо, поэтому, используя комментарии каждого в качестве отправной точки, я придумал этот глупый беспорядок :-) ...

{ 
    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

9
2017-07-10 18:55



Хотя я просто отправляю случайные данные, не уверен, что данные остаются нетронутыми ... - Kyle Brandt♦
У вас более высокая толерантность к скуке, чем мне! > Улыбка < - Evan Anderson
Как я могу изменить это, чтобы отправить конкретный текстовый файл? - user987654321


Ик. Вам нужно будет base64 закодировать вложение и создать заголовки MIME.

Вместо того, чтобы генерировать новое сообщение «на лету» каждый раз, вероятно, было бы проще просто послать себе очень короткое примерное сообщение из «реальной» электронной почты (используя работу, которую люди, которые ее написали, в правильное кодирование и создание заголовков MIME).

Сохраните это сообщение в текстовом файле с его заголовками (конечно, удалите транспортный заголовок) и просто измените / скопируйте / вставьте его в telnet или netcat для будущих сеансов.


8
2017-07-10 14:02





В то время как ручное тестирование SMTP-серверов вручную возможно и жизнеспособно, использование инструмента, предназначенного для этого, будет намного проще.

Эта статья объясняет SWAKS, swaks предназначен для тестирования сервера smtp. Поддерживает вложения, аутентификацию и шифрование!


6
2017-07-10 19:18



+1 Теперь это то, что я собираюсь начать использовать! :-) - Kyle Brandt♦


я пробормотал эту запись, когда искал что-то одно и то же. и от awnsers здесь и som дополнительных исследований я сумел сделать этот скрипт.

#!/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 команды, и, думаю, они довольно стандартны в большинстве систем.


4
2017-09-18 13:00



Можно ли легко добавить несколько вложений к этому решению? - TryTryAgain


Это то, что я делаю, чтобы отправлять электронную почту с помощью 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
2017-08-11 14:19





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 или попробуйте приложение / xml

telnet smtp.server.dom 25

HELO
ПОЧТА ОТ: email@server.com
RCPT TO: email@server.com
ДАННЫЕ
Тема: тестовая электронная почта
От: email@server.com
Кому: email@server.com
MIME-версия: 1.0
Content-Type: multipart / mixed; border = "X - = - = - = - граница текста"

--X - = - = - = - граница текста
Content-Type: text / plain

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

--X - = - = - = - граница текста
Content-Type: application / zip; Name = "file.zip"
Content-Transfer-Encoding: base64
Content-Disposition: вложение; имя файла = "file.zip"

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

--X - = - = - = - граница текста
Content-Type: text / pdf; Name = "файл file.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: вложение; имя файла = "file.pdf"

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

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

УВОЛИТЬСЯ

3
2018-06-13 00:53



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


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

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


1
2017-07-10 14:01





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

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


1
2017-07-10 14:47



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


Для этой работы есть замечательный сценарий Perl. Вы можете найти это здесь:

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

smtp-cli v2.9

Автор сценария: Михал Людвиг (c) 2003-2011 http://smtp-cli.logix.cz

Я использую его сам, и он отлично работает, благодаря Михалу;)


1
2017-12-11 14:23