Очень долгое время подключения к некоторым SMTP — серверам

#java #spring #email #smtp

Вопрос:

В настоящее время я пытаюсь написать простой микросервис проверки электронной почты Spring. Я использую API Apache SmtpClient для подключения к SMTP-серверу и проверки наличия адреса электронной почты (подключение — > вход — > > setSender ->>> setRecipient ->>>> выход — > > > > > отключение). При подключении к большинству крупных поставщиков услуг электронной почты (gmail, yahoo и т.д.) Проблем нет, но для других при подключении возникает странная задержка в 5-20 секунд. Например, с помощью protonmail я иногда жду, что выглядит как фиксированная задержка 5 секунд, иногда я нормально подключаюсь через ~150 мс. С некоторыми другими, более мелкими сервисами это фиксированная задержка каждый раз, когда я пытаюсь подключиться. Поскольку я делаю все возможное, чтобы сократить время, необходимое для такой проверки, это довольно серьезная проблема, учитывая, что она обычно занимает

Я пытался найти причину этой задержки, и я столкнулся с 2 потенциальными объяснениями:

  • тарпит — хотя задержка, которую это вызывает, соответствует проблеме, я отправляю отдельный запрос на подключение, в то время как механизм должен предотвращать спам/массовые электронные письма,
  • занесение в черный список — это также может быть причиной, но в целом эта информация вносится в (отрицательный) ответ на одну из команд SMTP, которые я отправляю.

Я был бы признателен за любые предложения о том, что может быть причиной задержки и как ее избежать (если это вообще возможно).

Комментарии:

1. Задержка обычно происходит из-за сбоя rDNS или тайм-аута.

Ответ №1:

Я сделал пару SMTP-подключений mail.protonmail.ch , и он определенно делает некоторые необычные вещи. Я думаю, что они внедряют разновидность брезентового покрытия.

Например, иногда после подключения 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 будет ждать «реального» ответа 220, прежде чем отправлять EHLO .

Комментарии:

1. Спасибо за ответ — я заметил такое поведение, но не понял, что это значит. Похоже, базовый API Apache SmtpClient не подходит для задачи, которую я пытаюсь выполнить (похоже, я мало что могу сделать с методом подключения) — может быть, есть лучший API для подключения к серверу и отправки команд SMTP таким образом, чтобы сервер не рассматривал меня как спамера?

2. Вы отметили свой вопрос java тегом. Я не слишком знаком с java, но в Python есть smtplib библиотека, которая хорошо работает. Видишь docs.python.org/3/library/smtplib.html . Может быть, в java есть что-то подобное.

Ответ №2:

В этом случае я смог решить проблему, просто используя сокеты — если все, что вам нужно сделать, это проверить наличие электронной почты, отправив RCPT TO команду, это лучший способ сделать это. Лично я не смог найти ни одного API Java, которые бы одновременно устраняли возникшую у меня проблему и позволяли легко отправлять команды SMTP.