瀏覽代碼

Add mailscanner

Alexey Edelev 5 年之前
父節點
當前提交
028ec7257c
共有 2 個文件被更改,包括 81 次插入6 次删除
  1. 67 0
      mailscanner.go
  2. 14 6
      main.go

+ 67 - 0
mailscanner.go

@@ -0,0 +1,67 @@
+package main
+
+import (
+	"fmt"
+	ioutil "io/ioutil"
+	"log"
+
+	fsnotify "github.com/fsnotify/fsnotify"
+)
+
+type MailScanner struct {
+	watcher *fsnotify.Watcher
+}
+
+// func fileExists(filename string) bool {
+// 	info, err := os.Stat(filename)
+// 	if os.IsNotExist(err) {
+// 		return false
+// 	}
+// 	return err == nil && !info.IsDir() && info != nil
+// }
+
+func NewMailScanner(mailPath string) (ms *MailScanner) {
+	watcher, err := fsnotify.NewWatcher()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	ms = &MailScanner{
+		watcher: watcher,
+	}
+
+	files, err := ioutil.ReadDir(mailPath)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	for _, f := range files {
+		if fileExists(f.Name()) {
+			fmt.Printf("Add mail file %s for watching\n", f.Name())
+			watcher.Add(f.Name())
+		}
+	}
+
+	return
+}
+
+func (ms *MailScanner) Run() {
+	go func() {
+		for {
+			select {
+			case event, ok := <-ms.watcher.Events:
+				if !ok {
+					return
+				}
+				if event.Op&fsnotify.Write == fsnotify.Write {
+					log.Println("New email for", event.Name)
+				}
+			case err, ok := <-ms.watcher.Errors:
+				if !ok {
+					return
+				}
+				log.Println("error:", err)
+			}
+		}
+	}()
+}

+ 14 - 6
main.go

@@ -74,12 +74,14 @@ type GofixEngine struct {
 	templater   *Templater
 	fileServer  http.Handler
 	userChecker *regexp.Regexp
+	scanner     *MailScanner
 }
 
 func NewGofixEngine() (e *GofixEngine) {
 	e = &GofixEngine{
 		templater:  NewTemplater("templates"),
 		fileServer: http.FileServer(http.Dir("./")),
+		scanner:    NewMailScanner("/home/vmail/semlanik.org"),
 	}
 
 	var err error = nil
@@ -90,6 +92,13 @@ func NewGofixEngine() (e *GofixEngine) {
 	return
 }
 
+func (e *GofixEngine) Run() {
+	defer e.scanner.watcher.Close()
+	e.scanner.Run()
+	http.Handle("/", e)
+	log.Fatal(http.ListenAndServe(":65200", nil))
+}
+
 func (e *GofixEngine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	fmt.Println(r.URL.Path)
 	switch r.URL.Path {
@@ -129,13 +138,13 @@ func (e *GofixEngine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 
 			boundaryFinder, err := regexp.Compile(BoundaryRegExp)
 
-			if !fileExists("/home/vmail/vmail/" + r.URL.Query().Get("user")) {
+			if !fileExists("/home/vmail/semlanik.org/" + r.URL.Query().Get("user")) {
 				w.WriteHeader(http.StatusForbidden)
 				fmt.Fprint(w, "403 Unknown user")
 				return
 			}
 
-			file, _ := os.Open("/home/vmail/vmail/" + r.URL.Query().Get("user"))
+			file, _ := os.Open("/home/vmail/semlanik.org/" + r.URL.Query().Get("user"))
 			scanner := bufio.NewScanner(file)
 			activeBoundary := ""
 			var previousHeader *string = nil
@@ -255,11 +264,10 @@ func fileExists(filename string) bool {
 	if os.IsNotExist(err) {
 		return false
 	}
-	return !info.IsDir()
+	return err == nil && !info.IsDir() && info != nil
 }
 
 func main() {
-	handler := NewGofixEngine()
-	http.Handle("/", handler)
-	log.Fatal(http.ListenAndServe(":8080", nil))
+	engine := NewGofixEngine()
+	engine.Run()
 }