2014-03-26 21 views
6

我正在修理負責發送電子郵件的課程。它看起來像這樣(簡化):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) { /* ... */ } 
/* ... */ 

在我的工作,我設置sessionnull和我絕對驚喜的類仍然能正常工作。如果我通過nullMimeMessage的構造函數沒關係。它不會拋出異常或任何東西。此外,Transport.send()方法包括下列行:

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

所以如果會話是null它只是創建使用系統屬性一個新的。那麼什麼是創建一個Session對象的目的呢?爲什麼不MimeMessage有一個默認的構造函數,如果它沒有關係你在那裏通過?

我觀察的數目的使用javax.mail的例子,如:example from Googleexample from tutorialspoint並且它們都創建一個對象Session這似乎相當無用。爲什麼有人會那樣做?

+0

這很好,直到你開始使用多線程應用程序的Javamail,那麼最終會咬你,因爲System.getProperties()是一個全局對象。 – Brain2000

回答

10

那麼創建Session對象的目的是什麼呢?

該會話是您將如何與郵件主機進行交互的上下文。這包括但不限於調試郵件主機的輸出,超時和身份驗證機制。如果你想用不同的方式與同一個郵件主機交互,那麼會話就是保存這些信息的對象。

如果單個JVM需要連接到多個郵件服務器,則需要兩個不同的會話。對此進行了詳細解釋了JavaMail FAQ

如果在同一個JVM一些其他的代碼(例如,在相同的應用服務器)已經創建了自己的屬性的默認會議,你可能會使用其會話和你的屬性將被忽略。這常常解釋爲什麼你的財產設置似乎被忽略。總是使用Session.getInstance來避免這個問題。

大多數JavaMail示例未通過common mistakes測試。嘗試引用JavaMail API sample programsSession.getDefaultInstance很少是任何代碼的正確選擇。大多數代碼應該使用Session.getInstance。包括MimeMessage的默認構造函數只會鼓勵錯誤的行爲。

+0

補充說明......對於空會話的支持主要是爲了在人們搞砸並且無法創建會話的情況下提供一些合理的行爲。 –