#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.