2014-05-13 2 views
1

사용자 이름과 암호를 지정할 필요없이 NTLM 인증과 함께 JavaMail API를 사용할 수 있지만 대신 현재 로그인 한 사용자의 자격 증명을 자동으로 사용합니까? (싱글 사인온)현재 사용자의 자격 증명을 사용하는 javamail NTLM 인증

내 클라이언트 프로그램 (회사 네트워크의 Windows 컴퓨터에서 실행되는)이 자격 증명을 지정하지 않고도 컴퓨터에서 릴레이를 허용하지 않고 전자 메일을 보낼 수있게하려는 것입니다. 보안 우려로 인해 네트워크. (결국 시스템 속성 오버라이드와 함께 log4j의 SmtpAppender와 함께이 작업을하고 싶지만 문제를 디버깅하기 위해 SSCCE를 아래에 만듭니다.)

내가 지정한 경우 성공적으로 NTLM 인증을 사용하여 전자 메일을 보낼 수 있습니다. 사용자 이름과 대응하는 유효한 Windows 암호 : 실패 535 5.7.3 인증 :

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 실패 빈 암호를 사용

.

단순히 세션을 생성하는 코드를 교체 할 때 :

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) 
+0

JavaMail 1.4.7을 사용하고 있습니다. –

답변

1

사용자 이름과 비밀번호가 없어도이를 수행 할 수있는 방법이 확실하지 않습니다. 로컬 인증 서비스에서 사용자 이름과 암호를 검색하고이를 JavaMail에 전달할 수있는 Windows 관련 코드를 작성할 수 있습니다. JavaMail 자체는 확실히 이것을 할 방법이 없습니다.

또한이 문제를 해결하는 데 도움이되지 않지만 JavaMail 1.5.2로 업그레이드 할 수 있습니다.

+0

고맙습니다. 적어도 시도를 멈출 수는 있습니다. –

+0

JavaMail을 업데이트 해 주셔서 감사합니다. com.sun.mail로 변경된 것 같은 groupId javax.mail을 사용하여 maven을 사용했기 때문에 업데이트를 알지 못했습니다. –

관련 문제