2021-01-26 07:16:53 +01:00
|
|
|
package mstore
|
|
|
|
|
|
|
|
import (
|
2021-01-27 10:07:31 +01:00
|
|
|
"fmt"
|
2021-01-27 15:01:42 +01:00
|
|
|
"time"
|
2021-01-27 10:07:31 +01:00
|
|
|
|
|
|
|
"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
|
|
|
|
}
|
2021-01-27 15:01:42 +01:00
|
|
|
|
|
|
|
func (es *EMailStore) Append(mbox string, msg imap.Literal) error {
|
|
|
|
return es.imap.Append(mbox, nil, time.Time{}, msg)
|
|
|
|
}
|