diff --git a/internal/storage/database.go b/internal/storage/database.go index 7558ffb..b3c0189 100644 --- a/internal/storage/database.go +++ b/internal/storage/database.go @@ -146,15 +146,15 @@ func Store(body *[]byte) (string, error) { from = &mail.Address{Name: env.GetHeader("From")} } - messageID := strings.Trim(env.Root.Header.Get("Message-ID"), "<>") - obj := DBMailSummary{ - From: from, - To: addressToSlice(env, "To"), - Cc: addressToSlice(env, "Cc"), - Bcc: addressToSlice(env, "Bcc"), + From: from, + To: addressToSlice(env, "To"), + Cc: addressToSlice(env, "Cc"), + Bcc: addressToSlice(env, "Bcc"), + ReplyTo: addressToSlice(env, "Reply-To"), } + messageID := strings.Trim(env.Root.Header.Get("Message-ID"), "<>") created := time.Now() // use message date instead of created date @@ -294,6 +294,10 @@ func List(start, limit int) ([]MessageSummary, error) { em.Attachments = attachments em.Read = read == 1 em.Snippet = snippet + // artificially generate ReplyTo if legacy data is missing Reply-To field + if em.ReplyTo == nil { + em.ReplyTo = []*mail.Address{} + } results = append(results, em) }); err != nil { diff --git a/internal/storage/reindex.go b/internal/storage/reindex.go index 282f857..f099bb2 100644 --- a/internal/storage/reindex.go +++ b/internal/storage/reindex.go @@ -4,6 +4,8 @@ import ( "bytes" "context" "database/sql" + "encoding/json" + "net/mail" "os" "github.com/axllent/mailpit/internal/logger" @@ -43,6 +45,7 @@ func ReindexAll() { ID string SearchText string Snippet string + Metadata string } for _, ids := range chunks { @@ -63,6 +66,28 @@ func ReindexAll() { continue } + from := &mail.Address{} + fromJSON := addressToSlice(env, "From") + if len(fromJSON) > 0 { + from = fromJSON[0] + } else if env.GetHeader("From") != "" { + from = &mail.Address{Name: env.GetHeader("From")} + } + + obj := DBMailSummary{ + From: from, + To: addressToSlice(env, "To"), + Cc: addressToSlice(env, "Cc"), + Bcc: addressToSlice(env, "Bcc"), + ReplyTo: addressToSlice(env, "Reply-To"), + } + + MetadataJSON, err := json.Marshal(obj) + if err != nil { + logger.Log().Errorf("[message] %s", err.Error()) + continue + } + searchText := createSearchText(env) snippet := tools.CreateSnippet(env.Text, env.HTML) @@ -70,6 +95,7 @@ func ReindexAll() { u.ID = id u.SearchText = searchText u.Snippet = snippet + u.Metadata = string(MetadataJSON) updates = append(updates, u) } @@ -86,7 +112,7 @@ func ReindexAll() { // insert mail summary data for _, u := range updates { - _, err = tx.Exec("UPDATE mailbox SET SearchText = ?, Snippet = ? WHERE ID = ?", u.SearchText, u.Snippet, u.ID) + _, err = tx.Exec("UPDATE mailbox SET SearchText = ?, Snippet = ?, Metadata = ? WHERE ID = ?", u.SearchText, u.Snippet, u.Metadata, u.ID) if err != nil { logger.Log().Errorf("[db] %s", err.Error()) continue diff --git a/internal/storage/structs.go b/internal/storage/structs.go index ec92ec9..8503d73 100644 --- a/internal/storage/structs.go +++ b/internal/storage/structs.go @@ -82,6 +82,8 @@ type MessageSummary struct { Cc []*mail.Address // Bcc addresses Bcc []*mail.Address + // Reply-To address + ReplyTo []*mail.Address // Email subject Subject string // Created time @@ -105,10 +107,11 @@ type MailboxStats struct { // DBMailSummary struct for storing mail summary type DBMailSummary struct { - From *mail.Address - To []*mail.Address - Cc []*mail.Address - Bcc []*mail.Address + From *mail.Address + To []*mail.Address + Cc []*mail.Address + Bcc []*mail.Address + ReplyTo []*mail.Address } // AttachmentSummary returns a summary of the attachment without any binary data diff --git a/server/ui/api/v1/swagger.json b/server/ui/api/v1/swagger.json index aef41e8..8b99aab 100644 --- a/server/ui/api/v1/swagger.json +++ b/server/ui/api/v1/swagger.json @@ -1259,6 +1259,13 @@ "description": "Read status", "type": "boolean" }, + "ReplyTo": { + "description": "Reply-To address", + "type": "array", + "items": { + "$ref": "#/definitions/Address" + } + }, "Size": { "description": "Message size in bytes (total)", "type": "integer",