Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "emailmonitor/util"
- "fmt"
- )
- func main() {
- serverGmail := util.NewServerGmail()
- serverGmail.Connect()
- serverGmail.Login()
- serverGmail.ListUnseenMessages()
- }
- //-----------------------------------------
- package util
- import (
- "io/ioutil"
- "log"
- "net/mail"
- "net/smtp"
- imap "github.com/emersion/go-imap"
- "github.com/emersion/go-imap/client"
- )
- type ServerGmail struct {
- user string
- pass string
- erro string
- cliente *client.Client
- }
- func NewServerGmail() *ServerGmail {
- serverGmail := &ServerGmail{}
- serverGmail.user = "xxxxxx@gmail.com"
- serverGmail.pass = "xxxxx"
- serverGmail.erro = ""
- return serverGmail
- }
- func (serverGmail *ServerGmail) Connect() {
- // Connect to server
- cliente, erro := client.DialTLS("smtp.gmail.com:993", nil)
- if erro != nil {
- serverGmail.erro = erro.Error()
- }
- log.Println("Connected")
- serverGmail.cliente = cliente
- }
- func (serverGmail *ServerGmail) Login() {
- // Login
- if erro := serverGmail.cliente.Login(serverGmail.user, serverGmail.pass); erro != nil {
- serverGmail.erro = erro.Error()
- }
- log.Println("Logged")
- }
- func (serverGmail *ServerGmail) setLabelBox(label string) *imap.MailboxStatus {
- mailbox, erro := serverGmail.cliente.Select(label, true)
- if erro != nil {
- serverGmail.erro = erro.Error()
- }
- return mailbox
- }
- func (serverGmail *ServerGmail) ListUnseenMessages() {
- // set mailbox to INBOX
- serverGmail.setLabelBox("INBOX")
- // criteria to search for unseen messages
- criteria := imap.NewSearchCriteria()
- criteria.WithoutFlags = []string{"\Seen"}
- uids, err := serverGmail.cliente.UidSearch(criteria)
- if err != nil {
- log.Println(err)
- }
- seqSet := new(imap.SeqSet)
- seqSet.AddNum(uids...)
- section := &imap.BodySectionName{}
- items := []imap.FetchItem{imap.FetchEnvelope, imap.FetchFlags, imap.FetchInternalDate, section.FetchItem()}
- messages := make(chan *imap.Message)
- go func() {
- if err := serverGmail.cliente.UidFetch(seqSet, items, messages); err != nil {
- log.Fatal(err)
- }
- }()
- for message := range messages {
- log.Println(message.Uid)
- if message == nil {
- log.Fatal("Server didn't returned message")
- }
- r := message.GetBody(section)
- if r == nil {
- log.Fatal("Server didn't returned message body")
- }
- // Create a new mail reader
- mr, err := mail.CreateReader(r)
- if err != nil {
- log.Fatal(err)
- }
- // Print some info about the message
- 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)
- }
- // MARK "SEEN" ------- STARTS HERE ---------
- seqSet.Clear()
- seqSet.AddNum(message.Uid)
- item := imap.FormatFlagsOp(imap.AddFlags, true)
- flags := []interface{}{imap.SeenFlag}
- erro := serverGmail.cliente.UidStore(seqSet, item, flags, nil)
- if erro != nil {
- panic("error!")
- }
- }
- }
Add Comment
Please, Sign In to add comment