sophuwu.site > mailboxxer   
              66
            
             package main

import (
	"encoding/base64"
	"fmt"
	"io"
	"mime"
	"mime/multipart"
	"net/mail"
	"net/textproto"
	"strings"
)

func getfiles(files *map[string][]byte, parts interface{}) {
	var body io.Reader
	var head textproto.MIMEHeader
	switch part := parts.(type) {
	case *mail.Message:
		body = part.Body
		head = textproto.MIMEHeader(part.Header)
	case *multipart.Part:
		body = part
		head = part.Header
	}
	mediaType, params, _ := mime.ParseMediaType(head.Get("Content-Type"))

	if strings.HasPrefix(mediaType, "multipart/") {
		mr := multipart.NewReader(body, params["boundary"])
		var part *multipart.Part
		var err error
		for {
			if part, err = mr.NextPart(); err != nil {
				break
			}
			getfiles(files, part)
			part.Close()
		}
		return
	}
	content, _ := io.ReadAll(body)
	if head.Get("Content-Transfer-Encoding") == "base64" {
		content, _ = base64.StdEncoding.DecodeString(string(content))
	}
	if len(content) == 0 {
		return
	}
	name := params["name"]
	if strings.HasPrefix(mediaType, "text/") || strings.HasPrefix(mediaType, "message/") {
		name = "body.txt"
		if strings.Contains(mediaType, "html") {
			name = "index.html"
		}
	}
	(*files)[name] = append((*files)[name], content...)
}

func EmlFiles(eml *mail.Message) map[string][]byte {
	s := ""
	for k := range eml.Header {
		s += fmt.Sprintf("%s: %s\n", k, eml.Header.Get(k))
	}
	files := make(map[string][]byte)
	files["header.txt"] = []byte(s)
	getfiles(&files, eml)
	return files
}