"fmt"
"net"
"net/mail"
+ "os"
+ "path"
+ "strings"
"src.bluestatic.org/mailpopbox/smtp"
)
}
func (server *smtpServer) VerifyAddress(addr mail.Address) smtp.ReplyLine {
+ if server.maildropForAddress(addr) == "" {
+ return smtp.ReplyBadMailbox
+ }
return smtp.ReplyOK
}
}
func (server *smtpServer) OnMessageDelivered(en smtp.Envelope) *smtp.ReplyLine {
- fmt.Printf("MSG: %#v\n%s\n", en, string(en.Data))
+ maildrop := server.maildropForAddress(en.RcptTo[0])
+ if maildrop == "" {
+ // TODO: log error
+ return &smtp.ReplyBadMailbox
+ }
+
+ f, err := os.Create(path.Join(maildrop, en.ID+".msg"))
+ if err != nil {
+ // TODO: log error
+ return &smtp.ReplyBadMailbox
+ }
+
+ smtp.WriteEnvelopeForDelivery(f, en)
+ f.Close()
return nil
}
+
+func (server *smtpServer) maildropForAddress(addr mail.Address) string {
+ domainIdx := strings.LastIndex(addr.Address, "@")
+ if domainIdx == -1 {
+ return ""
+ }
+
+ domain := addr.Address[domainIdx+1:]
+
+ for _, s := range server.config.Servers {
+ if domain == s.Domain {
+ return s.MaildropPath
+ }
+ }
+
+ return ""
+}
import (
"crypto/tls"
+ "fmt"
+ "io"
"net"
"net/mail"
"time"
ID string
}
+func WriteEnvelopeForDelivery(w io.Writer, e Envelope) {
+ fmt.Fprintf(w, "Delivered-To: <%s>\r\n", e.RcptTo[0].Address)
+ fmt.Fprintf(w, "Return-Path: <%s>\r\n", e.MailFrom.Address)
+ w.Write(e.Data)
+}
+
type Server interface {
Name() string
TLSConfig() *tls.Config