// ParseMIME reads a MIME document from the provided reader and parses it into // tree of MIMEPart objects. func ParseMIME(reader *bufio.Reader) (MIMEPart, error) { tr := textproto.NewReader(reader) header, err := tr.ReadMIMEHeader() if err != nil { if !strings.HasPrefix(err.Error(), "malformed MIME header") { return nil, err } } mediatype, params, err := mime.ParseMediaType(header.Get("Content-Type")) if err != nil && mime.IsOkPMTError(err) != nil { return nil, err } root := &memMIMEPart{header: header, contentType: mediatype} if strings.HasPrefix(mediatype, "multipart/") { boundary := params["boundary"] err = parseParts(root, reader, boundary) if err != nil { return nil, err } } else { // Content is text or data, decode it content, err := decodeSection(header.Get("Content-Transfer-Encoding"), reader) if err != nil { return nil, err } root.content = content } return root, nil }
func (bp *Part) populateHeaders() error { r := textproto.NewReader(bp.mr.bufReader) header, err := r.ReadMIMEHeader() bp.Header = header return err }