Почему JavaMail не проходит аутентификацию?

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

Код работает следующим образом:

    transport = session.getTransport("smtp");
    transport.connect(hostName, port, user, password);

Согласно документации здесь, JavaMail должен использовать аутентификацию, если мы использовали эту форму метода connect(). Мы не устанавливаем никаких свойств, но если я правильно читаю эту страницу, нам это не нужно.

Мы используем mail.jar из JBoss 4.2.1.GA.

Что нам нужно сделать по-другому?

Обновление: если я использую другой метод на этой странице документации (устанавливая свойство mail.smtp.auth и предоставляя аутентификатор), аутентификация, наконец, работает. Но что мы делали не так с этим методом?


person skiphoppy    schedule 09.02.2010    source источник


Ответы (2)


Попробуйте props.put("mail.debug", "true"); для возможной отладочной информации, которая даст вам больше информации.

Кроме того, если это Windows, проверьте, работает ли брандмауэр или антивирус: http://forums.sun.com/thread.jspa?threadID=590866

person cherouvim    schedule 10.02.2010
comment
Попробовав это, стало очевидно, что Java просто не делает того, что говорится в документации. Явный вызов метода транспортного подключения с аргументами имени пользователя и пароля не вызывает проверку подлинности. Вы ДОЛЖНЫ предоставить объект Authenticator при создании почтового сеанса и предоставить информацию об имени пользователя и пароле во время обратного вызова Authenticator. Хреново быть нами, наверное. Я перекодировал его. Спасибо, Солнце... - person skiphoppy; 15.02.2010

Наконец я обнаружил, что звоню:

transport.send(message, message.getAllRecipients());

, который является статическим методом, вместо:

transport.sendMessage(message, message.getAllRecipients());

Я думаю, именно поэтому он не аутентифицировался, поэтому я думаю, что это настоящий ответ. Помог бы, если бы я разместил этот фрагмент кода, но я понятия не имел, в чем проблема. Не могу понять, почему Transport.send() является статическим методом, но если вы знаете, пожалуйста, скажите мне.

person skiphoppy    schedule 16.02.2010