文件夹未使用 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.usesocketchannels
或 mail.imaps.usesocketchannels
)
这是因为 gimap
与 imap
的协议不同。
耗时 3 小时。
我有以下代码:
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.usesocketchannels
或 mail.imaps.usesocketchannels
)
这是因为 gimap
与 imap
的协议不同。
耗时 3 小时。