javax.mail.Session有什么用?

时间:2014-03-26 10:21:36

标签: java javamail javax.mail

我正在修一个负责发送电子邮件的班级。它看起来像这样(简化):

/* ... */
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) { /* ... */ }
/* ... */

在我的工作中,我将session设置为null,令我惊讶的是,课程仍然很好。如果我将null传递给MimeMessage构造函数并不重要。它不会抛出异常或任何东西。此外,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对象,看起来很无用。为什么有人这样做?

1 个答案:

答案 0 :(得分:11)

  

什么是创建Session对象的目的是什么?

会话是您与邮件主机进行交互的上下文。这包括但不限于调试来自邮件主机的输出,超时和身份验证机制。如果要以不同方式与同一邮件主机进行交互,则会话是保存此信息的对象。

如果单个JVM需要连接到多个邮件服务器,则需要两个不同的会话。这在JavaMail FAQ

中有详细解释
  

如果同一JVM中的某些其他代码(例如,在同一个应用服务器中)已经使用其属性创建了默认会话,则最终可能会使用其会话,并且您的属性将被忽略。这通常可以解释为什么您的属性设置似乎被忽略。始终使用Session.getInstance来避免此问题。

大多数JavaMail示例都未通过common mistakes测试。尝试引用JavaMail API sample programs Session.getDefaultInstance很少是任何代码的正确选择。大多数代码都应使用Session.getInstance。包含MimeMessage的默认构造函数只会鼓励错误行为。