作为对许多没有该mail
命令的服务器的一种廉价的黑客解决方法,编写了一个脚本,将 SMTP 命令回显到 telnet 会话中。脚本的相关部分如下所示
telnet mailserver 25 << EOF
EHLO $HOST
MAIL FROM: root@$HOST
(and so on)
EOF
这会间歇性地失败,并显示“远程主机关闭连接”。tcpdump
失败会话的 A 确认 Postfix 邮件服务器正在关闭连接立即地发送220
欢迎消息后。也就是说,输入重定向尚未通过网络完成。
到目前为止,我还不能确定失败的情况,但我可以确认nc
每次使用(netcat)都能顺利运行。
该网站和 Stack Overflow 上的许多问题都坚信这nc
是完成这项工作的正确工具。我感兴趣的是为什么事实就是如此。
- 为何故障是间歇性的?
- 为什么在重定向的单行输入通过网络发送之前邮件服务器就挂断了?
- 为何
telnet
断而不netcat
破?
答案1
这种情况很可能是因为邮件主机的延迟被忽略了。发送电子邮件需要先建立连接,然后才能收到响应。如果在服务器响应之前发出 MAIL FROM,则发送将失败。事实上,一些服务器依靠稍微延迟此 HELO 响应来停止此泵并关闭连接行为,就像垃圾邮件发送者经常做的那样。
有办法解决这个问题(最好不要使用 Telnet),否则可以使用某种聊天脚本。如果您无法使用,手动添加延迟不会解决问题,但可以大大限制问题。
由于您似乎正在使用某种 Linux 环境,因此使用 nc (netcat) 而不是 Telnet 被认为是最佳实践。这链接展示了如何使用 netcat 和“expect”更好地发送电子邮件并正确处理时间。