Skip to content

Instantly share code, notes, and snippets.

@recoilme
Created January 22, 2019 15:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save recoilme/a574385519220713b9ae060ab306a330 to your computer and use it in GitHub Desktop.
Save recoilme/a574385519220713b9ae060ab306a330 to your computer and use it in GitHub Desktop.
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()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment