| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package smtp_server
- import (
- "crypto/tls"
- "github.com/emersion/go-smtp"
- log "github.com/sirupsen/logrus"
- "net"
- "pmail/config"
- "time"
- )
- // The Backend implements SMTP server methods.
- type Backend struct{}
- func (bkd *Backend) NewSession(conn *smtp.Conn) (smtp.Session, error) {
- remoteAddress := conn.Conn().RemoteAddr()
- return &Session{
- RemoteAddress: remoteAddress,
- }, nil
- }
- // A Session is returned after EHLO.
- type Session struct {
- RemoteAddress net.Addr
- }
- func (s *Session) AuthPlain(username, password string) error {
- return nil
- }
- func (s *Session) Mail(from string, opts *smtp.MailOptions) error {
- return nil
- }
- func (s *Session) Rcpt(to string) error {
- return nil
- }
- func (s *Session) Reset() {}
- func (s *Session) Logout() error {
- return nil
- }
- var instance *smtp.Server
- func Start() {
- be := &Backend{}
- instance = smtp.NewServer(be)
- instance.Addr = ":25"
- instance.Domain = config.Instance.Domain
- instance.ReadTimeout = 10 * time.Second
- instance.WriteTimeout = 10 * time.Second
- instance.MaxMessageBytes = 1024 * 1024
- instance.MaxRecipients = 50
- // force TLS for auth
- instance.AllowInsecureAuth = false
- // Load the certificate and key
- cer, err := tls.LoadX509KeyPair(config.Instance.SSLPublicKeyPath, config.Instance.SSLPrivateKeyPath)
- if err != nil {
- log.Fatal(err)
- return
- }
- // Configure the TLS support
- instance.TLSConfig = &tls.Config{Certificates: []tls.Certificate{cer}}
- log.Println("Starting server at", instance.Addr)
- if err := instance.ListenAndServe(); err != nil {
- log.Fatal(err)
- }
- }
- func Stop() {
- if instance != nil {
- instance.Close()
- }
- }
|