Java 方法在 Java 代理中成功执行,但如果在数据库代码中的 Java class 中执行则失败

Java method is successfully executed inside a Java agent, but fails if executed in a Java class in the database's code

在我的 XPages 应用程序中,我使用 javax.mail 库从 IMAP 帐户读取邮件消息。如果我在 Java 代理中使用它,我用来获取和保存消息的 class 工作得很好。但是,如果我在我的 XPages 项目中将完全相同的 class 放入 "Code/Java",则当我尝试获取会话存储时,这些方法会抛出 javax.mail.NoSuchProviderException: No provider for imaps

    Properties props = new Properties();
    props.setProperty("mail.imaps.socketFactory.class", "AlwaysTrustSSLContextFactory");
    props.setProperty("mail.imaps.socketFactory.port", "993");
    props.setProperty("mail.imap.ssl.enable", "true"); 
    props.setProperty("mail.imaps.ssl.trust", "*");
    URLName url = new URLName("imaps", server, 993, "", username, password);
    Session session = Session.getInstance(props, null);
    Store store = session.getStore(url); //THE ERROR OCCURS HERE
    store.connect();

我添加到项目构建路径的 javax.mail 库与我在 Java 代理中使用的完全相同。

我发现的一些针对上述异常类型的帖子表明,它可能是由构建路径中包含的 javax.mail 的多个版本引起的。但是,情况似乎并非如此,因为从构建路径中删除 javax.mail 会导致 class 无法构建。

有人知道这里有什么问题吗?

正要发表评论,但代表还不够高....

java代理是否在同一个数据库中?

如果是的话,能不能在代理不在的时候把它剪下来试试xpage?可能性不大,但可能值得检查代理是否以任何方式进行干扰。

您想查看 my article with a code sample how to read IMAP from Notes. I didn't run that code as agent, but from the command line. Chances are, that it will work better for you. Main difference (possibly?): I used the Google enhanced IMAP classes

检查一下,让我们知道它是否适合您!

请检查使用的 javax.mail 的版本和供应商。您可以通过添加

props.setProperty("mail.debug", "true" );

到您的财产。

在控制台(客户端的 Java 控制台或服务器控制台你可以看到结果,像这样:

DEBUG: JavaMail version 1.4ea

DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc]

或者,您可以通过编程方式获取可用提供程序的列表(当您没有控制台访问权限时):

Session session = Session.getInstance(props, null);
Provider[] providers = session.getProviders();
for( Provider p:providers ){
    if( ! ("".equals(tmpStr)) )
        tmpStr = tmpStr + ",";
    tmpStr = tmpStr + p.getProtocol();
}

[您会看到提供商列表不包含服务器 (8.5.3) 上的 imaps]