使用 netcat 发送电子邮件

Send email with netcat

我尝试从我的 ESXI 服务器发送电子邮件,但出于某种我不知道的原因,我收到了错误。

这是我用来发送电子邮件的命令:

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

这是文件 mail.txt:

HELO smtp.relay.us
MAIL FROM:<maillog@gkmonitor.fr>
RCPT TO:<systemsupport@gkit.fr>
DATA
From: [Log Server] <maillog@gkmonitor>
To: <systemsupport@gkit.fr>
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
...
...

我不明白我做错了什么。非常感谢。

终于成功了。

我不知道为什么,一旦到达邮件的 DATA 部分,nc 会一次发送很多信息。即使使用 -i 选项在每一行之间引入间隔也无济于事。

这就是我让它工作的方式(很大程度上受到 GhettoVCB 脚本的启发):

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

mail.txt

没有变化

再见

需要休眠的原因是 SMTP 是 "conversational"。服务器收到一行后,会回复一些内容。客户端回复,服务器回复。然而,TCP 并不关心内容。 (这里特别重要的是换行符。)TCP 获取数据流和目的地。它切断协商的(在低于您的应用程序的级别,因此这是您无法控制的)八位字节数的数据并发送它们。并重复直到完成。

问题是,当服务器接收到包含换行符的 TCP 段时,将包含下一行的一定数量的可能性为(negotiated_octet_count 比 1)。此时服务器说,"You are not letting me speak, so this is not a conversation, and we are not going to continue."

所以,这就是您第一次尝试失败的原因。您第二次尝试成功的原因是 netcat 不要求每个 TCP 段都已满。它适用于流,而不是文件。所以 netcat 不能工作到 EOF。它一直工作到 stdin 关闭(或者如果您指定超时则达到超时)。当标准输入 "delays" 时,它会发送它所拥有的。这可确保您的服务器获得以换行符结尾的 TCP 段。您可能会发现您的服务器可以处理比 1 秒少得多的睡眠。我使用 .05,但您可能想使用 .1 来确保安全。

I gave an example here 但我要重复一遍,因为你的引用对我来说很不规则。

$ cat email_msg.txt
HELO localhost
MAIL FROM:<system@example.com>
RCPT TO:<bbronosky@example.com>
DATA
From: [IES] <system@example.com>
To: <bbronosky@example.com>
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 "" | 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