0
我有一个返回会话的方法。我的目标是,当方法被调用时,它总是应该返回一个新的会话。我有一个Web应用程序,当我点击“开始”或“发送”时,它总是连接并发送邮件。Javamail - 无法在Web应用程序中获得新会话
我有以下情况:
- 我连接()到服务器,这就需要我自己的自定义信任。
- 如果我连接到这台服务器,我应该从下拉框中选择truststorename.jks。 它应该工作。如果我不选择我的信任库,则应抛出异常。
- 如果我连接到另一台服务器,它不需要我自己的自定义信任库,那么我可以选择“无”。所以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);
}
是的,有需要我自己的自定义信任一个服务器......所以,当我选择它的工作原理,它应该像...当我更改为“无”的过程异常下拉信任库的名称应该抛出;) – 2013-02-26 02:33:01
应该用什么方法调用? – 2013-02-26 08:02:54
无论是在Session.getInstance()还是Transport.connect()..都来自javamail ...当我在开始时选择“无”时,他抛出异常成功。但在此之后,他总是抛出异常。如果我选择“无”或“mytruststore.jks”并不重要 – 2013-02-26 22:44:53