This commit is contained in:
Christian Joergensen 2014-07-14 14:20:36 +02:00
parent fdbafdab4b
commit b9243e732a
4 changed files with 23 additions and 27 deletions

View file

@ -1,8 +1,8 @@
package smtpd package smtpd
import ( import (
"strings"
"fmt" "fmt"
"strings"
) )
type MailAddress string type MailAddress string

View file

@ -37,10 +37,10 @@ func main() {
} }
server := &smtpd.Server{ server := &smtpd.Server{
Handler: dumpMessage, Handler: dumpMessage,
Authenticator: authenticate, Authenticator: authenticate,
TLSConfig: tlsConfig, TLSConfig: tlsConfig,
ForceTLS: true, ForceTLS: true,
} }
server.ListenAndServe() server.ListenAndServe()

View file

@ -1,13 +1,13 @@
package smtpd package smtpd
import ( import (
"fmt"
"strings"
"crypto/tls"
"bufio" "bufio"
"log"
"bytes" "bytes"
"crypto/tls"
"encoding/base64" "encoding/base64"
"fmt"
"log"
"strings"
) )
type command struct { type command struct {
@ -145,7 +145,6 @@ func (session *session) handleRCPT(cmd command) {
} }
func (session *session) handleSTARTTLS(cmd command) { func (session *session) handleSTARTTLS(cmd command) {
if session.tls { if session.tls {
@ -279,7 +278,7 @@ func (session *session) handleAUTH(cmd command) {
case "LOGIN": case "LOGIN":
session.reply(334, "VXNlcm5hbWU6") session.reply(334, "VXNlcm5hbWU6")
if !session.scanner.Scan() { if !session.scanner.Scan() {
return return
} }

View file

@ -7,13 +7,12 @@ import (
"fmt" "fmt"
"log" "log"
"net" "net"
"time"
"os" "os"
"time"
) )
type Server struct { type Server struct {
Addr string // Address to listen on when using ListenAndServe (default: "127.0.0.1:10025")
Addr string // Address to listen on when using ListenAndServe (default: "127.0.0.1:10025")
WelcomeMessage string // Initial server banner (default: "<hostname> ESMTP ready.") WelcomeMessage string // Initial server banner (default: "<hostname> ESMTP ready.")
ReadTimeout time.Duration // Socket timeout for read operations (default: 60s) ReadTimeout time.Duration // Socket timeout for read operations (default: 60s)
@ -27,8 +26,8 @@ type Server struct {
// Enable various checks during the SMTP session. // Enable various checks during the SMTP session.
// Can be left empty for no restrictions. // Can be left empty for no restrictions.
// If an error is returned, it will be reported in the SMTP session. // If an error is returned, it will be reported in the SMTP session.
HeloChecker func(peer Peer) error // Called after HELO/EHLO. HeloChecker func(peer Peer) error // Called after HELO/EHLO.
SenderChecker func(peer Peer, addr MailAddress) error // Called after MAIL FROM. SenderChecker func(peer Peer, addr MailAddress) error // Called after MAIL FROM.
RecipientChecker func(peer Peer, addr MailAddress) error // Called after each RCPT TO. RecipientChecker func(peer Peer, addr MailAddress) error // Called after each RCPT TO.
// Enable PLAIN/LOGIN authentication, only available after STARTTLS. // Enable PLAIN/LOGIN authentication, only available after STARTTLS.
@ -42,9 +41,9 @@ type Server struct {
} }
type Peer struct { type Peer struct {
HeloName string // Server name used in HELO/EHLO command HeloName string // Server name used in HELO/EHLO command
Username string // Username from authentication Username string // Username from authentication
Password string // Password from authentication Password string // Password from authentication
Addr net.Addr // Network address Addr net.Addr // Network address
} }
@ -55,19 +54,18 @@ type Envelope struct {
} }
type session struct { type session struct {
server *Server server *Server
peer Peer peer Peer
envelope *Envelope envelope *Envelope
conn net.Conn conn net.Conn
reader *bufio.Reader reader *bufio.Reader
writer *bufio.Writer writer *bufio.Writer
scanner *bufio.Scanner scanner *bufio.Scanner
tls bool tls bool
} }
func (srv *Server) newSession(c net.Conn) (s *session, err error) { func (srv *Server) newSession(c net.Conn) (s *session, err error) {
@ -81,7 +79,7 @@ func (srv *Server) newSession(c net.Conn) (s *session, err error) {
writer: bufio.NewWriter(c), writer: bufio.NewWriter(c),
peer: Peer{Addr: c.RemoteAddr()}, peer: Peer{Addr: c.RemoteAddr()},
} }
s.scanner = bufio.NewScanner(s.reader) s.scanner = bufio.NewScanner(s.reader)
return s, nil return s, nil
@ -242,7 +240,6 @@ func (session *session) error(err error) {
session.reply(502, fmt.Sprintf("%s", err)) session.reply(502, fmt.Sprintf("%s", err))
} }
func (session *session) extensions() []string { func (session *session) extensions() []string {
extensions := []string{ extensions := []string{