Newer
Older
zangtumb / session.go
package main

import (
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"strings"
	"time"

	"github.com/amalfra/maildir"
)

// A Session is returned after successful login.
type Session struct {
	MailFrom   string
	RcptTo     string
	LocalUser  string
	MailDomain string
	Valid      bool
}

func (s *Session) Rcpt(to string) error {
	log.Println("Rcpt to:", to)
	if !SmtpBackend.CheckValidRcpt(to) {
		time.Sleep(10 * time.Second)
		return errors.New("YU NO MAIL!!! WE NU RELAY")
	}
	s.RcptTo = to
	if strings.Contains(to, "@") {
		rcptArray := strings.Split(to, "@")
		s.MailDomain = rcptArray[1]
		s.LocalUser = rcptArray[0]
		s.Valid = true
	} else {
		s.Valid = false
	}

	return nil
}

func (s *Session) Data(r io.Reader) error {
	log.Println("Start Saving Message")
	if !s.Valid {
		log.Println("Message Was Not Valid: ", s)
		return nil
	}
	if b, err := ioutil.ReadAll(r); err != nil {
		return err
	} else {
		//using the default Maildir structure
		mad := fmt.Sprintf("%s/%s/Maildir", SmtpBackend.MailBaseFolder, s.LocalUser)
		log.Println("Maildir is:", mad)
		myMaildir := maildir.NewMaildir(mad)
		_, errMd := myMaildir.Add(string(b))
		if errMd != nil {
			log.Println("Error Saving mail ")
			return errMd
		}
	}

	return nil
}

func (s *Session) Reset() {
	s.LocalUser = ""
	s.MailDomain = ""
	s.MailFrom = ""
	s.RcptTo = ""
	s.Valid = false
}