diff --git a/pkg/message/manager.go b/pkg/message/manager.go index 0224035..1ef8089 100644 --- a/pkg/message/manager.go +++ b/pkg/message/manager.go @@ -112,7 +112,7 @@ func (s *StoreManager) Deliver( for _, mb := range inbound.Mailboxes { // Append recipient and timestamp to generated Received header. 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. logger.Debug().Str("mailbox", mb).Msg("Delivering message") delivery := &Delivery{ @@ -124,7 +124,7 @@ func (s *StoreManager) Deliver( Subject: inbound.Subject, 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) if err != nil { diff --git a/pkg/message/manager_test.go b/pkg/message/manager_test.go index cf96b59..99d28b2 100644 --- a/pkg/message/manager_test.go +++ b/pkg/message/manager_test.go @@ -501,6 +501,38 @@ func TestMailboxForAddress(t *testing.T) { 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. func testStoreManager() (*message.StoreManager, *extension.Host) { extHost := extension.NewHost() diff --git a/pkg/test/testdata/basic.golden b/pkg/test/testdata/basic.golden index 31035dc..e01ad2e 100644 --- a/pkg/test/testdata/basic.golden +++ b/pkg/test/testdata/basic.golden @@ -2,7 +2,7 @@ Mailbox: recipient From: To: [] Subject: basic subject -Size: 204 +Size: 242 BODY TEXT: Basic message. diff --git a/pkg/test/testdata/encodedheader.golden b/pkg/test/testdata/encodedheader.golden index cd2d5d8..1d756e1 100644 --- a/pkg/test/testdata/encodedheader.golden +++ b/pkg/test/testdata/encodedheader.golden @@ -2,7 +2,7 @@ Mailbox: recipient From: X-äéß Y-äéß To: [Test of ȇɲʢȯȡɪɴʛ ] Subject: Test of ȇɲʢȯȡɪɴʛ -Size: 338 +Size: 376 BODY TEXT: Basic message. diff --git a/pkg/test/testdata/fullname.golden b/pkg/test/testdata/fullname.golden index 31bb3d2..82bd0dc 100644 --- a/pkg/test/testdata/fullname.golden +++ b/pkg/test/testdata/fullname.golden @@ -2,7 +2,7 @@ Mailbox: recipient From: From User To: [Rec I. Pient ] Subject: basic subject -Size: 233 +Size: 271 BODY TEXT: Basic message. diff --git a/pkg/test/testdata/no-to-ipv4.golden b/pkg/test/testdata/no-to-ipv4.golden index af7a9e5..ff08189 100644 --- a/pkg/test/testdata/no-to-ipv4.golden +++ b/pkg/test/testdata/no-to-ipv4.golden @@ -2,7 +2,7 @@ Mailbox: ip4recipient From: To: [] Subject: basic subject -Size: 180 +Size: 218 BODY TEXT: No-To message. diff --git a/pkg/test/testdata/no-to-ipv6.golden b/pkg/test/testdata/no-to-ipv6.golden index 38195c5..9cece1c 100644 --- a/pkg/test/testdata/no-to-ipv6.golden +++ b/pkg/test/testdata/no-to-ipv6.golden @@ -2,7 +2,7 @@ Mailbox: ip6recipient From: To: [] Subject: basic subject -Size: 180 +Size: 218 BODY TEXT: No-To message.