mirror of
https://github.com/wneessen/go-mail.git
synced 2024-11-14 18:02:55 +01:00
Follow upstream for HELO during Quit bug
I reported the bug I fixed in 74fa3f6f62
to Go upstream. They fixed simpler by just ignoring the error (See: https://go.dev/cl/622476). We follow this patch accordingly. The upstream test has been adopted as well.
This commit is contained in:
parent
9834c6508d
commit
8353b4b255
2 changed files with 32 additions and 14 deletions
17
smtp/smtp.go
17
smtp/smtp.go
|
@ -554,20 +554,9 @@ func (c *Client) Noop() error {
|
||||||
|
|
||||||
// Quit sends the QUIT command and closes the connection to the server.
|
// Quit sends the QUIT command and closes the connection to the server.
|
||||||
func (c *Client) Quit() error {
|
func (c *Client) Quit() error {
|
||||||
// If we already tried to send a EHLO/HELO but it failed, we still need to be able to send
|
// See https://github.com/golang/go/issues/70011
|
||||||
// a QUIT to close the connection.
|
_ = c.hello() // ignore error; we're quitting anyhow
|
||||||
// c.hello() will return the global helloErr of the Client, which will always be set if the HELO
|
|
||||||
// failed before. Therefore if we already sent a HELO and the error is not nil, we skip another
|
|
||||||
// EHLO/HELO try
|
|
||||||
c.mutex.RLock()
|
|
||||||
didHello := c.didHello
|
|
||||||
helloErr := c.helloError
|
|
||||||
c.mutex.RUnlock()
|
|
||||||
if !didHello || helloErr == nil {
|
|
||||||
if err := c.hello(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, _, err := c.cmd(221, "QUIT")
|
_, _, err := c.cmd(221, "QUIT")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -900,6 +900,35 @@ Goodbye.
|
||||||
QUIT
|
QUIT
|
||||||
`
|
`
|
||||||
|
|
||||||
|
func TestHELOFailed(t *testing.T) {
|
||||||
|
serverLines := `502 EH?
|
||||||
|
502 EH?
|
||||||
|
221 OK
|
||||||
|
`
|
||||||
|
clientLines := `EHLO localhost
|
||||||
|
HELO localhost
|
||||||
|
QUIT
|
||||||
|
`
|
||||||
|
server := strings.Join(strings.Split(serverLines, "\n"), "\r\n")
|
||||||
|
client := strings.Join(strings.Split(clientLines, "\n"), "\r\n")
|
||||||
|
var cmdbuf strings.Builder
|
||||||
|
bcmdbuf := bufio.NewWriter(&cmdbuf)
|
||||||
|
var fake faker
|
||||||
|
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
|
||||||
|
c := &Client{Text: textproto.NewConn(fake), localName: "localhost"}
|
||||||
|
if err := c.Hello("localhost"); err == nil {
|
||||||
|
t.Fatal("expected EHLO to fail")
|
||||||
|
}
|
||||||
|
if err := c.Quit(); err != nil {
|
||||||
|
t.Errorf("QUIT failed: %s", err)
|
||||||
|
}
|
||||||
|
_ = bcmdbuf.Flush()
|
||||||
|
actual := cmdbuf.String()
|
||||||
|
if client != actual {
|
||||||
|
t.Errorf("Got:\n%s\nWant:\n%s", actual, client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestExtensions(t *testing.T) {
|
func TestExtensions(t *testing.T) {
|
||||||
fake := func(server string) (c *Client, bcmdbuf *bufio.Writer, cmdbuf *strings.Builder) {
|
fake := func(server string) (c *Client, bcmdbuf *bufio.Writer, cmdbuf *strings.Builder) {
|
||||||
server = strings.Join(strings.Split(server, "\n"), "\r\n")
|
server = strings.Join(strings.Split(server, "\n"), "\r\n")
|
||||||
|
|
Loading…
Reference in a new issue