fix(smtp): SMTP reset error should be ignored for non-standard SMTP server implementation (#2791)

pull/2481/merge
Aaron Liu 2025-08-19 09:43:23 +08:00
parent 872b08e5da
commit a1ce16bd5e
3 changed files with 20 additions and 1 deletions

2
assets

@ -1 +1 @@
Subproject commit f7aa0a09e22792eeeae574b585a499f0f459cede Subproject commit 2c5b89c59cd69a7690938f4a980468006b49b547

View File

@ -2,6 +2,7 @@ package email
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings" "strings"
"time" "time"
@ -159,6 +160,16 @@ func (client *SMTPPool) Init() {
l := client.l.CopyWithPrefix(fmt.Sprintf("[Cid: %s]", m.cid)) l := client.l.CopyWithPrefix(fmt.Sprintf("[Cid: %s]", m.cid))
if err := d.Send(m.msg); err != nil { if err := d.Send(m.msg); err != nil {
// Check if this is an SMTP RESET error after successful delivery
var sendErr *mail.SendError
var errParsed = errors.As(err, &sendErr)
if errParsed && sendErr.Reason == mail.ErrSMTPReset {
open = false
l.Debug("SMTP RESET error, closing connection...")
// https://github.com/wneessen/go-mail/issues/463
continue // Don't treat this as a delivery failure since mail was sent
}
l.Warning("Failed to send email: %s, Cid=%s", err, m.cid) l.Warning("Failed to send email: %s, Cid=%s", err, m.cid)
} else { } else {
l.Info("Email sent to %q, title: %q.", m.to, m.subject) l.Info("Email sent to %q, title: %q.", m.to, m.subject)

View File

@ -2,6 +2,7 @@ package admin
import ( import (
"encoding/hex" "encoding/hex"
"errors"
"net/http" "net/http"
"strconv" "strconv"
@ -165,6 +166,13 @@ func (s *TestSMTPService) Test(c *gin.Context) error {
err = d.DialAndSendWithContext(c, m) err = d.DialAndSendWithContext(c, m)
if err != nil { if err != nil {
// Check if this is an SMTP RESET error after successful delivery
var sendErr *mail.SendError
var errParsed = errors.As(err, &sendErr)
if errParsed && sendErr.Reason == mail.ErrSMTPReset {
return nil // Don't treat this as a delivery failure since mail was sent
}
return serializer.NewError(serializer.CodeInternalSetting, "Failed to send test email: "+err.Error(), err) return serializer.NewError(serializer.CodeInternalSetting, "Failed to send test email: "+err.Error(), err)
} }