【问题标题】:Very long connection time to some SMTP servers与某些 SMTP 服务器的连接时间很长
【发布时间】:2021-08-29 19:56:23
【问题描述】:

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

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

  • tarpitting - 虽然它导致的延迟适合问题,但我发送的是单个连接请求,而该机制应该防止垃圾邮件/批量电子邮件,
  • 被列入黑名单 - 这也可能是原因,但一般而言,该信息被放入对我发送的其中一个 SMTP 命令的(否定)回复中。

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

【问题讨论】:

  • 延迟通常是由于 rDNS 失败或超时。

标签: java spring email smtp


【解决方案1】:

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

例如,有时在连接后,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。一个劣质程序可能会被mail.protonmail.ch 响应的异常方式“愚弄”,并在它应该发送之前发送EHLO。然后,mail.protonmail.ch 可以断开连接,假设客户端不是“真正的”SMTP MTA。然而,真正的 MTA 会在发送 EHLO 之前等待“真正的”220 响应。

【讨论】:

  • 感谢您的回答 - 我确实注意到了这种行为,但不明白它的含义。似乎基本的 Apache SMTPClient API 对于我正在尝试完成的任务来说并不是很好(我似乎对连接方法无能为力) - 是否有更好的 API 用于连接到服务器并发送服务器不会将我视为垃圾邮件发送者的 SMTP 命令?
  • 您使用java 标签标记了您的问题。我对java不太熟悉,但是在Python中有smtplib库,效果很好。见docs.python.org/3/library/smtplib.html。也许java有类似的东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2014-09-22
    相关资源
    最近更新 更多