1

メールには SMTP を使用し、メールの取得には imap (imap + ssl) を使用します。

私が行う接続方法の中で:

private Session connect(SMTPTask task) {

    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");

        ks.load(new FileInputStream("truststore.jks"), passphrase);

        kmf.init(ks, passphrase);
        ctx.init(kmf.getKeyManagers(), null, null);

        factory = ctx.getSocketFactory();
    } catch (Exception e) {
        log.error("Error with SSLFactory",e);
    }

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

    Authenticator authenticator = new Authenticator(task);


    Properties properties = new Properties();
    properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
    properties.setProperty("mail.smtp.auth", "true");
    //properties.setProperty("mail.imap.auth.login.disable", "true");
    properties.setProperty("mail.smtp.host", host);
    properties.setProperty("mail.smtp.port", port);
    properties.put("mail.imaps.ssl.socketFactory", factory);
    properties.setProperty("mail.imap.port", "993");

    Properties systemProps = System.getProperties();
    systemProps.put( "javax.net.ssl.trustStore", "truststore.jks");
    systemProps.put( "javax.net.ssl.trustStorePassword", "changeit");
    System.setProperties(systemProps);

    return Session.getInstance(properties, authenticator);

そして、私がする他の場所:

...
store.connect(getHost(),getUser(),getPass());
...

編集:そして、ここで次の例外が発生します:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

ここで、独自の証明書を持つカスタム トラストストアを追加したいと考えています。別の投稿では、Java でそれを行う方法を示しています:クライアント認証用のトラストストアを追加します。

しかし、どうすれば SSLSocketFactory をストアと組み合わせることができるでしょうか? では、私のストアはカスタム SSL 接続を使用していますか?

それを行う正しい方法は何ですか?それが不可能な場合、トラストストアをJavaのストアに追加する別の方法はありますか?

編集:何が欠けていますか、またはプロパティで何か間違ったことをしましたか?

よろしく

4

1 に答える 1

1

ソケットファクトリは、作成に使用されたプロパティマップを介して渡されます。Session

Properties props = new Properties();
// other properties as usual
props.put("mail.imaps.ssl.socketFactory", new MyCustomSSLSocketFactory());
Session sess = Session.getInstance(props);

詳細については、 com.sun.mail.imapパッケージの概要の下部にある表を参照してください。

于 2013-02-09T10:54:17.093 に答える