emersion / go-smtp

📤 An SMTP client & server library written in Go
MIT License
1.72k stars 216 forks source link

client: introduce DataCommand #263

Open emersion opened 5 months ago

emersion commented 5 months ago

Closes: https://github.com/emersion/go-smtp/issues/189

davrux commented 2 months ago

Why not use a CloseWithResponse function?

func (d *dataCloser) CloseWithResponse() (code int, msg string, err error) {
    if d.closed {
        return 0, "", fmt.Errorf("smtp: data writer closed twice")
    }

    if err := d.WriteCloser.Close(); err != nil {
        return 0, "", err
    }

    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.readResponse(250); err != nil {
                if smtpErr, ok := err.(*SMTPError); ok {
                    if d.statusCb != nil {
                        d.statusCb(rcpt, smtpErr)
                    }
                } else {
                    return 0, "", err
                }
            } else if d.statusCb != nil {
                d.statusCb(rcpt, nil)
            }
            expectedResponses--
        }
    } else {
        code, msg, err = d.c.readResponse(250)
    }

    d.closed = true
    return code, msg, err
}

func (d *dataCloser) Close() error {
    _, _, err := d.CloseWithResponse()
    return err
}