79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
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)
|
|
}
|