我正在修一个负责发送电子邮件的班级。它看起来像这样(简化):
/* ... */
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 Google和
example from tutorialspoint他们都创建了一个Session
对象,看起来很无用。为什么有人这样做?
答案 0 :(得分:11)
什么是创建Session对象的目的是什么?
会话是您与邮件主机进行交互的上下文。这包括但不限于调试来自邮件主机的输出,超时和身份验证机制。如果要以不同方式与同一邮件主机进行交互,则会话是保存此信息的对象。
如果单个JVM需要连接到多个邮件服务器,则需要两个不同的会话。这在JavaMail FAQ:
中有详细解释如果同一JVM中的某些其他代码(例如,在同一个应用服务器中)已经使用其属性创建了默认会话,则最终可能会使用其会话,并且您的属性将被忽略。这通常可以解释为什么您的属性设置似乎被忽略。始终使用Session.getInstance来避免此问题。
大多数JavaMail示例都未通过common mistakes测试。尝试引用JavaMail API sample programs Session.getDefaultInstance
很少是任何代码的正确选择。大多数代码都应使用Session.getInstance
。包含MimeMessage
的默认构造函数只会鼓励错误行为。