与某些 SMTP 服务器的连接时间很长

Very long connection time to some SMTP servers

我目前正在尝试编写一个简单的 Spring 电子邮件验证微服务。我正在使用 Apache SMTPClient API 连接到 SMTP 服务器并验证电子邮件地址是否存在(连接 -> 登录 -> setSender -> setRecipient -> 注销 -> 断开连接)。当连接到大多数大型电子邮件提供商(gmail、yahoo 等)时没有问题,但对于其他人来说,连接时会有奇怪的 5-20 秒延迟。例如,对于 protonmail,我有时会等待看起来像是固定的 5 秒延迟,有时我会在 ~150 毫秒后正常连接。对于其他一些较小的服务,每次我尝试连接时都是固定延迟。 由于我正在尽最大努力减少此类验证所需的时间,这是一个相当大的问题,因为在没有遇到此类问题时通常需要 <2 秒。

我试图找出延迟的原因,但遇到了 2 种可能的解释:

对于可能导致延迟的原因以及如何避免延迟(如果可能的话)的任何建议,我将不胜感激。

我与 mail.protonmail.ch 建立了几个 SMTP 连接,它确实在做一些不寻常的事情。我认为他们正在实施 tarpitting 的变体。

例如,有时在连接后,mail.protonmail.ch 会立即响应 SMTP 横幅(看起来很像 220 响应):

220-mailin008.protonmail.ch ESMTP Postfix

然后,在看似随机的延迟之后,实际的 220 响应:

220 mailin008.protonmail.ch ESMTP Postfix

其他时候,在看似随机的延迟之后,它会以 220 响应进行响应,而不会先发送横幅:

220 mailin025.protonmail.ch ESMTP Postfix

许多用于发送垃圾邮件的客户端 SMTP 程序没有正确实现 SMTP。劣质程序可能 'get fooled' 通过 mail.protonmail.ch 响应的不寻常方式,并在它应该发送之前发送 EHLO。然后,mail.protonmail.ch 可以断开连接,前提是客户端不是 'real' SMTP MTA。然而,真正的 MTA 会在发送 EHLO.

之前等待 'real' 220 响应

在这种情况下,我可以通过简单地使用套接字来解决问题 - 如果您需要做的只是通过发送 RCPT TO 命令来验证电子邮件的存在,这是最好的方法.我个人找不到任何 Java API 都可以避免我遇到的问题 允许轻松发送 SMTP 命令。