From 5381b0b934c0187d238c0065adf8cf2e76abb355 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 22 Mar 2019 23:01:32 +0200 Subject: [PATCH] Update README server example, add server example in tests --- README.md | 28 +++++++++++++------- example_test.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 3c4a62b..14f7f7d 100755 --- a/README.md +++ b/README.md @@ -68,25 +68,32 @@ import ( type Backend struct{} // Login handles a login command with username and password. -func (bkd *Backend) Login(state *smtp.ConnectionState, username, password string) (smtp.User, error) { +func (bkd *Backend) Login(state *smtp.ConnectionState, username, password string) (smtp.Session, error) { if username != "username" || password != "password" { return nil, errors.New("Invalid username or password") } - return &User{}, nil + return &Session{}, nil } // AnonymousLogin requires clients to authenticate using SMTP AUTH before sending emails -func (bkd *Backend) AnonymousLogin(state *smtp.ConnectionState) (smtp.User, error) { +func (bkd *Backend) AnonymousLogin(state *smtp.ConnectionState) (smtp.Session, error) { return nil, smtp.ErrAuthRequired } -// A User is returned after successful login. -type User struct{} +// A Session is returned after successful login. +type Session struct{} -// Send handles an email. -func (u *User) Send(from string, to []string, r io.Reader) error { - log.Println("Sending message:", from, to) +func (s *Session) Mail(from string) error { + log.Println("Mail from:", from) + return nil +} + +func (s *Session) Rcpt(to string) error { + log.Println("Rcpt to:", from) + return nil +} +func (s *Session) Data(r io.Reader) error { if b, err := ioutil.ReadAll(r); err != nil { return err } else { @@ -95,8 +102,9 @@ func (u *User) Send(from string, to []string, r io.Reader) error { return nil } -// Logout handles logout. -func (u *User) Logout() error { +func (s *Session) Reset() {} + +func (s *Session) Logout() error { return nil } diff --git a/example_test.go b/example_test.go index 32b9a89..6d0428f 100644 --- a/example_test.go +++ b/example_test.go @@ -5,7 +5,10 @@ package smtp_test import ( + "errors" "fmt" + "io" + "io/ioutil" "log" "strings" @@ -13,7 +16,7 @@ import ( "github.com/emersion/go-smtp" ) -func Example() { +func ExampleDial() { // Connect to the remote SMTP server. c, err := smtp.Dial("mail.example.com:25") if err != nil { @@ -57,7 +60,7 @@ var ( recipients = []string{"foo@example.com"} ) -func ExamplePlainAuth() { +func ExampleSendMail_PlainAuth() { // hostname is used by PlainAuth to validate the TLS certificate. hostname := "mail.example.com" auth := sasl.NewPlainClient("", "user@example.com", "password") @@ -84,3 +87,65 @@ func ExampleSendMail() { log.Fatal(err) } } + +// The Backend implements SMTP server methods. +type Backend struct{} + +// Login handles a login command with username and password. +func (bkd *Backend) Login(state *smtp.ConnectionState, username, password string) (smtp.Session, error) { + if username != "username" || password != "password" { + return nil, errors.New("Invalid username or password") + } + return &Session{}, nil +} + +// AnonymousLogin requires clients to authenticate using SMTP AUTH before sending emails +func (bkd *Backend) AnonymousLogin(state *smtp.ConnectionState) (smtp.Session, error) { + return nil, smtp.ErrAuthRequired +} + +// A Session is returned after successful login. +type Session struct{} + +func (s *Session) Mail(from string) error { + log.Println("Mail from:", from) + return nil +} + +func (s *Session) Rcpt(to string) error { + log.Println("Rcpt to:", from) + return nil +} + +func (s *Session) Data(r io.Reader) error { + if b, err := ioutil.ReadAll(r); err != nil { + return err + } else { + log.Println("Data:", string(b)) + } + return nil +} + +func (s *Session) Reset() {} + +func (s *Session) Logout() error { + return nil +} + +func ExampleNewServer() { + be := &Backend{} + + s := smtp.NewServer(be) + + s.Addr = ":1025" + s.Domain = "localhost" + s.MaxIdleSeconds = 300 + s.MaxMessageBytes = 1024 * 1024 + s.MaxRecipients = 50 + s.AllowInsecureAuth = true + + log.Println("Starting server at", s.Addr) + if err := s.ListenAndServe(); err != nil { + log.Fatal(err) + } +}