From a47faf89a48eacc1c1942b99f120606cc02113ba Mon Sep 17 00:00:00 2001 From: Alberto Bertogli Date: Wed, 23 Oct 2019 22:33:42 +0100 Subject: [PATCH] smtpsrv: Failures to enqueue are transient, not permanent If we fail to put the message in the queue (e.g. because we're out of storage space, or the aliases-resolve hook errored out), it should be considered a transient failure. Currently we return a permanent error, which is misleading, as we want clients to retry in these situations. So this patch changes the error returned accordingly. --- internal/smtpsrv/conn.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/smtpsrv/conn.go b/internal/smtpsrv/conn.go index 405840c..4731bae 100644 --- a/internal/smtpsrv/conn.go +++ b/internal/smtpsrv/conn.go @@ -604,9 +604,10 @@ func (c *Conn) DATA(params string) (code int, msg string) { // There are no partial failures here: we put it in the queue, and then if // individual deliveries fail, we report via email. + // If we fail to queue, return a transient error. msgID, err := c.queue.Put(c.mailFrom, c.rcptTo, c.data) if err != nil { - return 554, fmt.Sprintf("5.3.0 Failed to queue message: %v", err) + return 451, fmt.Sprintf("4.3.0 Failed to queue message: %v", err) } c.tr.Printf("Queued from %s to %s - %s", c.mailFrom, c.rcptTo, msgID)