12 "src.bluestatic.org/mailpopbox/smtp"
15 func runSMTPServer(config Config) <-chan error {
24 type smtpServer struct {
31 func (server *smtpServer) run() {
33 server.tlsConfig, err = server.config.GetTLSConfig()
38 l, err := net.Listen("tcp", fmt.Sprintf(":%d", server.config.SMTPPort))
45 conn, err := l.Accept()
51 go smtp.AcceptConnection(conn, server)
55 func (server *smtpServer) Name() string {
56 return server.config.Hostname
59 func (server *smtpServer) TLSConfig() *tls.Config {
60 return server.tlsConfig
63 func (server *smtpServer) VerifyAddress(addr mail.Address) smtp.ReplyLine {
64 if server.maildropForAddress(addr) == "" {
65 return smtp.ReplyBadMailbox
70 func (server *smtpServer) OnEHLO() *smtp.ReplyLine {
74 func (server *smtpServer) OnMessageDelivered(en smtp.Envelope) *smtp.ReplyLine {
75 maildrop := server.maildropForAddress(en.RcptTo[0])
78 return &smtp.ReplyBadMailbox
81 f, err := os.Create(path.Join(maildrop, en.ID+".msg"))
84 return &smtp.ReplyBadMailbox
87 smtp.WriteEnvelopeForDelivery(f, en)
92 func (server *smtpServer) maildropForAddress(addr mail.Address) string {
93 domainIdx := strings.LastIndex(addr.Address, "@")
98 domain := addr.Address[domainIdx+1:]
100 for _, s := range server.config.Servers {
101 if domain == s.Domain {
102 return s.MaildropPath