Skip to content

Instantly share code, notes, and snippets.

@tkrajina
Created November 16, 2016 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkrajina/d505a64c59f493ffd23b3b8fadf8ee82 to your computer and use it in GitHub Desktop.
Save tkrajina/d505a64c59f493ffd23b3b8fadf8ee82 to your computer and use it in GitHub Desktop.
Extract email attachments
package main
import (
"bufio"
"encoding/base64"
"flag"
"fmt"
"io"
"io/ioutil"
"mime"
"mime/multipart"
"net/mail"
"os"
"strings"
)
func main() {
flag.Parse()
files := flag.Args()
for _, file := range files {
extractFiles(file)
}
}
func panicIfErr(err error, msg string) {
if err != nil {
panic(msg + ":" + err.Error())
}
}
func extractFiles(filename string) {
f, err := os.Open(filename)
panicIfErr(err, "Cannot open file "+filename)
msg, err := mail.ReadMessage(f)
panicIfErr(err, "Cannor read file "+filename)
mediaType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
panicIfErr(err, "Cannot parse media type")
if !strings.HasPrefix(mediaType, "multipart/") {
fmt.Println("Not a multipart message " + filename)
return
}
mr := multipart.NewReader(msg.Body, params["boundary"])
for {
p, err := mr.NextPart()
if err == io.EOF {
return
}
panicIfErr(err, "Cannot read next part")
fmt.Println(p.FileName())
if len(p.FileName()) > 0 {
slurp, err := ioutil.ReadAll(p)
panicIfErr(err, "Cannot read "+filename)
reader := bufio.NewReader(os.Stdin)
fmt.Printf("Write %d bytes to %s: [y/N]", len(slurp), p.FileName())
text, _ := reader.ReadString('\n')
text = strings.ToLower(strings.TrimSpace(text))
if text == "y" {
writeFile(p.FileName(), slurp)
}
}
}
}
func writeFile(filename string, bytes []byte) {
f, err := os.Create(filename)
panicIfErr(err, "Cannot write to "+filename)
data, err := base64.StdEncoding.DecodeString(string(bytes))
panicIfErr(err, "Cannot base64 decode")
fmt.Printf("%q\n", data)
_, err = f.Write(data)
panicIfErr(err, "Cannot write to "+filename)
fmt.Printf("Written to %s\n", filename)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment