2013-02-25 33 views
0

我有一个返回会话的方法。我的目标是,当方法被调用时,它总是应该返回一个新的会话。我有一个Web应用程序,当我点击“开始”或“发送”时,它总是连接并发送邮件。Javamail - 无法在Web应用程序中获得新会话

我有以下情况:

  1. 我连接()到服务器,这就需要我自己的自定义信任。
  2. 如果我连接到这台服务器,我应该从下拉框中选择truststorename.jks。 它应该工作。如果我不选择我的信任库,则应抛出异常。
  3. 如果我连接到另一台服务器,它不需要我自己的自定义信任库,那么我可以选择“无”。所以java采用默认配置。

应该抛出的异常是在JavaMail的的Transport.connect()方法:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

问题:

现在,当我启动或重新启动web应用 - 它仅适用于第一次。

因此,如果我选择我自己的信任库,它也不例外。但是,然后我从下拉框中选择“无”或“无”,但它仍然发送成功,而不是抛出异常。所以我认为旧会话仍然存在,并且只有在重新部署Web应用程序时才会创建新会话。也许与系统属性有冲突?还是码头?

private Session connect(SMTPTask task) { 

    log.debug("Connecting to SMTP"); 
    Properties props = new Properties(); 
    Properties systemProps = System.getProperties(); 

    if (task.getKeyStorePath().contains("None")) { 
     systemProps.remove("javax.net.ssl.trustStore"); 
     systemProps.remove("javax.net.ssl.trustStorePassword"); 
     System.setProperties(systemProps); 
     props.remove("mail.smtp.ssl.socketFactory"); 
    } else { 

     systemProps.put("javax.net.ssl.trustStore", "src/main/resources/stores/" + task.getKeyStorePath()); 
     systemProps.put("javax.net.ssl.trustStorePassword", "changeit"); 
     System.setProperties(systemProps); 

     SSLSocketFactory factory = null; 
     try { 
      SSLContext ctx; 
      KeyManagerFactory kmf; 
      KeyStore ks; 
      char[] passphrase = "changeit".toCharArray(); 

      ctx = SSLContext.getInstance("TLS"); 
      kmf = KeyManagerFactory.getInstance("SunX509"); 
      ks = KeyStore.getInstance("JKS"); 

      URL resource = this.getClass().getResource("/stores/" + task.getKeyStorePath()); 
      File file = new File(resource.toURI()); 

      FileInputStream fis = new FileInputStream(file); 
      ks.load(fis, passphrase); 
      fis.close(); 
      kmf.init(ks, passphrase); 
      ctx.init(kmf.getKeyManagers(), null, null); 

      factory = ctx.getSocketFactory(); 

      props.put("mail.smtp.ssl.socketFactory", factory); 
     } catch (Exception e) { 
      log.error("Error with SSLFactory", e); 
     } 
    } 

    String host = task.getHost(); 
    String port = String.valueOf(task.getPort()); 

    props.put("mail.smtps.host", host); 
    props.put("mail.smtps.port", port); 
    props.put("mail.smtps.auth", "true"); 
    props.put("mail.imaps.fetchsize", "22020096"); 

    return Session.geInstance(props); 
    } 

别的地方我做的:

public void send() { 
    ... 
    Session s = connect(task); 
    ... 
} 

编辑:

我并不是想与MailSSLFactory做到这一点:

private Session connect(SMTPTask task) { 

    ... 

     try { 
      MailSSLSocketFactory factory = new MailSSLSocketFactory(); 
      KeyManagerFactory kmf= KeyManagerFactory.getInstance("SunX509"); 
      KeyStore ks = KeyStore.getInstance("JKS"); 
      char[] passphrase = "changeit".toCharArray(); 

      URL resource = this.getClass().getResource("/stores/" + task.getKeyStorePath()); 
      File file = new File(resource.toURI()); 

      FileInputStream fis = new FileInputStream(file); 
      ks.load(fis, passphrase); 
      fis.close(); 
      kmf.init(ks,passphrase); 
      factory.setKeyManagers(kmf.getKeyManagers()); 
     factory.setTrustAllHosts(true); 

      props.put("mail.smtp.ssl.socketFactory", factory); 
     } catch (Exception e) { 
      log.error("Error with SSLFactory", e); 
     } 
    } 

    props.put("mail.smtps.host", host); 
    props.put("mail.smtps.port", port); 
    props.put("mail.smtps.auth", "true"); 
    props.put("mail.imaps.fetchsize", "22020096"); 

    return Session.getInstance(props); 
} 

回答

0

你有什么期望扔当您选择“无”时是例外吗?当然Session.getInstance不会抛出异常。也许您为会话配置的属性实际上不起作用,但在您尝试使用它连接到邮件服务器之前,您将无法找到它。

+0

是的,有需要我自己的自定义信任一个服务器......所以,当我选择它的工作原理,它应该像...当我更改为“无”的过程异常下拉信任库的名称应该抛出;) – 2013-02-26 02:33:01

+0

应该用什么方法调用? – 2013-02-26 08:02:54

+0

无论是在Session.getInstance()还是Transport.connect()..都来自javamail ...当我在开始时选择“无”时,他抛出异常成功。但在此之后,他总是抛出异常。如果我选择“无”或“mytruststore.jks”并不重要 – 2013-02-26 22:44:53