使用 netcat 发送电子邮件

7

我尝试从我的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
...
...

我不明白我做错了什么。非常感谢您的帮助。

2个回答

7
睡眠的原因是因为SMTP是“对话式”的。服务器接收到一行后,会回复一些内容。客户端回复,服务器再回复。然而,TCP并不关心内容。(这里特别重要的是换行符) TCP获得一串数据和一个目标地址。它会切割出一个协商好的(在应用程序的更低级别上进行协商,所以这超出了您的控制范围)数据字节,并将其发送。重复此过程,直到完成。
问题在于当服务器接收到具有换行符的TCP段时,很有可能(协商的字节数/1)会包含下一行的一定量内容。此时服务器会说:“你没有让我说话,所以这不是一次对话,我们不会继续进行”。
因此,这就是为什么您的第一次尝试失败的原因。您第二次尝试成功的原因是netcat不要求每个TCP段都是完整的,它基于流而不是文件工作。所以netcat不会一直工作到EOF,它会一直工作到stdin关闭(或者如果您指定了超时时间,则到达超时时间)。当stdin“延迟”时,它会发送已经有的内容。这确保了您的服务器获得以换行符结束的TCP段。您可能会发现,您的服务器可以处理比1秒更小的睡眠时间。我使用0.05,但您可能希望使用0.1来增加安全性。

我在这里举了一个例子,但我要重复一遍,因为您的引用对我来说非常不规则。

$ 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 "$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

1
你可以让那个函数变得更加智能,例如 smtp() { cat "$1" |while read; do sleep .05; echo "$REPLY"; done |nc "${2:-localhost}" "${3:-25}"; }。这将默认使用本地主机的25端口,但可以进行更改。语法为 smtp 文件 [服务器 [端口]] - Adam Katz

7

终于让它工作了。

我不知道为什么,但一旦达到邮件的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文件没有任何改变

再见


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接