From 75bb1bfa2f0ea51ef8c6461b745f607a07276955 Mon Sep 17 00:00:00 2001 From: Mechiel Lukkien Date: Thu, 17 Apr 2025 21:00:38 +0200 Subject: [PATCH] queue: before removing files from the queue, close them, so removing doesn't fail on windows Mostly relevant for localserve, since full operation doesn't work on windows. --- queue/localserve.go | 13 +++++++++++-- queue/submit.go | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/queue/localserve.go b/queue/localserve.go index 770f1ed..d8aaf52 100644 --- a/queue/localserve.go +++ b/queue/localserve.go @@ -82,8 +82,10 @@ func deliverLocalserve(ctx context.Context, log mlog.Log, msgs []*Msg, backoff t } msgr = store.FileMsgReader(m0.MsgPrefix, f) defer func() { - err := msgr.Close() - log.Check(err, "closing message after delivery attempt") + if msgr != nil { + err := msgr.Close() + log.Check(err, "closing message after delivery attempt") + } }() } @@ -99,5 +101,12 @@ func deliverLocalserve(ctx context.Context, log mlog.Log, msgs []*Msg, backoff t if err != nil { log.Infox("smtp transaction for delivery failed", err) } + + // Must close before processing, because that may try to remove the message file, + // and on Windows we can't have it open when we remove it. + cerr := msgr.Close() + log.Check(cerr, "closing message after delivery attempt") + msgr = nil + processDeliveries(log, m0, msgs, addr, "localhost", backoff, rcptErrs, err) } diff --git a/queue/submit.go b/queue/submit.go index f258968..c800561 100644 --- a/queue/submit.go +++ b/queue/submit.go @@ -215,8 +215,10 @@ func deliverSubmit(qlog mlog.Log, resolver dns.Resolver, dialer smtpclient.Diale } msgr = store.FileMsgReader(m0.MsgPrefix, f) defer func() { - err := msgr.Close() - qlog.Check(err, "closing message after delivery attempt") + if msgr != nil { + err := msgr.Close() + qlog.Check(err, "closing message after delivery attempt") + } }() } @@ -230,6 +232,13 @@ func deliverSubmit(qlog mlog.Log, resolver dns.Resolver, dialer smtpclient.Diale if submiterr != nil { qlog.Infox("smtp transaction for delivery failed", submiterr) } + + // Must close before processing, because that may try to remove the message file, + // and on Windows we can't have it open when we remove it. + cerr := msgr.Close() + qlog.Check(cerr, "closing message after delivery attempt") + msgr = nil + failed, delivered = processDeliveries(qlog, m0, msgs, addr, transport.Host, backoff, rcptErrs, submiterr) }