SMTP-транспорт JavaMail не генерирует исключение AuthenticationFailedException при наличии неверных учетных данных - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь проверить, правильно ли введены настройки / учетные данные SMTP для учетной записи электронной почты с использованием библиотеки JavaMail.У меня проблема в том, что соединение успешно, независимо от действительных или недействительных учетных данных.

Это проверяется на учетной записи GMail, для которой включен доступ к приложениям третьей части, и к которой можно подключиться через провайдеров IMAP и GIMAPвключены с JavaMail.Если настройки SMTP правильные, он также может отправлять почту, я просто пытаюсь добавить слой, чтобы при настройке новой учетной записи проверялись учетные данные и параметры SMTP для проверки правильности конфигурации.

Более общая картина заключается в том, что проект, которому принадлежит этот код, будет использоваться не только для учетных записей GMail, он должен поддерживать любую службу электронной почты IMAP / SMTP.

Я пробовал несколько вариантов создания сеанса и транспорта,и в первую очередь следовал примеру ответа в связанных вопросах:

Транспорт Javamail успешно прошел аутентификацию с недействительными учетными данными

Проверка учетных данных сервера smtp с использованием Java без фактической отправкиmail

Эти ответы, похоже, не работают для меня, так как проблема в том, что транспорт устанавливает успешное соединение с недействительными учетными данными, попытка отправить сообщение не удалась, хотя с MessagingException, чтоне является экземпляром AuthenticationFailedException .. во втором из этих двух связанных вопросов, в нескольких комментариях утверждается, что есть похожая проблема без решения.

// For the purposes of this code snippet getSmtpUsername() and getSmtpPassword() return a constant string value representing the username and password to be used when logging into SMTP server.

public Authenticator getSMTPAuthenticator() {
    return new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication( getSmtpUsername(), getSmtpPassword() );
        }
    };
}

public boolean authenticateSMTP( SMTPConfiguration smtpConfiguration ) throws MessagingException {
    try {
        Properties properties = new Properties(  );
        properties.put( "mail.smtp.auth", true );
        properties.put( "mail.smtp.host", "smtp.gmail.com" );
        properties.put( "mail.smtp.port", 465 );
        properties.put( "mail.smtp.socketFactory.port", 465);
        properties.put( "mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory" );

        Transport transport = Session.getInstance( properties, getSMTPAuthenticator() ).getTransport("smtp"); //.getTransport() also has not solved this issue
        transport.connect( "smtp.gmail.com", 465, getSmtpUsername(), getSmtpPassword() );
        transport.close();
        return true;
    } catch ( AuthenticationFailedException e ) { //TODO: this exception just never happens even with wrong credentials...
        return false;
    }
}

Мой ожидаемый результат заключается в том, что если getSmtpUsername () или getSmtpPassword () вернут строковое значение, котороене соответствует действительной учетной записи, тогда будет выдано исключение AuthenticationFailedException или реализован какой-либо другой метод, позволяющий определить, неверны ли учетные данные.

1 Ответ

0 голосов
/ 31 декабря 2018

После внесения изменений, предложенных Биллом Шенноном, выяснилось, что ошибка на самом деле была логической ошибкой, когда getSmtpPassword () возвращала пароль IMAP (который приводил к успешному входу в систему) при некоторых обстоятельствах, хотя в некоторых случаях это не помогло решить проблему.обновленный код выглядит следующим образом:

public boolean authenticateSMTP( SMTPConfiguration smtpConfiguration ) throws MessagingException {
    try {
        Properties properties = new Properties(  );
        properties.put( "mail.smtp.auth", true );
        properties.put( "mail.smtp.host", "smtp.gmail.com" );
        properties.put( "mail.smtp.port", 465 );
        properties.put( "mail.smtp.ssl.enable", true);

        Transport transport = Session.getInstance( properties ).getTransport();
        transport.connect( getSmtpUsername(), getSmtpPassword() );
        transport.close();
        return true;
    } catch ( AuthenticationFailedException e ) {
        return false;
    }
}
...