Bar*_*zek 8 java jakarta-mail 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) { /* ... */ }
/* ... */
Run Code Online (Sandbox Code Playgroud)
在我的工作,我设置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的例子,例如:来自Google的示例和
来自tutorialspoint的示例,他们都创建了一个Session看似毫无用处的对象.为什么有人这样做?
jme*_*ens 12
那么创建一个Session对象的目的是什么呢?
会话是您与邮件主机进行交互的上下文.这包括但不限于调试来自邮件主机的输出,超时和身份验证机制.如果要以不同方式与同一邮件主机进行交互,则会话是保存此信息的对象.
如果单个JVM需要连接到多个邮件服务器,则需要两个不同的会话.这在JavaMail FAQ中有详细解释:
如果同一JVM中的某些其他代码(例如,在同一个应用程序服务器中)已经使用其属性创建了默认会话,则最终可能会使用其会话,并且您的属性将被忽略.这通常可以解释为什么您的属性设置似乎被忽略.始终使用Session.getInstance来避免此问题.
大多数JavaMail示例都未通过常见错误测试.尝试引用JavaMail API示例程序 Session.getDefaultInstance很少是任何代码的正确选择.大多数代码应该使用Session.getInstance.包含默认构造函数MimeMessage只会鼓励错误的行为.
| 归档时间: |
|
| 查看次数: |
19462 次 |
| 最近记录: |