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.
64 lines
1.1 KiB
Go
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)
|
|
}
|
|
|
|
}
|