gte/pkg/mstore/email.go

142 lines
2.7 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"
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"
)
2021-01-28 09:40:08 +01:00
type EmailConfiguration struct {
2021-01-26 07:16:53 +01:00
IMAPURL string
IMAPUsername string
IMAPPassword string
}
2021-01-28 09:40:08 +01:00
func (esc *EmailConfiguration) 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-28 09:40:08 +01:00
type Email struct {
imap *client.Client
mboxStatus *imap.MailboxStatus
2021-01-27 12:58:43 +01:00
}
2021-01-28 09:40:08 +01:00
func EmailConnect(conf *EmailConfiguration) (*Email, 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 {
2021-01-28 09:40:08 +01:00
return &Email{}, err
2021-01-27 10:07:31 +01:00
}
2021-01-27 12:58:43 +01:00
if err := imap.Login(conf.IMAPUsername, conf.IMAPPassword); err != nil {
2021-01-28 09:40:08 +01:00
return &Email{}, err
2021-01-27 10:07:31 +01:00
}
2021-01-28 09:40:08 +01:00
return &Email{
2021-01-27 12:58:43 +01:00
imap: imap,
2021-01-27 10:07:31 +01:00
}, nil
}
2021-01-28 09:40:08 +01:00
func (es *Email) Disconnect() {
2021-01-27 12:58:43 +01:00
es.imap.Logout()
2021-01-27 10:07:31 +01:00
}
2021-01-28 09:40:08 +01:00
func (es *Email) FolderNames() ([]string, 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
}()
2021-01-28 09:40:08 +01:00
folders := []string{}
2021-01-27 10:07:31 +01:00
for b := range boxes {
2021-01-28 09:40:08 +01:00
folders = append(folders, b.Name)
2021-01-27 10:07:31 +01:00
}
if err := <-done; err != nil {
2021-01-28 09:40:08 +01:00
return []string{}, err
2021-01-27 10:07:31 +01:00
}
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
2021-01-28 09:40:08 +01:00
func (es *Email) Select(folder string) error {
status, err := es.imap.Select(folder, false)
2021-01-27 12:58:43 +01:00
if err != nil {
2021-01-28 09:40:08 +01:00
return err
2021-01-27 12:58:43 +01:00
}
2021-01-28 09:40:08 +01:00
fmt.Printf("status: %+v\n", status)
2021-01-27 12:58:43 +01:00
2021-01-28 09:40:08 +01:00
es.mboxStatus = status
return nil
}
func (es *Email) Messages() ([]*Message, error) {
if es.mboxStatus == nil {
return []*Message{}, fmt.Errorf("no mailbox selected")
}
2021-01-27 12:58:43 +01:00
2021-01-28 14:43:00 +01:00
if es.mboxStatus.Messages == 0 {
return []*Message{}, nil
}
2021-01-27 12:58:43 +01:00
seqset := new(imap.SeqSet)
2021-01-28 09:40:08 +01:00
seqset.AddRange(uint32(1), es.mboxStatus.Messages)
2021-01-27 12:58:43 +01:00
imsg, done := make(chan *imap.Message), make(chan error)
go func() {
2021-01-28 09:40:08 +01:00
done <- es.imap.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, imap.FetchUid}, imsg)
2021-01-27 12:58:43 +01:00
}()
messages := []*Message{}
for m := range imsg {
2021-01-28 09:40:08 +01:00
//fmt.Printf("%+v\n", m)
2021-01-27 12:58:43 +01:00
messages = append(messages, &Message{
2021-01-28 14:43:00 +01:00
Uid: m.Uid,
2021-01-27 12:58:43 +01:00
Subject: m.Envelope.Subject,
})
}
if err := <-done; err != nil {
return []*Message{}, err
}
return messages, nil
}
2021-01-27 15:01:42 +01:00
2021-01-28 09:40:08 +01:00
func (es *Email) Append(mbox string, msg imap.Literal) error {
2021-01-27 15:01:42 +01:00
return es.imap.Append(mbox, nil, time.Time{}, msg)
}
2021-01-28 09:40:08 +01:00
2021-01-28 14:43:00 +01:00
func (es *Email) Remove(uid uint32) error {
if uid == 0 {
return fmt.Errorf("invalid uid: %d", uid)
}
2021-01-28 09:40:08 +01:00
if es.mboxStatus == nil {
return fmt.Errorf("no mailbox selected")
}
// set deleted flag
seqset := new(imap.SeqSet)
2021-01-28 14:43:00 +01:00
seqset.AddRange(uid, uid)
2021-01-28 09:40:08 +01:00
storeItem := imap.FormatFlagsOp(imap.SetFlags, true)
err := es.imap.UidStore(seqset, storeItem, imap.FormatStringList([]string{imap.DeletedFlag}), nil)
if err != nil {
return err
}
// expunge box
if err := es.imap.Expunge(nil); err != nil {
return err
}
return nil
}