Add basic email handler

pull/1/head
DustyP 5 years ago
parent 2f6d45d4ef
commit f40cf00f7a

@ -90,6 +90,8 @@ func main() {
// Start the task handler in a goroutine // Start the task handler in a goroutine
go utils.ProcessTasks(dg, 1) go utils.ProcessTasks(dg, 1)
go utils.RecieveEmail()
fmt.Println("The Bot is now running.") fmt.Println("The Bot is now running.")
sc := make(chan os.Signal, 1) sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)

@ -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)
}
}
Loading…
Cancel
Save