gte/pkg/mstore/email.go

104 lines
1.9 KiB
Go
Raw Normal View History

2021-01-26 07:16:53 +01:00
package mstore
import (
2021-01-27 10:07:31 +01:00
"fmt"
"github.com/emersion/go-imap"
2021-01-26 07:16:53 +01:00
"github.com/emersion/go-imap/client"
)
type EMailStoreConfiguration struct {
IMAPURL string
IMAPUsername string
IMAPPassword string
}
2021-01-27 10:07:31 +01:00
func (esc *EMailStoreConfiguration) Valid() bool {
2021-01-27 12:58:43 +01:00
if esc.IMAPURL == "" {
2021-01-27 10:07:31 +01:00
return false
}
if esc.IMAPUsername == "" || esc.IMAPPassword == "" {
return false
}
return true
}
2021-01-27 12:58:43 +01:00
type smtpConf struct {
url string
to string
}
2021-01-26 07:16:53 +01:00
type EMailStore struct {
2021-01-27 12:58:43 +01:00
imap *client.Client
2021-01-26 07:16:53 +01:00
}
2021-01-27 10:07:31 +01:00
func EMailConnect(conf *EMailStoreConfiguration) (*EMailStore, error) {
2021-01-27 12:58:43 +01:00
imap, err := client.DialTLS(conf.IMAPURL, nil)
2021-01-27 10:07:31 +01:00
if err != nil {
return &EMailStore{}, err
}
2021-01-27 12:58:43 +01:00
if err := imap.Login(conf.IMAPUsername, conf.IMAPPassword); err != nil {
2021-01-27 10:07:31 +01:00
return &EMailStore{}, err
}
return &EMailStore{
2021-01-27 12:58:43 +01:00
imap: imap,
2021-01-27 10:07:31 +01:00
}, nil
}
2021-01-27 12:58:43 +01:00
func (es *EMailStore) Disconnect() {
es.imap.Logout()
2021-01-27 10:07:31 +01:00
}
2021-01-27 12:58:43 +01:00
func (es *EMailStore) Folders() ([]*Folder, error) {
2021-01-27 10:07:31 +01:00
boxes, done := make(chan *imap.MailboxInfo), make(chan error)
go func() {
2021-01-27 12:58:43 +01:00
done <- es.imap.List("", "*", boxes)
2021-01-27 10:07:31 +01:00
}()
folders := []*Folder{}
for b := range boxes {
folders = append(folders, &Folder{
Name: b.Name,
})
}
if err := <-done; err != nil {
return []*Folder{}, err
}
2021-01-26 07:16:53 +01:00
2021-01-27 10:07:31 +01:00
return folders, nil
2021-01-26 07:16:53 +01:00
}
2021-01-27 12:58:43 +01:00
func (es *EMailStore) Inbox() ([]*Message, error) {
mbox, err := es.imap.Select("INBOX", false)
if err != nil {
return []*Message{}, err
}
fmt.Println("Flags for INBOX:", mbox.Flags)
fmt.Println("Messages: ", mbox.Messages)
seqset := new(imap.SeqSet)
seqset.AddRange(uint32(1), mbox.Messages)
imsg, done := make(chan *imap.Message), make(chan error)
go func() {
done <- es.imap.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope}, imsg)
}()
messages := []*Message{}
for m := range imsg {
messages = append(messages, &Message{
Subject: m.Envelope.Subject,
})
}
if err := <-done; err != nil {
return []*Message{}, err
}
return messages, nil
}