文件夹未使用 SocketChannels

Folder is not using SocketChannels

我有以下代码:

typealias MessagePredicate = (Message) -> Boolean
object EmailHelper {
    private val session: Session by lazy {
        val props = System.getProperties()
        props["mail.imaps.usesocketchannels"] = "true"
        props["mail.imap.usesocketchannels"] = "true"
        Session.getInstance(props, null)
    }
    private val store = session.getStore("gimap") as GmailStore
    private val idleManager = IdleManager(session, Executors.newSingleThreadExecutor())
    private val folder: GmailFolder by lazy { store.getFolder("INBOX") as GmailFolder }


    init {
        store.connect("imap.gmail.com", "***@gmail.com", "***")
        folder.open(Folder.READ_ONLY)
        idleManager.watch(folder)
    }

    fun watchForMessage(condition: MessagePredicate): CompletableFuture<Message> {
        val promise = CompletableFuture<Message>()
        folder.addMessageCountListener(object : MessageCountAdapter() {
            override fun messagesAdded(e: MessageCountEvent) {
                super.messagesAdded(e)
                e.messages.firstOrNull(condition)?.let {
                    folder.removeMessageCountListener(this)
                    promise.complete(it)
                }
            }
        })
        return promise
    }

}

然而,当我 运行 这段代码时,出现以下异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.muliyul.MainKt.main(Main.kt:28)
Caused by: javax.mail.MessagingException: Folder is not using SocketChannels
    at com.sun.mail.imap.IdleManager.watch(IdleManager.java:205)
    at com.muliyul.EmailHelper.<clinit>(EmailHelper.kt:40)
    ... 1 more

我正在预先设置 属性 "mail.imaps.usesocketchannels",我也阅读了 this 问题,但我无法理解我的代码有什么问题。

有人能给我指出正确的方向吗?

旁注:电子邮件提供商是 Gmail(很明显)。

我发布这个问题一个小时后(以及 3 个小时的研究)我终于找到了答案。

您必须将 属性 mail.gimap.usesocketchannels 设置为 "true"(而不是 mail.imap.usesocketchannelsmail.imaps.usesocketchannels

这是因为 gimapimap 的协议不同。

耗时 3 小时。