package smtp import ( "io" ) var ( ErrAuthFailed = &SMTPError{ Code: 535, EnhancedCode: EnhancedCode{5, 7, 8}, Message: "Authentication failed", } ErrAuthRequired = &SMTPError{ Code: 502, EnhancedCode: EnhancedCode{5, 7, 0}, Message: "Please authenticate first", } ErrAuthUnsupported = &SMTPError{ Code: 502, EnhancedCode: EnhancedCode{5, 7, 0}, Message: "Authentication not supported", } ) // A SMTP server backend. type Backend interface { NewSession(c *Conn) (Session, error) } // Session is used by servers to respond to an SMTP client. // // The methods are called when the remote client issues the matching command. type Session interface { // Discard currently processed message. Reset() // Free all resources associated with session. Logout() error // Authenticate the user using SASL PLAIN. AuthPlain(username, password string) error // Set return path for currently processed message. Mail(from string, opts *MailOptions) error // Add recipient for currently processed message. Rcpt(to string, opts *RcptOptions) error // Set currently processed message contents and send it. // // r must be consumed before Data returns. Data(r io.Reader) error } // LMTPSession is an add-on interface for Session. It can be implemented by // LMTP servers to provide extra functionality. type LMTPSession interface { Session // LMTPData is the LMTP-specific version of Data method. // It can be optionally implemented by the backend to provide // per-recipient status information when it is used over LMTP // protocol. // // LMTPData implementation sets status information using passed // StatusCollector by calling SetStatus once per each AddRcpt // call, even if AddRcpt was called multiple times with // the same argument. SetStatus must not be called after // LMTPData returns. // // Return value of LMTPData itself is used as a status for // recipients that got no status set before using StatusCollector. LMTPData(r io.Reader, status StatusCollector) error } // StatusCollector allows a backend to provide per-recipient status // information. type StatusCollector interface { SetStatus(rcptTo string, err error) }