Files
crockery/internal/imap/server.go
2018-03-05 12:19:04 +00:00

63 lines
1.1 KiB
Go

package imap
import (
"context"
"io"
"log"
imapbackend "github.com/emersion/go-imap/backend"
imapserver "github.com/emersion/go-imap/server"
"ur.gs/crockery/internal/store"
)
type Server interface {
Run()
io.Closer
}
func NewServer(cancel context.CancelFunc, datastore store.Interface, starttls bool) Server {
out := &concrete{
cancel: cancel,
store: datastore,
}
out.server = imapserver.New(out)
if starttls {
out.server.Addr = ":143"
} else {
out.server.Addr = ":993"
}
return out
}
type concrete struct {
cancel context.CancelFunc
store store.Interface
server *imapserver.Server
}
func (c *concrete) Run() {
if err := c.server.ListenAndServe(); err != nil {
log.Printf("Error serving IMAP %s: %v", c.server.Addr, err)
} else {
log.Printf("Stopped listening on IMAP %s", c.server.Addr)
}
c.cancel()
}
// backend implementation for go-smtp
func (c *concrete) Login(string, string) (imapbackend.User, error) {
return nil, nil
}
func (c *concrete) Close() error {
c.cancel() // FIXME: this doesn't touch the server
return nil
}