fix pop3 fetching, limit recv to N bytes

master
Bel LaPointe 2023-10-16 08:47:16 -06:00
parent 6b04a324f3
commit 7d372adb78
2 changed files with 23 additions and 13 deletions

View File

@ -20,6 +20,7 @@ func main() {
as.Append(args.INT, "n", "limit (<1 for inf)", 10) as.Append(args.INT, "n", "limit (<1 for inf)", 10)
as.Append(args.STRING, "u", "username", emailer.From) as.Append(args.STRING, "u", "username", emailer.From)
as.Append(args.STRING, "p", "password", emailer.Password) as.Append(args.STRING, "p", "password", emailer.Password)
as.Append(args.INT, "b", "dont read more than this many characters", 4096)
if err := as.Parse(); err != nil { if err := as.Parse(); err != nil {
panic(err) panic(err)
} }
@ -42,17 +43,17 @@ func main() {
panic(err) panic(err)
} }
for msg := range msgs { for msg := range msgs {
b, _ := ioutil.ReadAll(io.LimitReader(msg.Body, 1024)) b, _ := ioutil.ReadAll(io.LimitReader(msg.Body, int64(as.GetInt("b"))))
s := strings.ReplaceAll(string(b), "\r\n", " ") s := strings.ReplaceAll(string(b), "\r\n", "\n")
s = strings.ReplaceAll(string(s), "\n", " ") s = strings.ReplaceAll(string(s), "\n", "\n")
s = strings.ReplaceAll(string(s), "\r", " ") s = strings.ReplaceAll(string(s), "\r", "\n")
if !strings.Contains(s, " ") { if !strings.Contains(s, " ") {
s = "..." s = "..."
} }
d, _ := msg.Header.Date() d, _ := msg.Header.Date()
d = d.In(time.Local) d = d.In(time.Local)
fmt.Printf( fmt.Printf(
"@%+v @%+v: %+v: %s\n", "@%+v @%+v: \n\t%+v: \n\t%s\n",
d.Format("06-01-02T15:04Z07"), d.Format("06-01-02T15:04Z07"),
msg.Header.Get("From"), msg.Header.Get("From"),
msg.Header.Get("Subject"), msg.Header.Get("Subject"),

View File

@ -86,23 +86,29 @@ func (e *Emailer) ReadIMAP() (chan *mail.Message, error) {
} }
func (e *Emailer) ReadPOP3() (chan *mail.Message, error) { func (e *Emailer) ReadPOP3() (chan *mail.Message, error) {
emails := []*mail.Message{} limit := e.Limit
if limit < 1 {
limit = 1000
}
emails := make(chan *mail.Message, limit)
defer close(emails)
c, err := pop3.DialTLS(e.POP3) c, err := pop3.DialTLS(e.POP3)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer c.Rset() defer c.Rset()
if err := c.Auth(e.From, e.Password); err != nil { if err := c.Auth(e.From, e.Password); err != nil {
return nil, err return nil, err
} }
ids, _, err := c.ListAll() ids, _, err := c.ListAll()
if err != nil { if err != nil {
return nil, err return nil, err
} }
for j, id := range ids {
if e.Limit > 0 && len(ids)-1-j >= e.Limit { for _, id := range ids {
break
}
raw, err := c.Retr(id) raw, err := c.Retr(id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -111,10 +117,13 @@ func (e *Emailer) ReadPOP3() (chan *mail.Message, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
emails = append(emails, msg) select {
case emails <- msg:
default:
break
}
} }
return nil, nil return emails, nil
//return emails, nil //c.Quit()
} }
func (e *Emailer) Send(to, subj, msg string) error { func (e *Emailer) Send(to, subj, msg string) error {