Отправить электронное письмо с помощью netcat

Я пытаюсь отправлять электронные письма со своих серверов ESXI, но по неизвестной мне причине получаю сообщения об ошибках.

это команда, которую я использую для отправки электронной почты:

nc -Cv smtp.relay.us 25 < /vmfs/volumes/Vcloud-Datatstore/Tools/mail.txt

А это файл mail.txt:

HELO smtp.relay.us
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
From: [Log Server] <maillog@gkmonitor>
To: <[email protected]>
Date: Mon, 29 May 2017 20:25:38 +0000
Subject: Resultat de la restauration de GED
blabla
blabla

.

Я получаю эти выходные данные:

220-*****************************
220 *****************************
250 smtp.relay.us
250 2.1.0 Ok
250 2.1.5 Ok
503 5.5.0 <DATA>: Data command rejected: Improper use of SMTP command pipelining
502 5.5.2 Error: command not recognized
...
...

Я не понимаю, что я делаю неправильно. Большое спасибо заранее.


person Processor    schedule 29.05.2017    source источник


Ответы (2)


Наконец-то заработало.

Я не знаю, почему, но nc отправляет много информации за один раз, как только доходит до DATA части почты. Даже введение интервала между каждой строкой с опцией -i не помогло.

Вот как я заставил это работать (во многом вдохновленный сценарием GhettoVCB):

 cat "mail.txt" |while read L; do sleep "1"; echo "$L"; done | "nc" -C -v "smtp.relay.us" "25"

Ничего не изменилось в mail.txt

Пока

person Processor    schedule 30.05.2017

Причина, по которой необходимы сны, заключается в том, что SMTP является «диалоговым». После того, как сервер получает строку, он что-то отвечает. Клиент отвечает, и сервер отвечает. Однако TCP не заботится о содержимом. (Особое значение здесь имеют разрывы строк.) TCP получает поток данных и место назначения. Он отсекает согласованное (на более низком уровне, чем ваше приложение, поэтому это вне вашего контроля) количество октетов данных и отправляет их. И повторять до готовности.

Проблема в том, что когда сервер получает TCP-сегмент с разрывом строки, шансы (negotiated_octet_count = 1) заключаются в том, что некоторое количество следующей строки будет включено. В этот момент сервер говорит: «Вы не даете мне говорить, так что это не разговор, и мы не собираемся продолжать».

Так вот почему ваша первая попытка не удалась. Причина, по которой ваша вторая попытка увенчалась успехом, заключается в том, что netcat не требует, чтобы каждый сегмент TCP был заполнен. Он работает с потоками, а не с файлами. Таким образом, netcat не работает до EOF. Он работает до тех пор, пока не закроется стандартный ввод (или не истечет время ожидания, если вы его укажете). И когда стандартный ввод «задерживает», он отправляет то, что у него есть. Это гарантирует, что ваш сервер получит сегмент TCP, который заканчивается разрывом строки. Вы, вероятно, обнаружите, что ваш сервер может обрабатывать спящий режим намного меньше 1 секунды. Я использую 0,05, но вы можете использовать 0,1, чтобы обеспечить некоторую безопасность.

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

$ cat email_msg.txt
HELO localhost
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
From: [IES] <[email protected]>
To: <[email protected]>
Date: Fri, 27 Oct 2017 06:14:11 +0000
Subject: Test Message

Hi there! This is supposed to be a real email...

Have a good day!
-- System


.
QUIT

$ function slowcat(){ cat "$1" | while read; do sleep .05; echo "$REPLY"; done; }

$ slowcat email_msg.txt | nc localhost 25
220 et3 ESMTP Exim 4.89 Fri, 27 Oct 2017 06:18:14 +0000
250 et3 Hello localhost [::1]
250 OK
250 Accepted
354 Enter message, ending with "." on a line by itself
250 OK id=1e7xyA-0000m6-VR
221 et3 closing connection
person Bruno Bronosky    schedule 01.05.2018
comment
Вы можете сделать эту функцию немного умнее, например smtp() { cat "$1" |while read; do sleep .05; echo "$REPLY"; done |nc "${2:-localhost}" "${3:-25}"; }. По умолчанию это будет localhost на порту 25, но его можно изменить. Синтаксис smtp FILE [server [port]] - person Adam Katz; 27.05.2020