Почему при подключении с учетными данными через SMTP не выполняется проверка подлинности?

Пытаясь создать клиент электронной почты с использованием JavaFX и Jakarta Mail, я хотел реализовать тест соединения, чтобы убедиться, что учетные данные, введенные пользователем, действительно работают как для IMAP, так и для SMTP-сервера, который они указали. У меня пока нет проблем с проверкой учетных данных IMAP.

Для моего кода проверки SMTP я поискал в Интернете возможный подход, наткнулся на этот вопрос и реализовал его в своем проекте следующим образом:

      public static boolean canConnectViaSmtp (String host, int port, String username, String password) {
        Properties properties = new Properties ();
        properties.put ("mail.smtp.auth", true);
        properties.put ("mail.smtp.starttls.enable", true);
        properties.put ("mail.debug", true);

        Session session = Session.getInstance (properties, null);
        session.setDebug (true);
        session.setDebugOut (System.out);
        Transport transport;

        try {
            transport = session.getTransport ("smtp");
        } catch (NoSuchProviderException e) {
            System.err.println ("Could not connect to smtp://" + host + ":" + port + ", Jakarta Mail is missing the SMTP provider");
            e.printStackTrace ();
            return false;
        }

        try {
            transport.connect (host, port, username, password);
            transport.close ();
        } catch (AuthenticationFailedException e) {
            System.err.println ("Credentials for smtp://" + host + ":" + port + " invalid");
            return false;
        } catch (MessagingException e) {
            System.err.println ("Could not connect to smtp://" + host + ":" + port + ", Jakarta Mail is reporting an error");
            e.printStackTrace ();
            return false;
        }

        return true;
}

Вопрос, который я связал выше, похоже, указывает на то, что это должно подтвердить, что учетные данные работают. Однако до сих пор я пробовал два SMTP-сервера под моим контролем, и обе попытки подключения не вернулись. false с учетными данными я могу гарантировать, что они не работают.

В выходных данных отладки Jakarta Mail я также не вижу попыток выполнить SMTP AUTH (журнал сокращен):

      DEBUG: setDebug: Jakarta Mail version 2.0.0
DEBUG: getProvider() returning jakarta.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtpserver", port 25, isSSL false
... pre-STARTTLS communication ...
STARTTLS
220 TLS go ahead
EHLO mymachine
250-smtpserver Hello mymachine
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250 HELP
DEBUG SMTP: Found extension "SIZE", arg "52428800"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "HELP", arg ""
QUIT
221 smtpserver closing connection

Хотя я пытался взглянуть на код Jakarta Mail, у меня нет времени, чтобы попытаться полностью понять его на всех уровнях абстракции. Это приводит меня к моему вопросу: возможна ли проверка учетных данных SMTP через Jakarta Mail, и если да, то как?

1 ответ

Решение

Ваши серверы не настроены на отправку расширения аутентификации SMTP , судя по ответу EHLO.

В этом случае учетные данные не отправляются клиентом (поскольку сервер их все равно не понял).

В ответе сервера вы должны увидеть что-то вроде этого:

      250-AUTH GSSAPI DIGEST-MD5

Выдержка из RFC:

Ключевое слово AUTH EHLO содержит в качестве параметра список имен доступных механизмов [SASL], разделенных пробелами. Список доступных механизмов МОЖЕТ измениться после успешной команды STARTTLS [SMTP-TLS].

Другие вопросы по тегам