Как я могу использовать JavaMail API с аутентификацией NTLM на сервере Exchange без необходимости указывать имя пользователя и пароль, а вместо этого автоматически использовать учетные данные текущего пользователя, вошедшего в систему? ("Единая точка входа")
Я намерен предоставить моей клиентской программе (которая работает на компьютерах с Windows в сети моей компании) возможность отправлять электронную почту без необходимости указывать учетные данные и без необходимости разрешать ретрансляцию для компьютеров в сети из соображений безопасности. (В конце я хотел бы сделать это с помощью SmtpAppender log4j в сочетании с переопределениями системных свойств, но я создал SSCCE ниже, чтобы отладить проблему.)
Я могу успешно использовать NTLM-аутентификацию для отправки электронной почты, если я укажу имя пользователя и соответствующий ему действующий пароль Windows:
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailTest {
public static void main(String[] args) {
String from = "[email protected]";
String to = "[email protected]";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "myserver.mydomain");
props.put("mail.debug", "true");
props.put("mail.smtp.auth.mechanisms", "NTLM");
props.put("mail.smtp.auth.ntlm.domain", "mydomain");
final String username = "myusername";
final String password = "mypassword";
Session session =
Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject("Testing!");
message.setText("Hello world!");
Transport.send(message);
System.out.println("Sent message successfully");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
Когда я использую пустой пароль, это не удается с javax.mail.Authentication FailedException: 535 5.7.3 Аутентификация не удалась.
Когда я заменяю код для создания сеанса просто:
Session session = Session.getInstance(props);
то выдается следующее исключение, и я вижу из выходных данных отладки, что не было предпринято никаких попыток подключиться к серверу:
Exception in thread "main" java.lang.RuntimeException: javax.mail.Authentication
FailedException: failed to connect, no password specified?
at MailTest.main(MailTest.java:51)
Caused by: javax.mail.AuthenticationFailedException: failed to connect, no passw
ord specified?
at javax.mail.Service.connect(Service.java:329)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)