1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-18 18:17:03 +00:00

extension: BeforeMessageStored event to rewrite envelope (#417)

* extension: add InboundMessage type
* manager: fires BeforeMessageStored event
* manager: Reacts to BeforeMessageStored event response
* manager: Apply BeforeMessageStored response fields to message

Signed-off-by: James Hillyerd <james@hillyerd.com>
This commit is contained in:
James Hillyerd
2023-11-06 14:53:38 -08:00
committed by GitHub
parent 0cb62af074
commit 01fb161df8
11 changed files with 244 additions and 34 deletions

View File

@@ -69,39 +69,73 @@ func (s *StoreManager) Deliver(
toaddr[i] = &torecip.Address
}
}
subject := header.Get("Subject")
now := time.Now()
tstamp := now.UTC().Format(recvdTimeFmt)
// Deliver to mailboxes.
for _, recip := range recipients {
if recip.ShouldStore() {
// Append recipient and timestamp to generated Recieved header.
recvd := fmt.Sprintf("%s for <%s>; %s\r\n", recvdHeader, recip.Address.Address, tstamp)
// Process inbound message through extensions.
mailboxes := make([]string, len(recipients))
toAddrs := make([]mail.Address, len(recipients))
for i, recip := range recipients {
mailboxes[i] = recip.Mailbox
toAddrs[i] = recip.Address
}
// Deliver message.
logger.Debug().Str("mailbox", recip.Mailbox).Msg("Delivering message")
delivery := &Delivery{
Meta: event.MessageMetadata{
Mailbox: recip.Mailbox,
From: fromaddr[0],
To: toaddr,
Date: now,
Subject: header.Get("Subject"),
},
Reader: io.MultiReader(strings.NewReader(recvd), bytes.NewReader(source)),
}
id, err := s.Store.AddMessage(delivery)
if err != nil {
logger.Error().Str("mailbox", recip.Mailbox).Err(err).Msg("Delivery failed")
return err
}
inbound := &event.InboundMessage{
Mailboxes: mailboxes,
From: *fromaddr[0],
To: toAddrs,
Subject: subject,
Size: int64(len(source)),
}
// Emit message stored event.
event := delivery.Meta
event.ID = id
s.ExtHost.Events.AfterMessageStored.Emit(&event)
extResult := s.ExtHost.Events.BeforeMessageStored.Emit(inbound)
if extResult == nil {
// Use address policy to determine deliverable mailboxes.
mailboxes = mailboxes[:0]
for _, recip := range recipients {
if recip.ShouldStore() {
mailboxes = append(mailboxes, recip.Mailbox)
}
}
inbound.Mailboxes = mailboxes
} else {
// Event response overrides destination mailboxes and address policy.
inbound = extResult
toaddr = make([]*mail.Address, len(inbound.To))
for i := range inbound.To {
toaddr[i] = &inbound.To[i]
}
}
// Deliver to mailboxes.
for _, mb := range inbound.Mailboxes {
// Append recipient and timestamp to generated Recieved header.
recvd := fmt.Sprintf("%s for <%s>; %s\r\n", recvdHeader, mb, tstamp)
// Deliver message.
logger.Debug().Str("mailbox", mb).Msg("Delivering message")
delivery := &Delivery{
Meta: event.MessageMetadata{
Mailbox: mb,
From: &inbound.From,
To: toaddr,
Date: now,
Subject: inbound.Subject,
},
Reader: io.MultiReader(strings.NewReader(recvd), bytes.NewReader(source)),
}
id, err := s.Store.AddMessage(delivery)
if err != nil {
logger.Error().Str("mailbox", mb).Err(err).Msg("Delivery failed")
return err
}
// Emit message stored event.
event := delivery.Meta
event.ID = id
s.ExtHost.Events.AfterMessageStored.Emit(&event)
}
return nil