Package: wnpp Severity: wishlist Owner: suman <su...@protonmail.com> * Package name : golang-github-emersion-go-smtp Version : 0.11.2-1 Upstream Author : Simon Ser * URL : https://github.com/emersion/go-smtp * License : Expat Programming Lang: Go Description : :outbox_tray: An SMTP client & server library written in Go
go-smtp GoDoc (https://godoc.org/github.com/emersion/go-smtp) builds.sr.ht status (https://builds.sr.ht/~emersion/go-smtp?) codecov (https://codecov.io/gh/emersion/go-smtp) . An ESMTP client and server library written in Go. Features• ESMTP client & server implementing RFC 5321 (https://tools.ietf.org/html/rfc5321)• Support for SMTP AUTH (https://tools.ietf.org/html/rfc4954) and PIPELINING (https://tools.ietf.org/html/rfc2920)• UTF-8 support for subject and message• LMTP (https://tools.ietf.org/html/rfc2033) supportUsageClient ```go package main . import ( "log" "strings" "github.com/emersion/go-sasl" "github.com/emersion/go-smtp" . ) . func main() { // Set up authentication information. auth := sasl.NewPlainClient("", "u...@example.com", "password") // Connect to the server, authenticate, set the sender and recipient, // and send the email all in one step. to := []string{"recipi...@example.net"} msg := strings.NewReader("To: recipi...@example.net\r\n" + "Subject: discount Gophers!\r\n" + "\r\n" + "This is the email body.\r\n") err := smtp.SendMail("mail.example.com:25", auth, "sen...@example.org", to, msg) if err != nil { log.Fatal(err) } . } ``` . If you need more control, you can use Client instead. Server ```go package main . import ( "errors" "io" "io/ioutil" "log" "time" "github.com/emersion/go-smtp" . ) . // 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, opts smtp.MailOptions) error { log.Println("Mail from:", from) return nil } . func (s *Session) Rcpt(to string) error { log.Println("Rcpt to:", to) 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 main() { be := &Backend{} s := smtp.NewServer(be) . s.Addr = ":1025" s.Domain = "localhost" s.ReadTimeout = 10 * time.Second s.WriteTimeout = 10 * time.Second 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) } . } ``` . You can use the server manually with telnet: . $ telnet localhost 1025 EHLO localhost AUTH PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk MAIL FROM:<r...@nsa.gov> RCPT TO:<r...@gchq.gov.uk> DATA Hey <3 . . Relationship with net/smtp The Go standard library provides a SMTP client implementation in net/smtp. However net/smtp is frozen: it's not getting any new features. go-smtp provides a server implementation and a number of client improvements.