diff --git a/smtpd/smtpd.go b/smtpd/smtpd.go index 00fbcea..3420167 100644 --- a/smtpd/smtpd.go +++ b/smtpd/smtpd.go @@ -4,6 +4,7 @@ import ( "bytes" "net" "net/mail" + "regexp" "github.com/axllent/mailpit/config" "github.com/axllent/mailpit/logger" @@ -19,7 +20,15 @@ func mailHandler(origin net.Addr, from string, to []string, data []byte) error { } if _, err := storage.Store(storage.DefaultMailbox, data); err != nil { - logger.Log().Errorf("error storing message: %s", err.Error()) + // Value with size 4800709 exceeded 1048576 limit + re := regexp.MustCompile(`(Value with size \d+ exceeded \d+ limit)`) + tooLarge := re.FindStringSubmatch(err.Error()) + if len(tooLarge) > 0 { + logger.Log().Errorf("[db] error storing message: %s", tooLarge[0]) + } else { + logger.Log().Errorf("[db] error storing message") + logger.Log().Errorf(err.Error()) + } return err } diff --git a/storage/database.go b/storage/database.go index edc299a..d990205 100644 --- a/storage/database.go +++ b/storage/database.go @@ -209,6 +209,8 @@ func Store(mailbox string, b []byte) (string, error) { return "", err } + statsAddNewMessage(mailbox) + // save the raw email in a separate collection raw := clover.NewDocument() raw.Set("_id", id) @@ -218,12 +220,11 @@ func Store(mailbox string, b []byte) (string, error) { if err != nil { // delete the summary because the data insert failed logger.Log().Debugf("[db] error inserting raw message, rolling back") - _ = DeleteOneMessage(mailbox, id) + DeleteOneMessage(mailbox, id) + return "", err } - statsAddNewMessage(mailbox) - count++ if count%100 == 0 { logger.Log().Infof("100 messages added in %s", time.Since(per100start)) @@ -399,10 +400,7 @@ func GetMessage(mailbox, id string) (*data.Message, error) { from = &mail.Address{Name: env.GetHeader("From")} } - date, err := env.Date() - if err != nil { - // date = - } + date, _ := env.Date() obj := data.Message{ ID: q.ObjectId(), @@ -522,11 +520,18 @@ func UnreadMessage(mailbox, id string) error { // DeleteOneMessage will delete a single message from a mailbox func DeleteOneMessage(mailbox, id string) error { + q, err := db.FindById(mailbox, id) + if err != nil { + return err + } + + unreadStatus := !q.Get("Read").(bool) + if err := db.DeleteById(mailbox, id); err != nil { return err } - statsDeleteOneMessage(mailbox) + statsDeleteOneMessage(mailbox, unreadStatus) return db.DeleteById(mailbox+"_data", id) } diff --git a/storage/stats.go b/storage/stats.go index 4c3fc57..37a8162 100644 --- a/storage/stats.go +++ b/storage/stats.go @@ -63,13 +63,23 @@ func statsAddNewMessage(mailbox string) { statsLock.Unlock() } -// Deleting one will always mean it was read -func statsDeleteOneMessage(mailbox string) { +// Delete one message from the totals. If the message was unread, +// then it will also deduct one from the Unread status. +func statsDeleteOneMessage(mailbox string, unread bool) { statsLock.Lock() s, ok := mailboxStats[mailbox] if ok { + // deduct from the totals + if s.Total > 0 { + s.Total = s.Total - 1 + } + // only deduct if the original was unread + if unread && s.Unread > 0 { + s.Unread = s.Unread - 1 + } + mailboxStats[mailbox] = data.MailboxStats{ - Total: s.Total - 1, + Total: s.Total, Unread: s.Unread, } }