2014-03-26 1 views
6

전자 메일을 보내는 담당 클래스를 수정했습니다. 그것은이처럼 보였다 (간체) : 나는 null에 내 완전한 깜짝에 session을 설정 나의 일 동안javax.mail.Session의 사용법은 무엇입니까?

/* ... */ 
Properties props = System.getProperties(); 
props.put("mail.smtp.host", A_VALID_IP_OF_MAIL_SERVER); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    Message msg = new MimeMessage(session); 
    /* msg.setFrom(); msg.addRecipient(); etc. */ 
    Transport.send(msg); 
    System.out.println("Sent!"); 
} 
catch (Exception e) { /* ... */ } 
/* ... */ 

클래스는 여전히 잘 작동했다. nullMimeMessage 생성자에 전달하면 문제가되지 않습니다. 그것은 예외 또는 아무것도 던지지 않습니다. 또한, Transport.send() 방법은 다음 줄을 포함 세션이 null입니다

240 Session s = (msg.session != null) ? msg.session : 241 Session.getDefaultInstance(System.getProperties(), null);

그렇다면 그것은 단지 시스템 등록 정보를 사용하여 새 조직을 만듭니다. 그런 다음 Session 개체를 만드는 목적은 무엇입니까? MimeMessage에 전달할 내용이 중요하지 않은 경우 왜 기본 생성자가 있습니까? example from Googleexample from tutorialspoint 그들은 모두 꽤 쓸모없는 것 같다 Session 객체를 생성 :

나는 같은 javax.mail 사용 예,의 숫자를 보았다. 왜 그렇게하는 사람이 있을까요?

+0

멀티 스레드 응용 프로그램에서 Javamail을 사용하기 전까지는 훌륭하게 작동합니다. 그러면 System.getProperties()가 전역 객체이기 때문에 결국 당신을 물게됩니다. – Brain2000

답변

10

그러면 세션 객체를 만드는 목적은 무엇입니까?

세션은 메일 호스트와 상호 작용하는 방식의 컨텍스트입니다. 여기에는 메일 호스트의 출력 디버깅, 시간 초과 및 인증 메커니즘이 포함되지만 이에 국한되지는 않습니다. 다른 방법으로 동일한 메일 호스트와 상호 작용하려는 경우 세션은이 정보를 보유하는 객체입니다.

단일 JVM이 여러 메일 서버에 연결해야하는 경우 두 개의 다른 세션이 필요합니다. 이것은 JavaMail FAQ에 자세히 설명되어 있습니다 :

같은 JVM에서 다른 코드 (예를 들어, 동일한 애플리케이션 서버에) 이미 속성을 사용하여 기본 세션을 만들었습니다, 당신은 자신의 세션 사용하게 할 수있는 경우 및 귀하의 속성은 무시됩니다. 이는 종종 속성 설정이 무시되는 이유를 설명합니다. 이 문제를 피하려면 항상 Session.getInstance를 사용하십시오.

대부분의 JavaMail 예제는 common mistakes 테스트를 통과하지 못합니다. 참조하려고하면 JavaMail API sample programsSession.getDefaultInstance 거의 모든 코드에 대한 올바른 선택입니다. 대부분의 코드는 Session.getInstance을 사용해야합니다. MimeMessage에 대한 기본 생성자를 포함하면 잘못된 동작을 유발할 수 있습니다.

+0

그걸 추가하려면 ... null 세션에 대한 지원은 사람들이 망쳐 놓고 세션을 만들지 못하는 경우에 적절한 행동을 제공하는 것이 대부분입니다. –