mirror of
https://github.com/axllent/mailpit.git
synced 2025-04-25 12:25:04 +02:00
Feature: Add reply-to:<search> search filter (#247)
This commit is contained in:
parent
667218b30b
commit
5d9aba726e
@ -42,7 +42,7 @@ func Search(search string, start, limit int) ([]MessageSummary, int, error) {
|
|||||||
var ignore string
|
var ignore string
|
||||||
em := MessageSummary{}
|
em := MessageSummary{}
|
||||||
|
|
||||||
if err := row.Scan(&created, &id, &messageID, &subject, &metadata, &size, &attachments, &read, &snippet, &ignore, &ignore, &ignore, &ignore); err != nil {
|
if err := row.Scan(&created, &id, &messageID, &subject, &metadata, &size, &attachments, &read, &snippet, &ignore, &ignore, &ignore, &ignore, &ignore); err != nil {
|
||||||
logger.Log().Errorf("[db] %s", err.Error())
|
logger.Log().Errorf("[db] %s", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ func DeleteSearch(search string) error {
|
|||||||
var snippet string
|
var snippet string
|
||||||
var ignore string
|
var ignore string
|
||||||
|
|
||||||
if err := row.Scan(&created, &id, &messageID, &subject, &metadata, &size, &attachments, &read, &snippet, &ignore, &ignore, &ignore, &ignore); err != nil {
|
if err := row.Scan(&created, &id, &messageID, &subject, &metadata, &size, &attachments, &read, &snippet, &ignore, &ignore, &ignore, &ignore, &ignore); err != nil {
|
||||||
logger.Log().Errorf("[db] %s", err.Error())
|
logger.Log().Errorf("[db] %s", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -214,7 +214,8 @@ func searchQueryBuilder(searchString string) *sqlf.Stmt {
|
|||||||
IFNULL(json_extract(Metadata, '$.To'), '{}') as ToJSON,
|
IFNULL(json_extract(Metadata, '$.To'), '{}') as ToJSON,
|
||||||
IFNULL(json_extract(Metadata, '$.From'), '{}') as FromJSON,
|
IFNULL(json_extract(Metadata, '$.From'), '{}') as FromJSON,
|
||||||
IFNULL(json_extract(Metadata, '$.Cc'), '{}') as CcJSON,
|
IFNULL(json_extract(Metadata, '$.Cc'), '{}') as CcJSON,
|
||||||
IFNULL(json_extract(Metadata, '$.Bcc'), '{}') as BccJSON
|
IFNULL(json_extract(Metadata, '$.Bcc'), '{}') as BccJSON,
|
||||||
|
IFNULL(json_extract(Metadata, '$.ReplyTo'), '{}') as ReplyToJSON
|
||||||
`).
|
`).
|
||||||
OrderBy("m.Created DESC")
|
OrderBy("m.Created DESC")
|
||||||
|
|
||||||
@ -275,6 +276,15 @@ func searchQueryBuilder(searchString string) *sqlf.Stmt {
|
|||||||
q.Where("BccJSON LIKE ?", "%"+escPercentChar(w)+"%")
|
q.Where("BccJSON LIKE ?", "%"+escPercentChar(w)+"%")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if strings.HasPrefix(lw, "reply-to:") {
|
||||||
|
w = cleanString(w[9:])
|
||||||
|
if w != "" {
|
||||||
|
if exclude {
|
||||||
|
q.Where("ReplyToJSON NOT LIKE ?", "%"+escPercentChar(w)+"%")
|
||||||
|
} else {
|
||||||
|
q.Where("ReplyToJSON LIKE ?", "%"+escPercentChar(w)+"%")
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if strings.HasPrefix(lw, "subject:") {
|
} else if strings.HasPrefix(lw, "subject:") {
|
||||||
w = w[8:]
|
w = w[8:]
|
||||||
if w != "" {
|
if w != "" {
|
||||||
|
@ -17,9 +17,13 @@ func TestSearch(t *testing.T) {
|
|||||||
for i := 0; i < testRuns; i++ {
|
for i := 0; i < testRuns; i++ {
|
||||||
msg := enmime.Builder().
|
msg := enmime.Builder().
|
||||||
From(fmt.Sprintf("From %d", i), fmt.Sprintf("from-%d@example.com", i)).
|
From(fmt.Sprintf("From %d", i), fmt.Sprintf("from-%d@example.com", i)).
|
||||||
|
CC(fmt.Sprintf("CC %d", i), fmt.Sprintf("cc-%d@example.com", i)).
|
||||||
|
CC(fmt.Sprintf("CC2 %d", i), fmt.Sprintf("cc2-%d@example.com", i)).
|
||||||
Subject(fmt.Sprintf("Subject line %d end", i)).
|
Subject(fmt.Sprintf("Subject line %d end", i)).
|
||||||
Text([]byte(fmt.Sprintf("This is the email body %d <jdsauk;dwqmdqw;>.", i))).
|
Text([]byte(fmt.Sprintf("This is the email body %d <jdsauk;dwqmdqw;>.", i))).
|
||||||
To(fmt.Sprintf("To %d", i), fmt.Sprintf("to-%d@example.com", i))
|
To(fmt.Sprintf("To %d", i), fmt.Sprintf("to-%d@example.com", i)).
|
||||||
|
To(fmt.Sprintf("To2 %d", i), fmt.Sprintf("to2-%d@example.com", i)).
|
||||||
|
ReplyTo(fmt.Sprintf("Reply To %d", i), fmt.Sprintf("reply-to-%d@example.com", i))
|
||||||
|
|
||||||
env, err := msg.Build()
|
env, err := msg.Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -44,18 +48,26 @@ func TestSearch(t *testing.T) {
|
|||||||
|
|
||||||
for i := 1; i < 51; i++ {
|
for i := 1; i < 51; i++ {
|
||||||
// search a random something that will return a single result
|
// search a random something that will return a single result
|
||||||
searchIdx := rand.Intn(4) + 1
|
uniqueSearches := []string{
|
||||||
var search string
|
fmt.Sprintf("from-%d@example.com", i),
|
||||||
switch searchIdx {
|
fmt.Sprintf("from:from-%d@example.com", i),
|
||||||
case 1:
|
fmt.Sprintf("to-%d@example.com", i),
|
||||||
search = fmt.Sprintf("from-%d@example.com", i)
|
fmt.Sprintf("to:to-%d@example.com", i),
|
||||||
case 2:
|
fmt.Sprintf("to2-%d@example.com", i),
|
||||||
search = fmt.Sprintf("to-%d@example.com", i)
|
fmt.Sprintf("to:to2-%d@example.com", i),
|
||||||
case 3:
|
fmt.Sprintf("cc-%d@example.com", i),
|
||||||
search = fmt.Sprintf("\"Subject line %d end\"", i)
|
fmt.Sprintf("cc:cc-%d@example.com", i),
|
||||||
default:
|
fmt.Sprintf("cc2-%d@example.com", i),
|
||||||
search = fmt.Sprintf("\"the email body %d jdsauk dwqmdqw\"", i)
|
fmt.Sprintf("cc:cc2-%d@example.com", i),
|
||||||
|
fmt.Sprintf("reply-to-%d@example.com", i),
|
||||||
|
fmt.Sprintf("reply-to:\"reply-to-%d@example.com\"", i),
|
||||||
|
fmt.Sprintf("\"Subject line %d end\"", i),
|
||||||
|
fmt.Sprintf("subject:\"Subject line %d end\"", i),
|
||||||
|
fmt.Sprintf("\"the email body %d jdsauk dwqmdqw\"", i),
|
||||||
}
|
}
|
||||||
|
searchIdx := rand.Intn(len(uniqueSearches))
|
||||||
|
|
||||||
|
search := uniqueSearches[searchIdx]
|
||||||
|
|
||||||
summaries, _, err := Search(search, 0, 100)
|
summaries, _, err := Search(search, 0, 100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -63,7 +75,7 @@ func TestSearch(t *testing.T) {
|
|||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEqual(t, len(summaries), 1, "1 search result expected")
|
assertEqual(t, len(summaries), 1, "search result expected")
|
||||||
|
|
||||||
assertEqual(t, summaries[0].From.Name, fmt.Sprintf("From %d", i), "\"From\" name does not match")
|
assertEqual(t, summaries[0].From.Name, fmt.Sprintf("From %d", i), "\"From\" name does not match")
|
||||||
assertEqual(t, summaries[0].From.Address, fmt.Sprintf("from-%d@example.com", i), "\"From\" address does not match")
|
assertEqual(t, summaries[0].From.Address, fmt.Sprintf("from-%d@example.com", i), "\"From\" address does not match")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user