Convert from BoltDB to Maildir storage for emails

This commit is contained in:
2018-06-26 03:08:51 +01:00
parent d25ed6c1bd
commit a3c2508160
19 changed files with 869 additions and 175 deletions

View File

@@ -5,40 +5,47 @@ import (
"io"
"io/ioutil"
"log"
"net/mail"
// "net/mail"
"golang.org/x/sync/errgroup"
)
type SpoolInterface interface {
SpoolMessage([]Account, io.Reader) error
}
// FIXME: we don't actually spool for now, we just store it to each user's
// mailbox. This might lead to oddness in the partial delivery case.
func (c *concrete) deliver(account Account, data []byte) error {
// FIXME: this could be a FindOrCreateMaildir call for atomic create?
maildir, err := c.FindMaildir(account, "")
if err != nil {
return err
}
message := Message{
Maildir: maildir,
Data: ioutil.NopCloser(bytes.NewReader(data)),
}
log.Printf("Creating email for %#v", account)
log.Print(string(data))
return c.CreateMessage(message)
}
// FIXME: we don't actually spool for now, we just store it in each user's
// maildir. This might lead to oddness in the partial delivery case.
func (c *concrete) SpoolMessage(recipients []Account, r io.Reader) error {
data, err := ioutil.ReadAll(r)
if err != nil {
return err
}
message, err := mail.ReadMessage(bytes.NewReader(data))
if err != nil {
return err
}
var g errgroup.Group
for _, recipient := range recipients {
message := Message{
Mailbox: recipient.DefaultMailbox,
Header: message.Header,
EML: data,
}
log.Printf("Creating email: %#v", message)
log.Print(string(data))
if err := c.CreateMessage(message); err != nil {
return err
}
recipient := recipient
g.Go(func() error { return c.deliver(recipient, data) })
}
return nil
return g.Wait()
}