Files
contact/cmd/recv/main.go
2026-02-23 22:59:40 -07:00

84 lines
2.1 KiB
Go
Executable File

package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/mail"
"os"
"strings"
"time"
"gitea.inhome.blapointe.com/local-sandbox/contact"
"gitea.inhome.blapointe.com/local/args"
)
func main() {
emailer := contact.NewEmailer()
as := args.NewArgSet()
as.Append(args.STRING, "imap", "imap server:port", "imap.gmail.com:993")
as.Append(args.STRING, "pop3", "pop3 server:port", "")
as.Append(args.INT, "n", "limit (<1 for inf)", 10)
as.Append(args.STRING, "u", "username", emailer.From)
as.Append(args.STRING, "p", "password", emailer.Password)
as.Append(args.INT, "b", "dont read more than this many characters", 4096)
as.Append(args.BOOL, "json", "output as json", false)
as.Append(args.STRING, "oauth", "", emailer.OAuth)
if err := as.Parse(); err != nil {
panic(err)
}
emailer.IMAP = as.Get("imap").GetString()
emailer.POP3 = as.Get("pop3").GetString()
emailer.Limit = as.Get("n").GetInt()
emailer.From = as.GetString("u")
emailer.Password = as.GetString("p")
emailer.OAuth = as.GetString("oauth")
var msgs <-chan *mail.Message
var err error
if emailer.POP3 != "" {
msgs, err = emailer.ReadPOP3()
} else {
msgs, err = emailer.Read()
}
if err != nil {
panic(err)
}
emails := make([]map[string]any, 0, emailer.Limit)
for msg := range msgs {
b, _ := ioutil.ReadAll(io.LimitReader(msg.Body, int64(as.GetInt("b"))))
s := strings.ReplaceAll(string(b), "\r\n", "\n")
s = strings.ReplaceAll(string(s), "\n", "\n")
s = strings.ReplaceAll(string(s), "\r", "\n")
if !strings.Contains(s, " ") {
s = "..."
}
d, _ := msg.Header.Date()
d = d.In(time.Local)
if as.GetBool("json") {
emails = append(emails, map[string]any{
"t": d.Format("06-01-02T15:04Z07"),
"from": msg.Header.Get("From"),
"subject": msg.Header.Get("Subject"),
"body": s,
})
} else {
fmt.Printf(
"@%+v @%+v: \n\t%+v: \n\t%s\n",
d.Format("06-01-02T15:04Z07"),
msg.Header.Get("From"),
msg.Header.Get("Subject"),
s,
)
}
}
if as.GetBool("json") {
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
enc.Encode(emails)
}
}