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:
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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",
|
||||||
|
Reference in New Issue
Block a user