Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "strings"
- "time"
- imap "github.com/emersion/go-imap"
- "github.com/emersion/go-imap/client"
- "github.com/emersion/go-message/mail"
- "github.com/jaytaylor/html2text"
- )
- func Poll() {
- //r := rand.New(rand.NewSource(99))
- c := time.Tick(10 * time.Second)
- for _ = range c {
- //Download the current contents of the URL and do something with it
- fmt.Printf("Grab at %s\n", time.Now())
- // add a bit of jitter
- //jitter := time.Duration(r.Int31n(5000)) * time.Millisecond
- //time.Sleep(jitter)
- doAll()
- }
- }
- func doAll() {
- var c *client.Client
- // Connect to server
- c, err := client.DialTLS("imap.yandex.ru:993", nil)
- //c.SetDebug(os.Stdout)
- if err != nil {
- log.Fatal(err)
- }
- log.Println("Connected")
- // Don't forget to logout
- defer c.Logout()
- // Login
- if err := c.Login("vadim", "!"); err != nil {
- log.Fatal(err)
- }
- log.Println("Logged in")
- // Select INBOX
- mbox, err := c.Select("INBOX", false)
- if err != nil {
- log.Fatal(err)
- }
- // Get the last message
- if mbox.Messages == 0 {
- log.Fatal("No message in mailbox")
- }
- readMsg(c, mbox.Messages)
- }
- func readMsg(c *client.Client, msgID uint32) {
- log.Println("read msg:", msgID)
- seqSet := new(imap.SeqSet)
- seqSet.AddNum(msgID)
- // Get the whole message body
- section := &imap.BodySectionName{}
- items := []imap.FetchItem{section.FetchItem()}
- messages := make(chan *imap.Message, 1)
- //go func() {
- if err := c.Fetch(seqSet, items, messages); err != nil {
- log.Fatal(err)
- }
- //}()
- msg := <-messages
- if msg == nil {
- log.Fatal("Server didn't returned message")
- }
- r := msg.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)
- }
- text := ""
- bodyText := ""
- bodyHtml := ""
- // Process each message's part
- for {
- p, err := mr.NextPart()
- if err == io.EOF {
- break
- } else if err != nil {
- log.Fatal(err)
- }
- switch h := p.Header.(type) {
- case mail.TextHeader:
- b, _ := ioutil.ReadAll(p.Body)
- text += string(b)
- if strings.HasPrefix(p.Header.Get("Content-Type"), "text/plain") {
- bodyText += string(b)
- }
- if strings.HasPrefix(p.Header.Get("Content-Type"), "text/html") {
- bodyHtml += string(b)
- }
- case mail.AttachmentHeader:
- // This is an attachment
- filename, _ := h.Filename()
- log.Println("Got attachment: %v", filename)
- }
- }
- if bodyText != "" {
- text = bodyText
- }
- if bodyText == "" && bodyHtml != "" {
- t, err := html2text.FromString(bodyHtml, html2text.Options{PrettyTables: false})
- if err != nil {
- panic(err)
- }
- text = t
- }
- log.Println("Text:\n", text)
- }
- func main() {
- Poll()
- }
Add Comment
Please, Sign In to add comment