mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +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:
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
2
pkg/test/testdata/basic.golden
vendored
2
pkg/test/testdata/basic.golden
vendored
@@ -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.
|
||||||
|
|||||||
2
pkg/test/testdata/encodedheader.golden
vendored
2
pkg/test/testdata/encodedheader.golden
vendored
@@ -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.
|
||||||
|
|||||||
2
pkg/test/testdata/fullname.golden
vendored
2
pkg/test/testdata/fullname.golden
vendored
@@ -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.
|
||||||
|
|||||||
2
pkg/test/testdata/no-to-ipv4.golden
vendored
2
pkg/test/testdata/no-to-ipv4.golden
vendored
@@ -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.
|
||||||
|
|||||||
2
pkg/test/testdata/no-to-ipv6.golden
vendored
2
pkg/test/testdata/no-to-ipv6.golden
vendored
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user