From 35de77e77b5e8a0dfb9470046424baac0a24e2c2 Mon Sep 17 00:00:00 2001 From: kayrus Date: Fri, 3 Jun 2022 21:09:13 +0200 Subject: [PATCH] Read server response on DATA command --- client.go | 49 ++++++++++++++++++++++++++++--------------------- client_test.go | 12 +++++++++--- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/client.go b/client.go index af01d5f..974f174 100644 --- a/client.go +++ b/client.go @@ -438,34 +438,39 @@ func (d *dataCloser) Close() error { d.c.conn.SetDeadline(time.Now().Add(d.c.SubmissionTimeout)) defer d.c.conn.SetDeadline(time.Time{}) - expectedResponses := len(d.c.rcpts) if d.c.lmtp { - for expectedResponses > 0 { - rcpt := d.c.rcpts[len(d.c.rcpts)-expectedResponses] - if _, _, err := d.c.Text.ReadResponse(250); err != nil { - if protoErr, ok := err.(*textproto.Error); ok { - if d.statusCb != nil { - d.statusCb(rcpt, toSMTPErr(protoErr)) - } - } else { + for _, rcpt := range d.c.rcpts { + code, msg, err := d.c.Text.ReadResponse(250) + resp := &textproto.Error{ + Code: code, + Msg: msg, + } + if err != nil { + var ok bool + resp, ok = err.(*textproto.Error) + if !ok { return err } - } else if d.statusCb != nil { - d.statusCb(rcpt, nil) } - expectedResponses-- - } - return nil - } else { - _, _, err := d.c.Text.ReadResponse(250) - if err != nil { - if protoErr, ok := err.(*textproto.Error); ok { - return toSMTPErr(protoErr) + if d.statusCb != nil { + d.statusCb(rcpt, toSMTPErr(resp)) } - return err } return nil } + + code, msg, err := d.c.Text.ReadResponse(250) + resp := &textproto.Error{ + Code: code, + Msg: msg, + } + if err != nil { + if err, ok := err.(*textproto.Error); ok { + return toSMTPErr(err) + } + return err + } + return toSMTPErr(resp) } // Data issues a DATA command to the server and returns a writer that @@ -537,7 +542,9 @@ func (c *Client) SendMail(from string, to []string, r io.Reader) error { } err = w.Close() if err != nil { - return err + if e, ok := err.(*SMTPError); !ok || e.Code != 250 { + return err + } } return c.Quit() } diff --git a/client_test.go b/client_test.go index a391c06..128b3aa 100644 --- a/client_test.go +++ b/client_test.go @@ -147,7 +147,9 @@ Goodbye.` t.Fatalf("Data write failed: %s", err) } if err := w.Close(); err != nil { - t.Fatalf("Bad data response: %s", err) + if e, ok := err.(*SMTPError); !ok || e.Code != 250 { + t.Fatalf("Bad data response: %s", err) + } } if err := c.Quit(); err != nil { @@ -909,7 +911,9 @@ Goodbye.` t.Fatalf("Data write failed: %s", err) } if err := w.Close(); err != nil { - t.Fatalf("Bad data response: %s", err) + if e, ok := err.(*SMTPError); !ok || e.Code != 250 { + t.Fatalf("Bad data response: %s", err) + } } if !reflect.DeepEqual(rcpts, []string{"golang-nuts@googlegroups.com", "golang-not-nuts@googlegroups.com"}) { @@ -920,7 +924,9 @@ Goodbye.` t.Fatalf("Wrong amount of status callback calls: %v", len(errors)) } if errors[0] != nil { - t.Fatalf("Unexpected error status for the first recipient: %v", errors[0]) + if errors[0].Code != 250 { + t.Fatalf("Unexpected error status for the first recipient: %v", errors[0]) + } } if errors[1] == nil { t.Fatalf("Unexpected success status for the second recipient")