Guest User

Untitled

a guest
Jan 23rd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "strings"
  9. "time"
  10.  
  11. imap "github.com/emersion/go-imap"
  12. "github.com/emersion/go-imap/client"
  13. "github.com/emersion/go-message/mail"
  14. "github.com/jaytaylor/html2text"
  15. )
  16.  
  17. func Poll() {
  18. //r := rand.New(rand.NewSource(99))
  19. c := time.Tick(10 * time.Second)
  20. for _ = range c {
  21. //Download the current contents of the URL and do something with it
  22. fmt.Printf("Grab at %s\n", time.Now())
  23. // add a bit of jitter
  24. //jitter := time.Duration(r.Int31n(5000)) * time.Millisecond
  25. //time.Sleep(jitter)
  26. doAll()
  27. }
  28. }
  29.  
  30. func doAll() {
  31. var c *client.Client
  32.  
  33. // Connect to server
  34. c, err := client.DialTLS("imap.yandex.ru:993", nil)
  35. //c.SetDebug(os.Stdout)
  36.  
  37. if err != nil {
  38. log.Fatal(err)
  39. }
  40. log.Println("Connected")
  41.  
  42. // Don't forget to logout
  43. defer c.Logout()
  44.  
  45. // Login
  46. if err := c.Login("vadim", "!"); err != nil {
  47. log.Fatal(err)
  48. }
  49. log.Println("Logged in")
  50.  
  51. // Select INBOX
  52. mbox, err := c.Select("INBOX", false)
  53. if err != nil {
  54. log.Fatal(err)
  55. }
  56.  
  57. // Get the last message
  58. if mbox.Messages == 0 {
  59. log.Fatal("No message in mailbox")
  60. }
  61.  
  62. readMsg(c, mbox.Messages)
  63. }
  64.  
  65. func readMsg(c *client.Client, msgID uint32) {
  66. log.Println("read msg:", msgID)
  67. seqSet := new(imap.SeqSet)
  68. seqSet.AddNum(msgID)
  69.  
  70. // Get the whole message body
  71. section := &imap.BodySectionName{}
  72. items := []imap.FetchItem{section.FetchItem()}
  73.  
  74. messages := make(chan *imap.Message, 1)
  75. //go func() {
  76. if err := c.Fetch(seqSet, items, messages); err != nil {
  77. log.Fatal(err)
  78. }
  79. //}()
  80.  
  81. msg := <-messages
  82. if msg == nil {
  83. log.Fatal("Server didn't returned message")
  84. }
  85.  
  86. r := msg.GetBody(section)
  87. if r == nil {
  88. log.Fatal("Server didn't returned message body")
  89. }
  90.  
  91. // Create a new mail reader
  92. mr, err := mail.CreateReader(r)
  93. if err != nil {
  94. log.Fatal(err)
  95. }
  96.  
  97. // Print some info about the message
  98. header := mr.Header
  99. if date, err := header.Date(); err == nil {
  100. log.Println("Date:", date)
  101. }
  102. if from, err := header.AddressList("From"); err == nil {
  103. log.Println("From:", from)
  104. }
  105. if to, err := header.AddressList("To"); err == nil {
  106. log.Println("To:", to)
  107. }
  108. if subject, err := header.Subject(); err == nil {
  109. log.Println("Subject:", subject)
  110. }
  111.  
  112. text := ""
  113. bodyText := ""
  114. bodyHtml := ""
  115. // Process each message's part
  116. for {
  117. p, err := mr.NextPart()
  118. if err == io.EOF {
  119. break
  120. } else if err != nil {
  121. log.Fatal(err)
  122. }
  123.  
  124. switch h := p.Header.(type) {
  125. case mail.TextHeader:
  126. b, _ := ioutil.ReadAll(p.Body)
  127. text += string(b)
  128. if strings.HasPrefix(p.Header.Get("Content-Type"), "text/plain") {
  129. bodyText += string(b)
  130. }
  131. if strings.HasPrefix(p.Header.Get("Content-Type"), "text/html") {
  132. bodyHtml += string(b)
  133. }
  134. case mail.AttachmentHeader:
  135. // This is an attachment
  136. filename, _ := h.Filename()
  137. log.Println("Got attachment: %v", filename)
  138. }
  139. }
  140. if bodyText != "" {
  141. text = bodyText
  142. }
  143. if bodyText == "" && bodyHtml != "" {
  144. t, err := html2text.FromString(bodyHtml, html2text.Options{PrettyTables: false})
  145. if err != nil {
  146. panic(err)
  147. }
  148. text = t
  149. }
  150. log.Println("Text:\n", text)
  151. }
  152.  
  153. func main() {
  154. Poll()
  155. }
Add Comment
Please, Sign In to add comment