与某些 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 种可能的解释:
- 延迟 - 虽然它导致的延迟符合问题,但我发送了一个单一的连接请求,而该机制应该可以防止 spam/bulk 电子邮件,
- 被列入黑名单 - 这也可能是原因,但一般来说,这些信息会被放入对我发送的其中一个 SMTP 命令的(否定)回复中。
对于可能导致延迟的原因以及如何避免延迟(如果可能的话)的任何建议,我将不胜感激。
我与 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 命令。
我目前正在尝试编写一个简单的 Spring 电子邮件验证微服务。我正在使用 Apache SMTPClient API 连接到 SMTP 服务器并验证电子邮件地址是否存在(连接 -> 登录 -> setSender -> setRecipient -> 注销 -> 断开连接)。当连接到大多数大型电子邮件提供商(gmail、yahoo 等)时没有问题,但对于其他人来说,连接时会有奇怪的 5-20 秒延迟。例如,对于 protonmail,我有时会等待看起来像是固定的 5 秒延迟,有时我会在 ~150 毫秒后正常连接。对于其他一些较小的服务,每次我尝试连接时都是固定延迟。 由于我正在尽最大努力减少此类验证所需的时间,这是一个相当大的问题,因为在没有遇到此类问题时通常需要 <2 秒。
我试图找出延迟的原因,但遇到了 2 种可能的解释:
- 延迟 - 虽然它导致的延迟符合问题,但我发送了一个单一的连接请求,而该机制应该可以防止 spam/bulk 电子邮件,
- 被列入黑名单 - 这也可能是原因,但一般来说,这些信息会被放入对我发送的其中一个 SMTP 命令的(否定)回复中。
对于可能导致延迟的原因以及如何避免延迟(如果可能的话)的任何建议,我将不胜感激。
我与 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
.
在这种情况下,我可以通过简单地使用套接字来解决问题 - 如果您需要做的只是通过发送 RCPT TO
命令来验证电子邮件的存在,这是最好的方法.我个人找不到任何 Java API 都可以避免我遇到的问题 和 允许轻松发送 SMTP 命令。