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() }