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

Add the 821.From / return-path of an email to the stored message (#560)

as a Return-Path: header. This is visible in the source view and as a
header via the REST API.

Signed-off-by: Steve Atkins <steve@wordtothewise.com>
This commit is contained in:
Steve Atkins
2025-03-18 15:28:31 +00:00
committed by GitHub
parent 9904399d24
commit 440fddfe46
7 changed files with 39 additions and 7 deletions

View File

@@ -112,7 +112,7 @@ func (s *StoreManager) Deliver(
for _, mb := range inbound.Mailboxes { for _, mb := range inbound.Mailboxes {
// Append recipient and timestamp to generated Received header. // Append recipient and timestamp to generated Received header.
recvd := fmt.Sprintf("%s for <%s>; %s\r\n", recvdHeader, mb, tstamp) recvd := fmt.Sprintf("%s for <%s>; %s\r\n", recvdHeader, mb, tstamp)
returnPath := fmt.Sprintf("Return-Path: <%s>\r\n", from.Address.Address)
// Deliver message. // Deliver message.
logger.Debug().Str("mailbox", mb).Msg("Delivering message") logger.Debug().Str("mailbox", mb).Msg("Delivering message")
delivery := &Delivery{ delivery := &Delivery{
@@ -124,7 +124,7 @@ func (s *StoreManager) Deliver(
Subject: inbound.Subject, Subject: inbound.Subject,
Size: inbound.Size, Size: inbound.Size,
}, },
Reader: io.MultiReader(strings.NewReader(recvd), bytes.NewReader(source)), Reader: io.MultiReader(strings.NewReader(returnPath), strings.NewReader(recvd), bytes.NewReader(source)),
} }
id, err := s.Store.AddMessage(delivery) id, err := s.Store.AddMessage(delivery)
if err != nil { if err != nil {

View File

@@ -501,6 +501,38 @@ func TestMailboxForAddress(t *testing.T) {
assert.Equal(t, addr, got, "FullNaming mode should return a full address for mailbox") assert.Equal(t, addr, got, "FullNaming mode should return a full address for mailbox")
} }
func TestReturnPath(t *testing.T) {
sm, _ := testStoreManager()
recvdHeader := "Received: xyz\n"
msgSource := `From: from@example.com
To: u1@example.com
Subject: return path
test email`
// Deliver message.
origin, _ := sm.AddrPolicy.ParseOrigin("821from@example.com")
recipient, _ := sm.AddrPolicy.NewRecipient("u1@example.com")
err := sm.Deliver(origin, []*policy.Recipient{recipient}, recvdHeader, []byte(msgSource))
require.NoError(t, err)
// Find message ID.
msgs, err := sm.GetMetadata("u1@example.com")
require.NoError(t, err, "Failed to read mailbox")
require.Len(t, msgs, 1, "Unexpected mailbox len")
id := msgs[0].ID
// Read back and verify source.
r, err := sm.SourceReader("u1@example.com", id)
require.NoError(t, err, "SourceReader must succeed")
gotBytes, err := io.ReadAll(r)
require.NoError(t, err, "Failed to read source")
got := string(gotBytes)
assert.Contains(t, got, "Return-Path: <821from@example.com>\r\n", "Source should contain return-path")
}
// Returns an empty StoreManager and extension Host pair, configured for testing. // Returns an empty StoreManager and extension Host pair, configured for testing.
func testStoreManager() (*message.StoreManager, *extension.Host) { func testStoreManager() (*message.StoreManager, *extension.Host) {
extHost := extension.NewHost() extHost := extension.NewHost()

View File

@@ -2,7 +2,7 @@ Mailbox: recipient
From: <fromuser@inbucket.org> From: <fromuser@inbucket.org>
To: [<recipient@inbucket.org>] To: [<recipient@inbucket.org>]
Subject: basic subject Subject: basic subject
Size: 204 Size: 242
BODY TEXT: BODY TEXT:
Basic message. Basic message.

View File

@@ -2,7 +2,7 @@ Mailbox: recipient
From: X-äéß Y-äéß <fromuser@inbucket.org> From: X-äéß Y-äéß <fromuser@inbucket.org>
To: [Test of ȇɲʢȯȡɪɴʛ <recipient@inbucket.org>] To: [Test of ȇɲʢȯȡɪɴʛ <recipient@inbucket.org>]
Subject: Test of ȇɲʢȯȡɪɴʛ Subject: Test of ȇɲʢȯȡɪɴʛ
Size: 338 Size: 376
BODY TEXT: BODY TEXT:
Basic message. Basic message.

View File

@@ -2,7 +2,7 @@ Mailbox: recipient
From: From User <fromuser@inbucket.org> From: From User <fromuser@inbucket.org>
To: [Rec I. Pient <recipient@inbucket.org>] To: [Rec I. Pient <recipient@inbucket.org>]
Subject: basic subject Subject: basic subject
Size: 233 Size: 271
BODY TEXT: BODY TEXT:
Basic message. Basic message.

View File

@@ -2,7 +2,7 @@ Mailbox: ip4recipient
From: <fromuser@inbucket.org> From: <fromuser@inbucket.org>
To: [<ip4recipient@[192.168.123.123]>] To: [<ip4recipient@[192.168.123.123]>]
Subject: basic subject Subject: basic subject
Size: 180 Size: 218
BODY TEXT: BODY TEXT:
No-To message. No-To message.

View File

@@ -2,7 +2,7 @@ Mailbox: ip6recipient
From: <fromuser@inbucket.org> From: <fromuser@inbucket.org>
To: [<ip6recipient@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]>] To: [<ip6recipient@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]>]
Subject: basic subject Subject: basic subject
Size: 180 Size: 218
BODY TEXT: BODY TEXT:
No-To message. No-To message.