Courier IMAP サーバーを構成し、telnet を使用したときに正常に動作する IDLE 機能をテストしました。
machinexxx:~$ telnet hostname 143
Trying x.x.x.x...
Connected to hostname.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2008 Double Precision, Inc. See COPYING for distribution information.
a login loginname password
a OK LOGIN Ok.
b select INBOX
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
* 27 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1358238865] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
b OK [READ-WRITE] Ok
b IDLE
+ entering ENHANCED idle mode
* 28 EXISTS
* 1 RECENT
grails アプリケーションから同じことを試みると、Java メール IMAPFolder idle() コマンドでハングアップし、更新を取得しません。何が起こっているのですか?単純な解決策がないように見える他の質問を検索しようとしました(彼らは、マルチスレッドを提案するか、idle()メソッドを呼び出してから同じスレッドを再実行するスレッドを作成することを提案しています)実装したものはありますかコードを共有してください. ありがとう!
def serviceMethod() {
log.info("Email Service check for emails!")
runAsync {
Properties props = new Properties()
props.setProperty "mail.store.protocol", "imap"
props.setProperty "mail.imap.host", "hostname"
props.setProperty "mail.imap.port", "143"
def sess = Session.getDefaultInstance props, null
def store = sess.getStore "imap"
IMAPFolder inbox
try{
store.connect("hostname", 143, "loginname", "password")
inbox = store.getFolder "INBOX"
inbox.open(Folder.READ_WRITE)
inbox.idle(false)
def messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false))
def contents, bodyPart
messages.each { msg ->
println("${msg.subject} ${msg.sender}")
}
}
catch(MessagingException e){
log.error "Issue with connecting to email store or accessing folder or messages: " + e
}
catch(Exception eX){
log.error "enable to read email " + eX
}
finally {
if(inbox){
inbox.close(true)
}
store.close()
}
}
}