git » chasquid » commit a47faf8

smtpsrv: Failures to enqueue are transient, not permanent

author Alberto Bertogli
2019-10-23 21:33:42 UTC
committer Alberto Bertogli
2019-10-24 20:37:09 UTC
parent 07187493147765b313ab2b249b693ef8eee0658b

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 +2 -1

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)