Process and normalize some headers that will be used in quickly recalling messages.
102 lines
1.9 KiB
Go
102 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"io"
|
|
"net/mail"
|
|
"xinu.tv/email/db"
|
|
|
|
"github.com/golang/glog"
|
|
)
|
|
|
|
var (
|
|
all = flag.Bool("all", false,
|
|
"extract headers from all messages. Default is to only extract from unprocessed messages.")
|
|
)
|
|
|
|
func insertHeaders(c *db.Conn, hash string, r io.Reader) error {
|
|
msg, err := mail.ReadMessage(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
glog.Infoln("Insert headers", hash)
|
|
return c.InsertHeaders(hash, msg.Header)
|
|
}
|
|
|
|
func insertSearchHeaders(c *db.Conn, hash string, r io.Reader) error {
|
|
msg, err := mail.ReadMessage(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
glog.Infoln("Insert search headers", hash)
|
|
return c.InsertSearchHeaders(hash, msg.Header)
|
|
}
|
|
|
|
func insertAllHeaders(c *db.Conn, all bool) error {
|
|
oCh := make(chan db.Original)
|
|
errc := make(chan error)
|
|
donec := make(chan struct{})
|
|
defer close(donec)
|
|
if all {
|
|
go c.Originals(oCh, errc, donec)
|
|
} else {
|
|
go c.OriginalsNotInTable("header", oCh, errc, donec)
|
|
}
|
|
for {
|
|
select {
|
|
case o := <-oCh:
|
|
r := bytes.NewReader(o.Blob)
|
|
if err := insertHeaders(c, o.Hash, r); err != nil {
|
|
glog.Errorln(o, "insertHeaders", err)
|
|
return err
|
|
}
|
|
case err := <-errc:
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
func insertAllSearchHeaders(c *db.Conn, all bool) error {
|
|
oCh := make(chan db.Original)
|
|
errc := make(chan error)
|
|
donec := make(chan struct{})
|
|
defer close(donec)
|
|
if all {
|
|
go c.Originals(oCh, errc, donec)
|
|
} else {
|
|
go c.OriginalsNotInTable("search_header", oCh, errc, donec)
|
|
}
|
|
for {
|
|
select {
|
|
case o := <-oCh:
|
|
r := bytes.NewReader(o.Blob)
|
|
if err := insertSearchHeaders(c, o.Hash, r); err != nil {
|
|
glog.Errorln(o.Hash, "insertSearchHeaders", err)
|
|
return err
|
|
}
|
|
case err := <-errc:
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
defer glog.Flush()
|
|
flag.Parse()
|
|
|
|
c, err := db.NewConn("")
|
|
if err != nil {
|
|
glog.Fatal(err)
|
|
}
|
|
|
|
if err := insertAllHeaders(c, *all); err != nil {
|
|
glog.Fatal(err)
|
|
}
|
|
|
|
if err := insertAllSearchHeaders(c, *all); err != nil {
|
|
glog.Fatal(err)
|
|
}
|
|
|
|
}
|