mailscanner.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package main
  2. import (
  3. "fmt"
  4. ioutil "io/ioutil"
  5. "log"
  6. fsnotify "github.com/fsnotify/fsnotify"
  7. )
  8. type MailScanner struct {
  9. watcher *fsnotify.Watcher
  10. }
  11. // func fileExists(filename string) bool {
  12. // info, err := os.Stat(filename)
  13. // if os.IsNotExist(err) {
  14. // return false
  15. // }
  16. // return err == nil && !info.IsDir() && info != nil
  17. // }
  18. func NewMailScanner(mailPath string) (ms *MailScanner) {
  19. watcher, err := fsnotify.NewWatcher()
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. ms = &MailScanner{
  24. watcher: watcher,
  25. }
  26. files, err := ioutil.ReadDir(mailPath)
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. for _, f := range files {
  31. if fileExists(f.Name()) {
  32. fmt.Printf("Add mail file %s for watching\n", f.Name())
  33. watcher.Add(f.Name())
  34. }
  35. }
  36. return
  37. }
  38. func (ms *MailScanner) Run() {
  39. go func() {
  40. for {
  41. select {
  42. case event, ok := <-ms.watcher.Events:
  43. if !ok {
  44. return
  45. }
  46. if event.Op&fsnotify.Write == fsnotify.Write {
  47. log.Println("New email for", event.Name)
  48. }
  49. case err, ok := <-ms.watcher.Errors:
  50. if !ok {
  51. return
  52. }
  53. log.Println("error:", err)
  54. }
  55. }
  56. }()
  57. }