To reproduce this error, execute this sequence.
package main
import (
"log"
"time"
imap "github.com/emersion/go-imap"
idle "github.com/emersion/go-imap-idle"
"github.com/emersion/go-imap/client"
)
const (
server = "****:993"
username = "***@****"
password = "*****"
)
func main() {
// Connect to server
c, err := client.DialTLS(server, nil)
if err != nil {
log.Fatal(err)
}
log.Println("Connected")
c.SetDebug(&logger{})
// Login
if err := c.Login(username, password); err != nil {
log.Fatal(err)
}
// Don't forget to logout
defer c.Logout()
log.Println("Logged in")
for {
idleMail(c)
// do something
time.Sleep(2 * time.Second)
}
}
func idleMail(c *client.Client) {
// Examine INBOX
if _, err := c.Select("INBOX", true); err != nil {
log.Fatal(err)
}
// Close mailbox
defer c.Close()
idleClient := idle.NewClient(c)
// Create a channel to receive mailbox updates
statuses := make(chan *imap.MailboxStatus)
c.MailboxUpdates = statuses
// Start idling
stop := make(chan struct{})
done := make(chan error, 1)
closed := false
closeChannel := func() {
if !closed {
close(stop)
closed = true
}
}
go func() {
done <- idleClient.Idle(stop)
}()
// Reset after 30 seconds
reset := time.After(30 * time.Second)
// Listen for updates
for {
select {
case status := <-statuses:
log.Println("New mailbox status:", status)
closeChannel()
case err := <-done:
if err != nil {
log.Fatal(err)
}
log.Println("Not idling anymore")
return
case <-reset:
log.Println("Timeout")
closeChannel()
}
}
}
type logger struct{}
func (l *logger) Write(p []byte) (int, error) {
log.Println("[IMAP]", string(p))
return len(p), nil
}
2017/06/21 20:26:20 Connected
2017/06/21 20:26:20 [IMAP] oR174Q LOGIN *****@***** *****
2017/06/21 20:26:20 Logged in
2017/06/21 20:26:20 [IMAP] dhVfMg EXAMINE INBOX
2017/06/21 20:26:20 [IMAP] * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 3749 EXISTS
* 0 RECENT
* OK [UNSEEN 3748] First unseen.
* OK [UIDVALIDITY 1416039410] UIDs valid
* OK [UIDNEXT 3751] Predicted next UID
* OK [HIGHESTMODSEQ 3799] Highest
dhVfMg OK [READ-ONLY] Examine completed (0.000 + 0.000 secs).
imap/client: 2017/06/21 20:26:20 response has not been handled: &{* OK HIGHESTMODSEQ [3799] Highest}
2017/06/21 20:26:20 [IMAP] KQrCWA IDLE
2017/06/21 20:26:20 [IMAP] + idling
2017/06/21 20:26:50 Timeout
2017/06/21 20:26:50 [IMAP] DONE
2017/06/21 20:26:50 [IMAP] KQrCWA OK Idle completed (0.001 + 30.001 + 30.001 secs).
2017/06/21 20:26:50 Not idling anymore
2017/06/21 20:26:50 [IMAP] Fij9eA CLOSE
2017/06/21 20:26:50 [IMAP] Fij9eA OK Close completed (0.000 + 0.000 secs).
2017/06/21 20:26:52 [IMAP] -DzrKA EXAMINE INBOX
2017/06/21 20:26:52 [IMAP] * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 3749 EXISTS
* 0 RECENT
* OK [UNSEEN 3748] First unseen.
* OK [UIDVALIDITY 1416039410] UIDs valid
* OK [UIDNEXT 3751] Predicted next UID
* OK [HIGHESTMODSEQ 3799] Highest
-DzrKA OK [READ-ONLY] Examine completed (0.000 + 0.000 secs).
^\SIGQUIT: quit
PC=0x456301 m=0 sigcode=128
goroutine 0 [idle]:
runtime.futex(0x6e17b0, 0x0, 0x0, 0x0, 0x7fbc00000000, 0x27a8bc0, 0x0, 0x0, 0x7fff027a8bf0, 0x40e8cb, ...)
/usr/local/go/src/runtime/sys_linux_amd64.s:422 +0x21
runtime.futexsleep(0x6e17b0, 0x0, 0xffffffffffffffff)
/usr/local/go/src/runtime/os_linux.go:45 +0x62
runtime.notesleep(0x6e17b0)
/usr/local/go/src/runtime/lock_futex.go:145 +0x6b
runtime.stopm()
/usr/local/go/src/runtime/proc.go:1650 +0xad
runtime.findrunnable(0xc420023300, 0x0)
/usr/local/go/src/runtime/proc.go:2102 +0x2e4
runtime.schedule()
/usr/local/go/src/runtime/proc.go:2222 +0x14c
runtime.park_m(0xc42016d1e0)
/usr/local/go/src/runtime/proc.go:2285 +0xab
runtime.mcall(0x7fff027a8d80)
/usr/local/go/src/runtime/asm_amd64.s:269 +0x5b
goroutine 1 [select, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).execute(0xc42009a0a0, 0x6c4aa0, 0xc42013ca20, 0x6c4ae0, 0xc4
2046e020, 0x10002, 0x200000001, 0xc4200b7cd0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:165 +0x63b
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).Select(0xc42009a0a0, 0x5f83d2, 0x5, 0xc420011601, 0xc4202266
c0, 0x0, 0x0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/cmd_auth.go:36 +0x160
main.idleMail(0xc42009a0a0)
/go/src/mmtest/teste/teste.go:48 +0x5d
main.main()
/go/src/mmtest/teste/teste.go:40 +0x2a9
goroutine 17 [syscall, 5 minutes, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1
goroutine 18 [chan receive, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).handleContinuationReqs(0xc42009a0a0, 0xc42037b920)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:228 +0xea
created by mmtest/vendor/github.com/emersion/go-imap/client.New
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:446 +0x36b
goroutine 19 [chan send, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).handleUnilateral(0xc42009a0a0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:352 +0xc39
created by mmtest/vendor/github.com/emersion/go-imap/client.New
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:447 +0x38d
goroutine 20 [chan send, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap.(*MultiRespHandler).HandleFrom(0xc42010ed50, 0xc42037b9e0, 0xc4201e47d0, 0x0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/handle.go:77 +0x16e
created by mmtest/vendor/github.com/emersion/go-imap/client.New
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:448 +0x3bc
goroutine 34 [chan receive, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).read(0xc42009a0a0, 0xc4201ba060, 0x0, 0x0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:116 +0x36c
created by mmtest/vendor/github.com/emersion/go-imap/client.(*Client).handleUnilateral
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:261 +0x100
goroutine 27 [chan receive, 5 minutes]:
mmtest/vendor/github.com/emersion/go-imap/responses.(*Select).HandleFrom(0xc42046e020, 0xc420226ae0, 0x0, 0x0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/responses/select.go:21 +0xe3
mmtest/vendor/github.com/emersion/go-imap/client.(*Client).execute.func2(0xc420226b40, 0x6c4ae0, 0xc42046e020, 0xc42022
6ae0)
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:160 +0x3b
created by mmtest/vendor/github.com/emersion/go-imap/client.(*Client).execute
/go/src/mmtest/vendor/github.com/emersion/go-imap/client/client.go:161 +0x6ff
rax 0xca
rbx 0x0
rcx 0x456303
rdx 0x0
rdi 0x6e17b0
rsi 0x0
rbp 0x7fff027a8bc0
rsp 0x7fff027a8b78
r8 0x0
r9 0x0
r10 0x0
r11 0x286
r12 0x0
r13 0xc42016c4e0
r14 0x43deb0
r15 0x6497f8
rip 0x456301
rflags 0x286
cs 0x33
fs 0x0
gs 0x0
exit status 2