1
0
mirror of https://github.com/axllent/mailpit.git synced 2025-08-15 20:13:16 +02:00

API: Include Reply-To information in message summaries for message list & websocket events

This commit is contained in:
Ralph Slooten
2024-02-09 23:06:48 +13:00
parent 522733f537
commit 667218b30b
4 changed files with 51 additions and 11 deletions

View File

@@ -146,15 +146,15 @@ func Store(body *[]byte) (string, error) {
from = &mail.Address{Name: env.GetHeader("From")} from = &mail.Address{Name: env.GetHeader("From")}
} }
messageID := strings.Trim(env.Root.Header.Get("Message-ID"), "<>")
obj := DBMailSummary{ obj := DBMailSummary{
From: from, From: from,
To: addressToSlice(env, "To"), To: addressToSlice(env, "To"),
Cc: addressToSlice(env, "Cc"), Cc: addressToSlice(env, "Cc"),
Bcc: addressToSlice(env, "Bcc"), Bcc: addressToSlice(env, "Bcc"),
ReplyTo: addressToSlice(env, "Reply-To"),
} }
messageID := strings.Trim(env.Root.Header.Get("Message-ID"), "<>")
created := time.Now() created := time.Now()
// use message date instead of created date // use message date instead of created date
@@ -294,6 +294,10 @@ func List(start, limit int) ([]MessageSummary, error) {
em.Attachments = attachments em.Attachments = attachments
em.Read = read == 1 em.Read = read == 1
em.Snippet = snippet 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) results = append(results, em)
}); err != nil { }); err != nil {

View File

@@ -4,6 +4,8 @@ import (
"bytes" "bytes"
"context" "context"
"database/sql" "database/sql"
"encoding/json"
"net/mail"
"os" "os"
"github.com/axllent/mailpit/internal/logger" "github.com/axllent/mailpit/internal/logger"
@@ -43,6 +45,7 @@ func ReindexAll() {
ID string ID string
SearchText string SearchText string
Snippet string Snippet string
Metadata string
} }
for _, ids := range chunks { for _, ids := range chunks {
@@ -63,6 +66,28 @@ func ReindexAll() {
continue 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) searchText := createSearchText(env)
snippet := tools.CreateSnippet(env.Text, env.HTML) snippet := tools.CreateSnippet(env.Text, env.HTML)
@@ -70,6 +95,7 @@ func ReindexAll() {
u.ID = id u.ID = id
u.SearchText = searchText u.SearchText = searchText
u.Snippet = snippet u.Snippet = snippet
u.Metadata = string(MetadataJSON)
updates = append(updates, u) updates = append(updates, u)
} }
@@ -86,7 +112,7 @@ func ReindexAll() {
// insert mail summary data // insert mail summary data
for _, u := range updates { 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 { if err != nil {
logger.Log().Errorf("[db] %s", err.Error()) logger.Log().Errorf("[db] %s", err.Error())
continue continue

View File

@@ -82,6 +82,8 @@ type MessageSummary struct {
Cc []*mail.Address Cc []*mail.Address
// Bcc addresses // Bcc addresses
Bcc []*mail.Address Bcc []*mail.Address
// Reply-To address
ReplyTo []*mail.Address
// Email subject // Email subject
Subject string Subject string
// Created time // Created time
@@ -105,10 +107,11 @@ type MailboxStats struct {
// DBMailSummary struct for storing mail summary // DBMailSummary struct for storing mail summary
type DBMailSummary struct { type DBMailSummary struct {
From *mail.Address From *mail.Address
To []*mail.Address To []*mail.Address
Cc []*mail.Address Cc []*mail.Address
Bcc []*mail.Address Bcc []*mail.Address
ReplyTo []*mail.Address
} }
// AttachmentSummary returns a summary of the attachment without any binary data // AttachmentSummary returns a summary of the attachment without any binary data

View File

@@ -1259,6 +1259,13 @@
"description": "Read status", "description": "Read status",
"type": "boolean" "type": "boolean"
}, },
"ReplyTo": {
"description": "Reply-To address",
"type": "array",
"items": {
"$ref": "#/definitions/Address"
}
},
"Size": { "Size": {
"description": "Message size in bytes (total)", "description": "Message size in bytes (total)",
"type": "integer", "type": "integer",