From 8b2ec4b02a98bfa32f80c7bac8df89120cb424d4 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 9 Mar 2026 00:14:51 -0400 Subject: [PATCH] Refactor mta.RelayFailure into CreateFailureEnvelope --- smtp/relay.go | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/smtp/relay.go b/smtp/relay.go index b99230c..7ab3ab1 100644 --- a/smtp/relay.go +++ b/smtp/relay.go @@ -39,14 +39,29 @@ type mta struct { // information about the attempted delivery. func (m *mta) RelayFailure(env Envelope, log *zap.Logger, to, errorStr string, sendErr error) { log.Error(errorStr, zap.Error(sendErr)) + env, err := CreateFailureEnvelope(env, to, errorStr, sendErr) + if err != nil { + log.Error("Failed to prepare failure envelope", zap.Error(err)) + return + } + m.server.DeliverMessage(env) +} +// CreateFailureEnvelope takes the message `env` and produces a delivery failure +// notification message that wraps it. `errorStr` is reported to the sender in the +// message. The `to` string identifies the specific recipient, if the envelope is +// addressed to more than one. +func CreateFailureEnvelope(env Envelope, to, errorStr string, sendErr error) (Envelope, error) { buf := &bytes.Buffer{} mw := multipart.NewWriter(buf) now := time.Now() failure := Envelope{ - MailFrom: mail.Address{"mailpopbox", "mailbox@" + DomainForAddress(env.MailFrom)}, + MailFrom: mail.Address{ + Name: "mailpopbox", + Address: "mailbox@" + DomainForAddress(env.MailFrom), + }, RcptTo: []mail.Address{env.MailFrom}, ID: generateEnvelopeId("f", now), Received: now, @@ -64,8 +79,7 @@ func (m *mta) RelayFailure(env Envelope, log *zap.Logger, to, errorStr string, s "Content-Type": []string{"text/plain; charset=UTF-8"}, }) if err != nil { - log.Error("failed to create multipart 0", zap.Error(err)) - return + return Envelope{}, fmt.Errorf("failed to create multipart 0: %w", err) } fmt.Fprintf(tw, "* * * Delivery Failure * * *\n\n") fmt.Fprintf(tw, "The server failed to relay the message:\n\n%s:\n%s\n", errorStr, sendErr.Error()) @@ -74,8 +88,7 @@ func (m *mta) RelayFailure(env Envelope, log *zap.Logger, to, errorStr string, s "Content-Type": []string{"message/delivery-status"}, }) if err != nil { - log.Error("failed to create multipart 1", zap.Error(err)) - return + return Envelope{}, fmt.Errorf("failed to create multipart 1: %w", err) } fmt.Fprintf(sw, "Original-Envelope-ID: %s\n", env.ID) fmt.Fprintf(sw, "Reporting-UA: %s\n", env.EHLO) @@ -88,8 +101,7 @@ func (m *mta) RelayFailure(env Envelope, log *zap.Logger, to, errorStr string, s "Content-Type": []string{"message/rfc822"}, }) if err != nil { - log.Error("failed to create multipart 2", zap.Error(err)) - return + return Envelope{}, fmt.Errorf("failed to create multipart 2: %w", err) } ocw.Write(env.Data) @@ -97,5 +109,5 @@ func (m *mta) RelayFailure(env Envelope, log *zap.Logger, to, errorStr string, s mw.Close() failure.Data = buf.Bytes() - m.server.DeliverMessage(failure) + return failure, nil } -- 2.52.0