67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package imap_server
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"log"
|
|
|
|
"mail_go/config"
|
|
"mail_go/internal/store"
|
|
|
|
"github.com/emersion/go-imap/backend"
|
|
imapserver "github.com/emersion/go-imap/server"
|
|
)
|
|
|
|
// IMAPServer wraps a go-imap Server and provides mailbox access capability.
|
|
type IMAPServer struct {
|
|
stores *store.Stores
|
|
cfg config.IMAPConfig
|
|
}
|
|
|
|
// NewIMAPServer creates a new IMAP server instance.
|
|
func NewIMAPServer(cfg config.IMAPConfig, stores *store.Stores) *IMAPServer {
|
|
return &IMAPServer{
|
|
stores: stores,
|
|
cfg: cfg,
|
|
}
|
|
}
|
|
|
|
// newServer creates a configured imapserver.Server with the given address.
|
|
func (s *IMAPServer) newServer(addr string) *imapserver.Server {
|
|
be := &imapBackend{stores: s.stores}
|
|
srv := imapserver.New(be)
|
|
srv.Addr = addr
|
|
srv.AllowInsecureAuth = true
|
|
return srv
|
|
}
|
|
|
|
// Start starts the IMAP server on the plain-text port.
|
|
func (s *IMAPServer) Start() error {
|
|
srv := s.newServer(s.cfg.Addr)
|
|
log.Printf("IMAP server listening on %s", s.cfg.Addr)
|
|
return srv.ListenAndServe()
|
|
}
|
|
|
|
// StartTLS starts the IMAP server on the TLS port.
|
|
func (s *IMAPServer) StartTLS() error {
|
|
if s.cfg.TLSCert == "" || s.cfg.TLSKey == "" {
|
|
return fmt.Errorf("IMAP TLS certificate or key not configured")
|
|
}
|
|
|
|
cert, err := tls.LoadX509KeyPair(s.cfg.TLSCert, s.cfg.TLSKey)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load IMAP TLS certificate: %w", err)
|
|
}
|
|
|
|
srv := s.newServer(s.cfg.TLSAddr)
|
|
srv.TLSConfig = &tls.Config{
|
|
Certificates: []tls.Certificate{cert},
|
|
}
|
|
|
|
log.Printf("IMAPS server listening on %s", s.cfg.TLSAddr)
|
|
return srv.ListenAndServeTLS()
|
|
}
|
|
|
|
// ensure imapBackend satisfies backend.Backend at compile time
|
|
var _ backend.Backend = (*imapBackend)(nil)
|