Files
crockery/internal/store/spool.go

52 lines
1.0 KiB
Go

package store
import (
"bytes"
"io"
"io/ioutil"
"log"
// "net/mail"
"golang.org/x/sync/errgroup"
)
type SpoolInterface interface {
SpoolMessage([]Account, io.Reader) error
}
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
}
var g errgroup.Group
for _, recipient := range recipients {
recipient := recipient
g.Go(func() error { return c.deliver(recipient, data) })
}
return g.Wait()
}