email/cmd/headers/headers.go
Bill Thiede 2f6b083f47 Header import, and dumporiginal extensions.
Add ability to dump headers or mimetypes for original messages.
Add ability to dump all messages, instead of just hashes listed.
Add new command  cmd/headers to import all headers from messages in table
    original.  Utility can work incrementally or do fully table imports.
Moved 'fetch all original messages' code to db/util.go.  Added conditional
version given table name that will only return original messages that do not
    have matching hashes in the specified table.
2014-04-01 23:18:12 -07:00

64 lines
1.1 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", hash)
return c.InsertHeaders(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 {
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)
}
}