Created
November 16, 2016 12:43
-
-
Save tkrajina/d505a64c59f493ffd23b3b8fadf8ee82 to your computer and use it in GitHub Desktop.
Extract email attachments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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