javax.mail.Session有什么用?

2022-09-04 21:11:52

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

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

在我的工作期间,我开始着想,令我完全惊讶的是,这门课仍然工作得很好。如果我传递给构造函数并不重要。它不会引发异常或其他任何内容。此外,该方法包括以下行:sessionnullnullMimeMessageTransport.send()

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

因此,如果会话是,它只是使用系统属性创建一个新会话。那么创建对象的目的是什么呢?为什么没有默认构造函数,如果你在那里传递什么并不重要?nullSessionMimeMessage

我查看了许多使用javax.mail的示例,例如:来自Google的示例来自教程点的示例,它们都创建了一个看起来非常无用的对象。为什么有人会这样做?Session


答案 1

那么,创建会话对象的目的是什么呢?

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

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

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

大多数 JavaMail 示例都未通过常见错误测试。尝试引用 JavaMail API 示例程序很少是任何代码的正确选择。大多数代码应使用 。包含 的默认构造函数只会鼓励错误的行为。Session.getDefaultInstanceSession.getInstanceMimeMessage


答案 2

推荐