Guest User

Untitled

a guest
Jun 11th, 2018
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "emailmonitor/util"
  5. "fmt"
  6. )
  7.  
  8. func main() {
  9.  
  10. serverGmail := util.NewServerGmail()
  11.  
  12. serverGmail.Connect()
  13. serverGmail.Login()
  14. serverGmail.ListUnseenMessages()
  15.  
  16. }
  17.  
  18. //-----------------------------------------
  19.  
  20. package util
  21.  
  22. import (
  23. "io/ioutil"
  24. "log"
  25. "net/mail"
  26. "net/smtp"
  27.  
  28. imap "github.com/emersion/go-imap"
  29. "github.com/emersion/go-imap/client"
  30. )
  31.  
  32. type ServerGmail struct {
  33. user string
  34. pass string
  35. erro string
  36. cliente *client.Client
  37. }
  38.  
  39. func NewServerGmail() *ServerGmail {
  40. serverGmail := &ServerGmail{}
  41. serverGmail.user = "xxxxxx@gmail.com"
  42. serverGmail.pass = "xxxxx"
  43. serverGmail.erro = ""
  44.  
  45. return serverGmail
  46. }
  47.  
  48. func (serverGmail *ServerGmail) Connect() {
  49. // Connect to server
  50. cliente, erro := client.DialTLS("smtp.gmail.com:993", nil)
  51. if erro != nil {
  52. serverGmail.erro = erro.Error()
  53. }
  54. log.Println("Connected")
  55.  
  56. serverGmail.cliente = cliente
  57.  
  58. }
  59.  
  60. func (serverGmail *ServerGmail) Login() {
  61. // Login
  62. if erro := serverGmail.cliente.Login(serverGmail.user, serverGmail.pass); erro != nil {
  63. serverGmail.erro = erro.Error()
  64. }
  65. log.Println("Logged")
  66.  
  67. }
  68.  
  69. func (serverGmail *ServerGmail) setLabelBox(label string) *imap.MailboxStatus {
  70. mailbox, erro := serverGmail.cliente.Select(label, true)
  71. if erro != nil {
  72. serverGmail.erro = erro.Error()
  73. }
  74. return mailbox
  75. }
  76.  
  77. func (serverGmail *ServerGmail) ListUnseenMessages() {
  78. // set mailbox to INBOX
  79. serverGmail.setLabelBox("INBOX")
  80. // criteria to search for unseen messages
  81. criteria := imap.NewSearchCriteria()
  82. criteria.WithoutFlags = []string{"\Seen"}
  83.  
  84. uids, err := serverGmail.cliente.UidSearch(criteria)
  85. if err != nil {
  86. log.Println(err)
  87. }
  88. seqSet := new(imap.SeqSet)
  89. seqSet.AddNum(uids...)
  90. section := &imap.BodySectionName{}
  91. items := []imap.FetchItem{imap.FetchEnvelope, imap.FetchFlags, imap.FetchInternalDate, section.FetchItem()}
  92. messages := make(chan *imap.Message)
  93. go func() {
  94. if err := serverGmail.cliente.UidFetch(seqSet, items, messages); err != nil {
  95. log.Fatal(err)
  96. }
  97. }()
  98.  
  99. for message := range messages {
  100.  
  101. log.Println(message.Uid)
  102.  
  103. if message == nil {
  104. log.Fatal("Server didn't returned message")
  105. }
  106.  
  107. r := message.GetBody(section)
  108. if r == nil {
  109. log.Fatal("Server didn't returned message body")
  110. }
  111.  
  112. // Create a new mail reader
  113. mr, err := mail.CreateReader(r)
  114. if err != nil {
  115. log.Fatal(err)
  116. }
  117.  
  118. // Print some info about the message
  119. header := mr.Header
  120.  
  121. if date, err := header.Date(); err == nil {
  122. log.Println("Date:", date)
  123. }
  124. if from, err := header.AddressList("From"); err == nil {
  125. log.Println("From:", from)
  126. }
  127. if to, err := header.AddressList("To"); err == nil {
  128. log.Println("To:", to)
  129. }
  130. if subject, err := header.Subject(); err == nil {
  131. log.Println("Subject:", subject)
  132. }
  133.  
  134. // MARK "SEEN" ------- STARTS HERE ---------
  135.  
  136. seqSet.Clear()
  137. seqSet.AddNum(message.Uid)
  138. item := imap.FormatFlagsOp(imap.AddFlags, true)
  139. flags := []interface{}{imap.SeenFlag}
  140. erro := serverGmail.cliente.UidStore(seqSet, item, flags, nil)
  141. if erro != nil {
  142. panic("error!")
  143. }
  144.  
  145. }
  146.  
  147. }
Add Comment
Please, Sign In to add comment