deleting a message
This commit is contained in:
parent
13ef0f903d
commit
020e4dde84
|
@ -8,7 +8,6 @@ import (
|
|||
"strings"
|
||||
|
||||
"git.sr.ht/~ewintr/gte/pkg/mstore"
|
||||
"github.com/emersion/go-imap"
|
||||
)
|
||||
|
||||
type Body struct {
|
||||
|
@ -32,7 +31,7 @@ func (b *Body) Len() int {
|
|||
}
|
||||
|
||||
func main() {
|
||||
config := &mstore.EMailStoreConfiguration{
|
||||
config := &mstore.EmailConfiguration{
|
||||
IMAPURL: os.Getenv("IMAP_URL"),
|
||||
IMAPUsername: os.Getenv("IMAP_USERNAME"),
|
||||
IMAPPassword: os.Getenv("IMAP_PASSWORD"),
|
||||
|
@ -43,30 +42,43 @@ func main() {
|
|||
}
|
||||
//fmt.Printf("conf: %+v\n", config)
|
||||
|
||||
mailStore, err := mstore.EMailConnect(config)
|
||||
mailStore, err := mstore.EmailConnect(config)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer mailStore.Disconnect()
|
||||
|
||||
folders, err := mailStore.Folders()
|
||||
/*
|
||||
folders, err := mailStore.FolderNames()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, f := range folders {
|
||||
fmt.Println(f.Name)
|
||||
fmt.Println(f)
|
||||
}
|
||||
*/
|
||||
|
||||
if err := mailStore.Select("Today"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
/*
|
||||
messages, err := mailStore.Inbox()
|
||||
messages, err := mailStore.Messages()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, m := range messages {
|
||||
fmt.Println(m.Subject)
|
||||
fmt.Printf("%d: %s\n", m.ID, m.Subject)
|
||||
}
|
||||
if len(messages) == 0 {
|
||||
log.Fatal("no messages")
|
||||
return
|
||||
}
|
||||
*/
|
||||
|
||||
if err := mailStore.Remove(messages[0].ID); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
/*
|
||||
body := NewBody(`From: todo <process@erikwinter.nl>
|
||||
Subject: the subject
|
||||
|
||||
|
@ -75,4 +87,5 @@ And here comes the body`)
|
|||
if err := mailStore.Append("INBOX", imap.Literal(body)); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -8,13 +8,13 @@ import (
|
|||
"github.com/emersion/go-imap/client"
|
||||
)
|
||||
|
||||
type EMailStoreConfiguration struct {
|
||||
type EmailConfiguration struct {
|
||||
IMAPURL string
|
||||
IMAPUsername string
|
||||
IMAPPassword string
|
||||
}
|
||||
|
||||
func (esc *EMailStoreConfiguration) Valid() bool {
|
||||
func (esc *EmailConfiguration) Valid() bool {
|
||||
if esc.IMAPURL == "" {
|
||||
return false
|
||||
}
|
||||
|
@ -25,73 +25,77 @@ func (esc *EMailStoreConfiguration) Valid() bool {
|
|||
return true
|
||||
}
|
||||
|
||||
type smtpConf struct {
|
||||
url string
|
||||
to string
|
||||
}
|
||||
|
||||
type EMailStore struct {
|
||||
type Email struct {
|
||||
imap *client.Client
|
||||
mboxStatus *imap.MailboxStatus
|
||||
}
|
||||
|
||||
func EMailConnect(conf *EMailStoreConfiguration) (*EMailStore, error) {
|
||||
func EmailConnect(conf *EmailConfiguration) (*Email, error) {
|
||||
imap, err := client.DialTLS(conf.IMAPURL, nil)
|
||||
if err != nil {
|
||||
return &EMailStore{}, err
|
||||
return &Email{}, err
|
||||
}
|
||||
if err := imap.Login(conf.IMAPUsername, conf.IMAPPassword); err != nil {
|
||||
return &EMailStore{}, err
|
||||
return &Email{}, err
|
||||
}
|
||||
|
||||
return &EMailStore{
|
||||
return &Email{
|
||||
imap: imap,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (es *EMailStore) Disconnect() {
|
||||
func (es *Email) Disconnect() {
|
||||
es.imap.Logout()
|
||||
}
|
||||
|
||||
func (es *EMailStore) Folders() ([]*Folder, error) {
|
||||
func (es *Email) FolderNames() ([]string, error) {
|
||||
boxes, done := make(chan *imap.MailboxInfo), make(chan error)
|
||||
go func() {
|
||||
done <- es.imap.List("", "*", boxes)
|
||||
}()
|
||||
|
||||
folders := []*Folder{}
|
||||
folders := []string{}
|
||||
for b := range boxes {
|
||||
folders = append(folders, &Folder{
|
||||
Name: b.Name,
|
||||
})
|
||||
folders = append(folders, b.Name)
|
||||
}
|
||||
|
||||
if err := <-done; err != nil {
|
||||
return []*Folder{}, err
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
return folders, nil
|
||||
}
|
||||
|
||||
func (es *EMailStore) Inbox() ([]*Message, error) {
|
||||
mbox, err := es.imap.Select("INBOX", false)
|
||||
func (es *Email) Select(folder string) error {
|
||||
status, err := es.imap.Select(folder, false)
|
||||
if err != nil {
|
||||
return []*Message{}, err
|
||||
return err
|
||||
}
|
||||
fmt.Println("Flags for INBOX:", mbox.Flags)
|
||||
fmt.Printf("status: %+v\n", status)
|
||||
|
||||
fmt.Println("Messages: ", mbox.Messages)
|
||||
es.mboxStatus = status
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (es *Email) Messages() ([]*Message, error) {
|
||||
if es.mboxStatus == nil {
|
||||
return []*Message{}, fmt.Errorf("no mailbox selected")
|
||||
}
|
||||
|
||||
seqset := new(imap.SeqSet)
|
||||
seqset.AddRange(uint32(1), mbox.Messages)
|
||||
seqset.AddRange(uint32(1), es.mboxStatus.Messages)
|
||||
|
||||
imsg, done := make(chan *imap.Message), make(chan error)
|
||||
go func() {
|
||||
done <- es.imap.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope}, imsg)
|
||||
done <- es.imap.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, imap.FetchUid}, imsg)
|
||||
}()
|
||||
|
||||
messages := []*Message{}
|
||||
for m := range imsg {
|
||||
//fmt.Printf("%+v\n", m)
|
||||
messages = append(messages, &Message{
|
||||
ID: m.Uid,
|
||||
Subject: m.Envelope.Subject,
|
||||
})
|
||||
}
|
||||
|
@ -103,6 +107,28 @@ func (es *EMailStore) Inbox() ([]*Message, error) {
|
|||
return messages, nil
|
||||
}
|
||||
|
||||
func (es *EMailStore) Append(mbox string, msg imap.Literal) error {
|
||||
func (es *Email) Append(mbox string, msg imap.Literal) error {
|
||||
return es.imap.Append(mbox, nil, time.Time{}, msg)
|
||||
}
|
||||
|
||||
func (es *Email) Remove(id uint32) error {
|
||||
if es.mboxStatus == nil {
|
||||
return fmt.Errorf("no mailbox selected")
|
||||
}
|
||||
|
||||
// set deleted flag
|
||||
seqset := new(imap.SeqSet)
|
||||
seqset.AddRange(id, id)
|
||||
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
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package mstore
|
||||
|
||||
type Memory struct {
|
||||
messages map[*Folder][]*Message
|
||||
}
|
|
@ -2,17 +2,19 @@ package mstore
|
|||
|
||||
type Folder struct {
|
||||
Name string
|
||||
Version uint32
|
||||
}
|
||||
|
||||
type Message struct {
|
||||
ID uint32
|
||||
Subject string
|
||||
Body string
|
||||
}
|
||||
|
||||
type MStorer interface {
|
||||
Folders() ([]*Folder, error)
|
||||
Messages(folder Folder) ([]Message, error)
|
||||
Move(message Message, folder Folder) error
|
||||
Update(message Message) error
|
||||
Add(message Message) error
|
||||
Folders() ([]string, error)
|
||||
Select(folder string) error
|
||||
Messages() ([]*Message, error)
|
||||
Add(message *Message) error
|
||||
Remove(id string) error
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue