103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package smtp
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/emersion/go-sasl"
|
|
)
|
|
|
|
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",
|
|
}
|
|
ErrAuthUnknownMechanism = &SMTPError{
|
|
Code: 504,
|
|
EnhancedCode: EnhancedCode{5, 7, 4},
|
|
Message: "Unsupported authentication mechanism",
|
|
}
|
|
)
|
|
|
|
// A SMTP server backend.
|
|
type Backend interface {
|
|
NewSession(c *Conn) (Session, error)
|
|
}
|
|
|
|
// BackendFunc is an adapter to allow the use of an ordinary function as a
|
|
// Backend.
|
|
type BackendFunc func(c *Conn) (Session, error)
|
|
|
|
var _ Backend = (BackendFunc)(nil)
|
|
|
|
// NewSession calls f(c).
|
|
func (f BackendFunc) NewSession(c *Conn) (Session, error) {
|
|
return f(c)
|
|
}
|
|
|
|
// 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
|
|
|
|
// 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)
|
|
}
|
|
|
|
// AuthSession is an add-on interface for Session. It provides support for the
|
|
// AUTH extension.
|
|
type AuthSession interface {
|
|
Session
|
|
|
|
AuthMechanisms() []string
|
|
Auth(mech string) (sasl.Server, error)
|
|
}
|