javamail NTLM-аутентификация с использованием учетных данных текущего пользователя

Как я могу использовать 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)

person Henno Vermeulen    schedule 13.05.2014    source источник
comment
Я использую JavaMail 1.4.7   -  person Henno Vermeulen    schedule 13.05.2014


Ответы (1)


Я не уверен, что есть способ сделать это без имени пользователя и пароля. Возможно, вы можете написать код для Windows, который может получать имя пользователя и пароль из локальной службы аутентификации, а затем передавать их в JavaMail. Сама JavaMail, конечно же, не может этого сделать.

Кроме того, вы можете захотеть перейти на JavaMail 1.5.2, хотя это не поможет вам в решении этой проблемы.

person Bill Shannon    schedule 13.05.2014
comment
Также спасибо за предложение обновить JavaMail. Я не заметил обновления, потому что я использовал maven с groupId javax.mail, который, похоже, изменился на com.sun.mail - person Henno Vermeulen; 14.05.2014