mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
Accept and handle emails sent with an empty 821.From / return-path as… (#561)
* Accept and handle emails sent with an empty 821.From / return-path as it would any other email.
This commit is contained in:
@@ -75,6 +75,11 @@ func (a *Addressing) NewRecipient(address string) (*Recipient, error) {
|
|||||||
// ParseOrigin parses an address into a Origin. This is used for parsing MAIL FROM argument,
|
// ParseOrigin parses an address into a Origin. This is used for parsing MAIL FROM argument,
|
||||||
// not To headers.
|
// not To headers.
|
||||||
func (a *Addressing) ParseOrigin(address string) (*Origin, error) {
|
func (a *Addressing) ParseOrigin(address string) (*Origin, error) {
|
||||||
|
if address == "" {
|
||||||
|
return &Origin{
|
||||||
|
addrPolicy: a,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
local, domain, err := ParseEmailAddress(address)
|
local, domain, err := ParseEmailAddress(address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -411,18 +411,6 @@ func (s *Session) parseMailFromCmd(arg string) {
|
|||||||
from := m[1]
|
from := m[1]
|
||||||
s.logger.Debug().Msgf("Mail sender is %v", from)
|
s.logger.Debug().Msgf("Mail sender is %v", from)
|
||||||
|
|
||||||
// Parse from address.
|
|
||||||
_, domain, err := policy.ParseEmailAddress(from)
|
|
||||||
s.logger.Debug().Msgf("Origin domain is %v", domain)
|
|
||||||
if from != "" && err != nil {
|
|
||||||
s.send("501 Bad sender address syntax")
|
|
||||||
s.logger.Warn().Msgf("Bad address as MAIL arg: %q, %s", from, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if from == "" {
|
|
||||||
from = "unspecified"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse ESMTP parameters.
|
// Parse ESMTP parameters.
|
||||||
if m[2] != "" {
|
if m[2] != "" {
|
||||||
// Here the client may put BODY=8BITMIME, but Inbucket already
|
// Here the client may put BODY=8BITMIME, but Inbucket already
|
||||||
@@ -480,7 +468,7 @@ func (s *Session) parseMailFromCmd(arg string) {
|
|||||||
// Ignore ShouldAccept if extensions explicitly allowed this From.
|
// Ignore ShouldAccept if extensions explicitly allowed this From.
|
||||||
if extAction == event.ActionDefer && !s.from.ShouldAccept() {
|
if extAction == event.ActionDefer && !s.from.ShouldAccept() {
|
||||||
s.send("501 Unauthorized domain")
|
s.send("501 Unauthorized domain")
|
||||||
s.logger.Warn().Msgf("Bad domain sender %s", domain)
|
s.logger.Warn().Msgf("Bad domain sender %s", origin.Domain)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,11 @@ func TestGreetState(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Messages sent with a null reverse-path are unusual,
|
||||||
|
// but valid. They are used for delivery status
|
||||||
|
// notifications, and also for some sorts of auto-responder
|
||||||
|
// as part of bounce storm mitigation.
|
||||||
|
// Sections 3.6.3 and 4.5.5 of RFC 5321 discuss them.
|
||||||
func TestEmptyEnvelope(t *testing.T) {
|
func TestEmptyEnvelope(t *testing.T) {
|
||||||
ds := test.NewStore()
|
ds := test.NewStore()
|
||||||
server := setupSMTPServer(ds, extension.NewHost())
|
server := setupSMTPServer(ds, extension.NewHost())
|
||||||
@@ -85,14 +90,14 @@ func TestEmptyEnvelope(t *testing.T) {
|
|||||||
// Test out some empty envelope without blanks
|
// Test out some empty envelope without blanks
|
||||||
script := []scriptStep{
|
script := []scriptStep{
|
||||||
{"HELO localhost", 250},
|
{"HELO localhost", 250},
|
||||||
{"MAIL FROM:<>", 501},
|
{"MAIL FROM:<>", 250},
|
||||||
}
|
}
|
||||||
playSession(t, server, script)
|
playSession(t, server, script)
|
||||||
|
|
||||||
// Test out some empty envelope with blanks
|
// Test out some empty envelope with blanks
|
||||||
script = []scriptStep{
|
script = []scriptStep{
|
||||||
{"HELO localhost", 250},
|
{"HELO localhost", 250},
|
||||||
{"MAIL FROM: <>", 501},
|
{"MAIL FROM: <>", 250},
|
||||||
}
|
}
|
||||||
playSession(t, server, script)
|
playSession(t, server, script)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user