Skip to content

Instantly share code, notes, and snippets.

@SilentGopherLnx
Last active December 7, 2019 12:15
Show Gist options
  • Save SilentGopherLnx/b4e157f612ce47309616db980e27e0e3 to your computer and use it in GitHub Desktop.
Save SilentGopherLnx/b4e157f612ce47309616db980e27e0e3 to your computer and use it in GitHub Desktop.
script for deleting mails before specific date via IMAP protocol
package main
import (
. "github.com/SilentGopherLnx/easygolang"
"github.com/emersion/go-imap"
"github.com/emersion/go-imap/client"
)
const folder_in = "INBOX"
//https://github.com/emersion/go-imap/blob/master/client/example_test.go - DOCS!
func main() {
delete_cmd := false
folder := folder_in
port := 993
//https://myaccount.google.com/security - Enable external unsecure applications
//https://mail.google.com/mail/u/0/#settings/fwdandpop - Enable IMAP
address := "imap.gmail.com"
login := "testtest@gmail.com"
passw := "123123"
//or...
//address = "imap.yandex.ru"
//login = "testtest@yandex.ru"
//passw = "123123"
//or...
//address := "imap.mail.ru"
//login := "testtest@mail.ru"
//passw := "123123"
save_last_days := 35 // !!!!!
//delete_cmd = true // uncomment to work!!!!!!!!!!!!!!
//folder = folder_in + "/" + "subfolder_mailboxe_name_if_exist" // uncomment this is need
//folder = "out_mailbox_name" // example
c, err1 := client.DialTLS(address+":"+I2S(port), nil)
if err1 != nil {
Prln("Not Connected: " + err1.Error())
AppExit(0)
}
Prln("Connected to server")
// Login
defer c.Logout()
if err2 := c.Login(login, passw); err2 != nil {
Prln("Not Logined: " + err2.Error())
AppExit(0)
}
Prln("Logged in by password")
// ============= List existing mailboxes
mailboxes := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
done <- c.List("", "*", mailboxes)
}()
Prln("==== Mailboxes:")
for m := range mailboxes {
Prln("" + m.Name)
}
if err := <-done; err != nil {
Prln(err.Error())
}
Prln("====")
//========
mbox, err3 := c.Select(folder, false)
if err3 != nil {
Prln(err3.Error())
AppExit(0)
}
Prln("Total mails in mailbox: " + I2S(int(mbox.Messages)))
criteria := imap.NewSearchCriteria()
//criteria.WithoutFlags = []string{imap.SeenFlag}
criteria.Before = TimeGolang(TimeAddDays(TimeNow(), 0-save_last_days))
ids, err4 := c.Search(criteria)
if err4 != nil {
Prln(err4.Error())
AppExit(0)
}
Prln("Will be deleted: " + I2S(len(ids)))
if delete_cmd {
if len(ids) > 0 && delete_cmd {
seqset := new(imap.SeqSet)
for j := 0; j < len(ids); j++ {
seqset.AddNum(ids[j])
}
// First mark the message as deleted
item := imap.FormatFlagsOp(imap.AddFlags, true)
flags := []interface{}{imap.DeletedFlag}
if err5 := c.Store(seqset, item, flags, nil); err5 != nil {
Prln("Store deleted flag error: " + err5.Error())
AppExit(0)
}
Prln("Flag stored...")
// Then delete it
if err6 := c.Expunge(nil); err6 != nil {
Prln("Expunge (delete)error: " + err6.Error())
AppExit(0)
}
Prln("Deleted (Expunged)!")
} else {
Prln("Nothing to delete...")
}
} else {
Prln("Deleting canceled by YOU...")
}
Prln("========END========")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment