0

最近我一直在试验一个简单的脚本,它在端口 25 上侦听,并接收和记录任何传入的电子邮件。

这是一个非常原始的脚本,根本没有实现 SMTP 协议。它只是简单地吐出罐头回复,它的工作原理如下:

  1. 等待传入的套接字。
  2. 发送“220 example.com ESMTP Postfix”。
  3. 接收一行,通常如“EHLO other.com”。
  4. 发送“250 example.com,很高兴认识你”。
  5. 接收到“DATA”的行,每次都回复“250 Ok”。
  6. 发送“354 End data with .”。
  7. 接收行直到“。” 收到。
  8. 发送 250 确定:排队为 12345。
  9. 接收任何最后一行然后关闭套接字。

(example.com 代替了我真实域的 FQDN。)

这确实是一个非常粗糙的脚本;但是,在过去的几个月里,它对我需要接收的每封电子邮件都非常有效。我可以收到来自 Gmail、Protonmail、验证电子邮件等的罚款。我还捕获了一些互联网范围的扫描,所以它也可以作为一个有趣的蜜罐。

今天,我尝试收到一封微软账户验证邮件来注册一个微软账户。远程客户端似乎根本没有响应 220!

# nc -l -v -p 25
Listening on [0.0.0.0] (family 0, port 25)
Connection from mail-co1nam03on0003.outbound.protection.outlook.com 56725 received!
220 example.com ESMTP Postfix

无论我尝试什么,客户都不会发送任何东西。我究竟做错了什么?欢迎任何想法。

4

1 回答 1

0

Tripleee 在评论中解决了这个问题,所以我将它作为答案发布在这里供大家查看。问题是我只给出了 LF 作为换行符,而不是 CRLF。所以我在我的代码中用 '\r\n' 替换了所有的 '\n',并修复了它。我猜其他邮件服务器只是对我宽容。

于 2018-10-04T06:16:12.763 回答