Javamail - 无法在Web应用程序中获取新会话

时间:2013-02-25 16:57:52

标签: session web-applications properties javamail

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

我有以下情况:

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

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

    问题:

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

    因此,如果我选择自己的信任库,它无异常。但是我从下拉框中选择“Nothing”或“None”,但它仍然成功发送而不是抛出异常。所以我认为旧会话仍然存在,只有在重新部署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);
    }
    

1 个答案:

答案 0 :(得分:0)

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