golang解析MIME数据格式的代码示例

本文 http://blog.codeg.cn/2015/01/23/mime-golang-parsing/ 是作者zieckey在研究和学习相关内容时所做的笔记,欢迎广大朋友指正和交流! 版权所有,欢迎转载和分享,但请保留此段声明。

MIME格式

MIME是multipurpose Internet mail extensions 的缩写。它是一种协议,可使电子邮件除包含一般纯文本以外,还可加上彩色图片、视频、声音或二进位格式的文件。它要求邮件的发送端和接收端必须有解读MIME协议的电子邮件程序。

本文介绍了如何使用golang来解析MIME以及multipart格式的数据。并给出了详细的示例代码。

MIME格式示例数据

请点击 resources/example.mime.txt

完整解析代码请参考:https://github.com/zieckey/gohello/tree/master/mime

解析boundary

使用net/textproto.Reader来解析。示例代码如下:

// 从textproto.Reader读取数据
func (m *MHtml) GetBoundary(r *textproto.Reader) string {
	// 先调用ReadMIMEHeader来解析MIME的头信息
	mimeHeader, err := r.ReadMIMEHeader()
	if err != nil {
		return ""
	}

	// 然后得到 "Content-Type"
	fmt.Printf("%v %v\n", mimeHeader, err)
	contentType := mimeHeader.Get("Content-Type")
	fmt.Printf("Content-Type = %v %v\n", contentType)

	// 再然后,调用 mime.ParseMediaType 来解析 "Content-Type"
	mediatype, params, err := mime.ParseMediaType(contentType)
	fmt.Printf("mediatype=%v,  params=%v %v, err=%v\n", mediatype, len(params), params, err)

	// 最最后,得到 boundary
	boundary := params["boundary"]
	fmt.Printf("boundary=%v\n", boundary)
	return boundary
}

解析正文

使用mime/multipart.Reader来解析multipart格式的正文

	mr := multipart.NewReader(br, boundary)
	for {
		part, err := mr.NextPart()
		if err != nil {
			break
		}

		d := make([]byte, len(mht))
		n, err := part.Read(d)
		if err != nil && err != io.EOF {
			return err
		}
		d = d[:n]
		fmt.Printf("filename=%v formname=%v n=%v err=%v content=\n", part.FileName(), part.FormName(), n, err)
		contentType := part.Header["Content-Type"]
		if len(contentType) == 0 {
			continue
		}
		fmt.Printf("Content-Type=%v\n", contentType[0])
		if contentType[0] == "text/html" {
			m.Html = string(d)
			break
		}
	}

参考

http://godoc.org/mime http://godoc.org/net/textproto