Я пытаюсь проверить, правильно ли введены настройки / учетные данные 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 или реализован какой-либо другой метод, позволяющий определить, неверны ли учетные данные.