diff --git a/protocol.go b/protocol.go index 4a17c8e..f77512c 100644 --- a/protocol.go +++ b/protocol.go @@ -93,6 +93,11 @@ func (session *session) handleHELO(cmd command) { return } + if session.peer.HeloName != "" { + // Reset envelope in case of duplicate HELO + session.envelope = nil + } + session.peer.HeloName = cmd.fields[1] if session.server.HeloChecker != nil { @@ -116,6 +121,11 @@ func (session *session) handleEHLO(cmd command) { return } + if session.peer.HeloName != "" { + // Reset envelope in case of duplicate EHLO + session.envelope = nil + } + session.peer.HeloName = cmd.fields[1] if session.server.HeloChecker != nil { @@ -152,6 +162,11 @@ func (session *session) handleMAIL(cmd command) { return } + if session.envelope != nil { + session.reply(502, "Duplicate MAIL") + return + } + addr, err := parseAddress(cmd.params[1]) if err != nil { @@ -228,8 +243,8 @@ func (session *session) handleSTARTTLS(cmd command) { return } - // Reset HeloName as a new EHLO/HELO is required after STARTTLS - session.peer.HeloName = "" + // Reset envelope as a new EHLO/HELO is required after STARTTLS + session.envelope = nil // Reset deadlines on the underlying connection before I replace it // with a TLS connection @@ -270,12 +285,15 @@ func (session *session) handleDATA(cmd command) { // Accept and deliver message session.envelope.Data = data.Bytes() + if err := session.deliver(); err != nil { session.error(err) } else { session.reply(250, "Thank you.") } + session.envelope = nil + } if err != nil { @@ -296,6 +314,8 @@ func (session *session) handleDATA(cmd command) { session.server.MaxMessageSize, )) + session.envelope = nil + return }