Index both junk and good mail in one function

master
Carlo Strub 7 years ago
parent 667f75925f
commit 0961e96b5a

@ -20,22 +20,22 @@ type Mail struct {
}
// Index loads all mail keys from the Maildir directory for processing.
func Index(d string, junk bool) (m []*Mail, err error) {
func Index(d string) (m []*Mail, err error) {
var j []string
if junk {
j, err = maildir.Dir(d + "/.Junk").Keys()
} else {
j, err = maildir.Dir(d).Keys()
}
if err != nil {
return m, err
}
for _, val := range j {
var new Mail
new.Key = val
new.Junk = junk
m = append(m, &new)
dirs := []string{d, d + "/.Junk"}
for _, dir := range dirs {
j, err := maildir.Dir(dir).Keys()
if err != nil {
return m, err
}
for _, val := range j {
var new Mail
new.Key = val
if dir == d+"/.Junk" {
new.Junk = true
}
m = append(m, &new)
}
}
return m, nil

@ -40,7 +40,7 @@ var _ = Describe("Mail", func() {
Context("Maildir", func() {
It("Create a slice of mail keys", func() {
result, err := s.Index("test/Maildir", true)
result, err := s.Index("test/Maildir")
Ω(err).ShouldNot(HaveOccurred())
name := func(m1, m2 *s.Mail) bool {
@ -86,19 +86,6 @@ var _ = Describe("Mail", func() {
Body: nil,
Junk: true,
},
}))
})
It("Create a slice of mail keys", func() {
result, err := s.Index("test/Maildir", false)
Ω(err).ShouldNot(HaveOccurred())
name := func(m1, m2 *s.Mail) bool {
return m1.Key < m2.Key
}
mailBy(name).Sort(result)
Ω(result).Should(Equal(
[]*s.Mail{
{
Key: "1488230510.M141612P8565.mail.carlostrub.ch,S=5978,W=6119",
Subject: nil,
@ -108,7 +95,7 @@ var _ = Describe("Mail", func() {
}))
})
It("Fail if Maildir does not exist", func() {
_, err := s.Index("test/DOESNOTEXIST", false)
_, err := s.Index("test/DOESNOTEXIST")
Ω(err).Should(HaveOccurred())
})
})

@ -113,18 +113,14 @@ func main() {
log.Fatal("Sorry... only one Maildir supported as of today.")
}
log.Println("loading mails")
mailsGood, err := Index(maildirPaths[0], false)
if err != nil {
log.Fatal("Wrong path to Maildir")
}
log.Println("good mails loaded")
log.Println("create empty junk directory if required")
os.MkdirAll(maildirPaths[0]+"/.Junk/cur", 0700)
mailsJunk, err := Index(maildirPaths[0], true)
log.Println("loading mails")
mails, err := Index(maildirPaths[0])
if err != nil {
log.Fatal("Wrong path to Maildir")
}
log.Println("junk mails loaded")
log.Println("mails loaded")
// Open the database
log.Println("loading database")
@ -136,29 +132,16 @@ func main() {
log.Println("database loaded")
// Check for unprocessed mail
var unprocessedJunk, unprocessedGood []string
for i := range mailsGood {
var unprocessedGood []string
for i := range mails {
db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("Processed"))
v := b.Get([]byte(mailsGood[i].Key))
v := b.Get([]byte(mails[i].Key))
if len(v) == 0 {
unprocessedGood = append(unprocessedGood, mailsGood[i].Key)
unprocessedGood = append(unprocessedGood, mails[i].Key)
}
if string(v) == junk {
unprocessedGood = append(unprocessedGood, mailsGood[i].Key)
}
return nil
})
}
for i := range mailsJunk {
db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("Processed"))
v := b.Get([]byte(mailsJunk[i].Key))
if len(v) == 0 {
unprocessedJunk = append(unprocessedJunk, mailsJunk[i].Key)
}
if string(v) == good {
unprocessedJunk = append(unprocessedJunk, mailsJunk[i].Key)
unprocessedGood = append(unprocessedGood, mails[i].Key)
}
return nil
})

Loading…
Cancel
Save