diff --git a/djpianalto.com/goff/goff.go b/djpianalto.com/goff/goff.go index b2c1afe..2e5af8e 100644 --- a/djpianalto.com/goff/goff.go +++ b/djpianalto.com/goff/goff.go @@ -90,6 +90,8 @@ func main() { // Start the task handler in a goroutine go utils.ProcessTasks(dg, 1) + go utils.RecieveEmail() + fmt.Println("The Bot is now running.") sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) diff --git a/djpianalto.com/goff/utils/email.go b/djpianalto.com/goff/utils/email.go new file mode 100644 index 0000000..2208c1d --- /dev/null +++ b/djpianalto.com/goff/utils/email.go @@ -0,0 +1,119 @@ +package utils + +import ( + "io" + "io/ioutil" + "log" + "os" + "time" + + imap "github.com/emersion/go-imap" + "github.com/emersion/go-imap/client" + "github.com/emersion/go-message/mail" +) + +var ( + emailUsername = os.Getenv("GOFF_EMAIL_USERNAME") + emailPassword = os.Getenv("GOFF_EMAIL_PASSWORD") +) + +var EmailClient client.Client + +func RecieveEmail() { + for { + log.Println("Connecting to Email server.") + + EmailClient, err := client.DialTLS("mail.djpianalto.com:993", nil) + if err != nil { + log.Println(err) + return + } + if err = EmailClient.Login(emailUsername, emailPassword); err != nil { + log.Println(err) + return + } + log.Println("Connected to Email server.") + defer EmailClient.Logout() + + mbox, err := EmailClient.Select("INBOX", false) + if err != nil { + log.Println(err) + return + } + + if mbox.Messages == 0 { + log.Println("No Messages in Mailbox") + } + + criteria := imap.NewSearchCriteria() + criteria.WithoutFlags = []string{"\\Seen"} + uids, err := EmailClient.Search(criteria) + if err != nil { + log.Println(err) + } + if len(uids) > 0 { + seqset := new(imap.SeqSet) + seqset.AddNum(uids...) + section := &imap.BodySectionName{} + items := []imap.FetchItem{section.FetchItem()} + messages := make(chan *imap.Message, 10) + go func() { + if err = EmailClient.Fetch(seqset, items, messages); err != nil { + log.Println(err) + return + } + }() + + for msg := range messages { + if msg == nil { + log.Println("No New Messages") + continue + } + r := msg.GetBody(section) + if r == nil { + log.Println("Server didn't send a message body") + continue + } + mr, err := mail.CreateReader(r) + if err != nil { + log.Println(err) + continue + } + header := mr.Header + if date, err := header.Date(); err == nil { + log.Println("Date:", date) + } + if from, err := header.AddressList("From"); err == nil { + log.Println("From:", from) + } + if to, err := header.AddressList("To"); err == nil { + log.Println("To:", to) + } + if subject, err := header.Subject(); err == nil { + log.Println("Subject:", subject) + } + for { + p, err := mr.NextPart() + if err == io.EOF { + break + } else if err != nil { + log.Println(err) + break + } + + switch h := p.Header.(type) { + case *mail.InlineHeader: + // This is the message's text (can be plain-text or HTML) + b, _ := ioutil.ReadAll(p.Body) + log.Printf("Got text: %v\n", string(b)) + case *mail.AttachmentHeader: + // This is an attachment + filename, _ := h.Filename() + log.Printf("Got attachment: %v\n", filename) + } + } + } + } + time.Sleep(300 * time.Second) + } +}