-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.go
116 lines (96 loc) · 2.68 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"fmt"
"io"
"log"
"github.com/emersion/go-imap/v2"
"github.com/emersion/go-imap/v2/imapclient"
)
func getClient(email, password, server string) (*imapclient.Client, error) {
c, err := imapclient.DialTLS(server, nil)
if err != nil {
log.Fatalf("failed to dial IMAP server: %v", err)
return nil, err
}
if err := c.Login(email, password).Wait(); err != nil {
log.Fatalf("failed to login: %v", err)
return nil, err
}
return c, nil
}
// func getMailBoxes(c *imapclient.Client) ([]*imap.ListData, error) {
// mailboxes, err := c.List("", "%", nil).Collect()
// if err != nil {
// log.Fatalf("failed to list mailboxes: %v", err)
// return nil, err
// }
// log.Printf("Found %v mailboxes", len(mailboxes))
// return mailboxes, nil
// // for _, mbox := range mailboxes {
// // log.Printf(" - %v", mbox.Mailbox)
// // }
// }
func search(c *imapclient.Client, query *imap.SearchCriteria) ([]imap.UID, error) {
data, err := c.UIDSearch(query, nil).Wait()
if err != nil {
log.Fatalf("UID SEARCH command failed: %v", err)
return nil, err
}
// log.Fatalf("UIDs matching the search criteria: %v", data.AllUIDs())
return data.AllUIDs(), nil
}
func selectMailBox(c *imapclient.Client, mbox string) {
selectedMbox, err := c.Select(mbox, nil).Wait()
if err != nil {
log.Fatalf("failed to select %s: %v", mbox, err)
}
log.Printf("%s contains %v messages", mbox, selectedMbox.NumMessages)
}
type OnMessage func(uid imap.UID, subject string, message string) error
func iterateOverMessages(c *imapclient.Client, uids []imap.UID, onMessage OnMessage) error {
seqset := imap.UIDSetNum(uids...)
fetchOptions := &imap.FetchOptions{
UID: true,
Envelope: true,
BodySection: []*imap.FetchItemBodySection{{}},
}
fetchCmd := c.Fetch(seqset, fetchOptions)
defer fetchCmd.Close()
for {
msg := fetchCmd.Next()
if msg == nil {
break
}
var uid imap.UID
var subject string
var message string
for {
item := msg.Next()
if item == nil {
break
}
switch item := item.(type) {
case imapclient.FetchItemDataEnvelope:
log.Printf("Subject: %v", item.Envelope.Subject)
subject = item.Envelope.Subject
case imapclient.FetchItemDataUID:
log.Printf("UID: %v", item.UID)
uid = item.UID
case imapclient.FetchItemDataBodySection:
b, err := io.ReadAll(item.Literal)
if err != nil {
log.Fatalf("failed to read body section: %v", err)
}
message = fmt.Sprintln(string(b))
}
}
if err := onMessage(uid, subject, message); err != nil {
log.Fatalf("failed to process message: %v", err)
return err
}
}
if err := fetchCmd.Close(); err != nil {
log.Fatalf("FETCH command failed: %v", err)
}
return nil
}