10 "src.bluestatic.org/mailpopbox/pop3"
13 func runPOP3Server(config Config) <-chan error {
22 type pop3Server struct {
27 func (server *pop3Server) run() {
28 for _, s := range server.config.Servers {
29 if err := os.Mkdir(s.MaildropPath, 0700); err != nil && !os.IsExist(err) {
34 l, err := net.Listen("tcp", fmt.Sprintf(":%d", server.config.POP3Port))
41 conn, err := l.Accept()
47 go pop3.AcceptConnection(conn, server)
51 func (server *pop3Server) Name() string {
52 return server.config.Hostname
55 func (server *pop3Server) OpenMailbox(user, pass string) (pop3.Mailbox, error) {
56 for _, s := range server.config.Servers {
57 if user == "mailbox@"+s.Domain && pass == s.MailboxPassword {
58 return server.openMailbox(s.MaildropPath)
61 return nil, errors.New("permission denied")
64 func (server *pop3Server) openMailbox(maildrop string) (*mailbox, error) {
66 messages: make([]message, 0),
82 func (m message) ID() int {
86 func (m message) Size() int {
90 func (mb *mailbox) ListMessages() ([]pop3.Message, error) {
91 msgs := make([]pop3.Message, len(mb.messages))
92 for i := 0; i < len(mb.messages); i++ {
93 msgs[i] = &mb.messages[i]
98 func (mb *mailbox) Retrieve(msg pop3.Message) (io.ReadCloser, error) {
99 filename := msg.(*message).filename
100 return os.Open(filename)
103 func (mb *mailbox) Delete(msg pop3.Message) error {
104 message := msg.(*message)
106 return errors.New("already deleted")
108 message.deleted = true
112 func (mb *mailbox) Close() error {
113 for _, message := range mb.messages {
115 os.Remove(message.filename)
121 func (mb *mailbox) Reset() {
122 for _, message := range mb.messages {
123 message.deleted = false