enmime

package module
v0.6.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 16, 2015 License: MIT Imports: 22 Imported by: 0

README

enmime Build Status GoDoc

enmime is a MIME parsing library for Go. It's built ontop of Go's included mime/multipart support, but is geared towards parsing MIME encoded emails.

It is being developed in tandem with the Inbucket email service.

API documentation can be found here: http://godoc.org/github.com/jhillyerd/go.enmime

Development Status

enmime is alpha quality: it works but has not been tested with a wide variety of source data, and it's likely the API will evolve some before an official release.

About

enmime is written in Google Go.

enmime is open source software released under the MIT License. The latest version can be found at https://github.com/jhillyerd/go.enmime

Documentation

Overview

Package enmime implements a MIME parsing library for Go. It's built ontop of Go's included mime/multipart support, but is geared towards parsing MIME encoded emails.

The basics:

Calling ParseMIMEBody causes enmime to parse the body of the message object into a tree of MIMEPart objects, each of which is aware of its content type, filename and headers. If the part was encoded in quoted-printable or base64, it is decoded before being stored in the MIMEPart object.

ParseMIMEBody returns a MIMEBody struct. The struct contains both the plain text and HTML portions of the email (if available). The root of the tree, as well as slices of the email's inlines and attachments are available in the struct.

If you need to locate a particular MIMEPart, you can pass a custom MIMEPartMatcher function into BreadthMatchFirst() or DepthMatchFirst() to search the MIMEPart tree. BreadthMatchAll() and DepthMatchAll() will collect all matching parts.

Please note that enmime parses messages into memory, so it is not likely to perform well with multi-gigabyte attachments.

enmime is open source software released under the MIT License. The latest version can be found at https://github.com/jhillyerd/go.enmime

Example
file, _ := os.Open("test-data/mail/qp-utf8-header.raw")
msg, _ := mail.ReadMessage(file)     // Read email using Go's net/mail
mime, _ := enmime.ParseMIMEBody(msg) // Parse message body with enmime

// Headers are in the net/mail Message
fmt.Printf("From: %v\n", msg.Header.Get("From"))

// enmime can decode quoted-printable headers
fmt.Printf("Subject: %v\n", mime.GetHeader("Subject"))

// The plain text body is available as mime.Text
fmt.Printf("Text Body: %v chars\n", len(mime.Text))

// The HTML body is stored in mime.Html
fmt.Printf("HTML Body: %v chars\n", len(mime.Html))

// mime.Inlines is a slice of inlined attacments
fmt.Printf("Inlines: %v\n", len(mime.Inlines))

// mime.Attachments contains the non-inline attachments
fmt.Printf("Attachments: %v\n", len(mime.Attachments))
Output:

From: James Hillyerd <jamehi03@jamehi03lx.noa.com>
Subject: MIME UTF8 Test ¢ More Text
Text Body: 1300 chars
HTML Body: 1736 chars
Inlines: 0
Attachments: 0

Index

Examples

Constants

This section is empty.

Variables

View Source
var AddressHeaders = []string{"From", "To", "Delivered-To", "Cc", "Bcc", "Reply-To"}

Functions

func ConvertToUTF8String added in v0.6.0

func ConvertToUTF8String(charset, text string) (string, error)

func DecodeHeader

func DecodeHeader(input string) string

Decode a MIME header per RFC 2047

func DecodeToUTF8Base64Header added in v0.6.0

func DecodeToUTF8Base64Header(input string) string

Decode a MIME header per RFC 2047 to =?utf-8b?

func IsMultipartMessage

func IsMultipartMessage(mailMsg *mail.Message) bool

IsMultipartMessage returns true if the message has a recognized multipart Content-Type header. You don't need to check this before calling ParseMIMEBody, it can handle non-multipart messages.

func NewMIMEPart

func NewMIMEPart(parent MIMEPart, contentType string) *memMIMEPart

NewMIMEPart creates a new memMIMEPart object. It does not update the parents FirstChild attribute.

Types

type Base64Cleaner

type Base64Cleaner struct {
	// contains filtered or unexported fields
}

Base64Cleaner helps work around bugs in Go's built-in base64 decoder by stripping out whitespace that would cause Go to lose count of things and issue an "illegal base64 data at input byte..." error

func NewBase64Cleaner

func NewBase64Cleaner(r io.Reader) *Base64Cleaner

NewBase64Cleaner returns a Base64Cleaner object for the specified reader. Base64Cleaner implements the io.Reader interface.

func (*Base64Cleaner) Read

func (qp *Base64Cleaner) Read(p []byte) (n int, err error)

Read method for io.Reader interface.

type MIMEBody

type MIMEBody struct {
	Text        string     // The plain text portion of the message
	Html        string     // The HTML portion of the message
	Root        MIMEPart   // The top-level MIMEPart
	Attachments []MIMEPart // All parts having a Content-Disposition of attachment
	Inlines     []MIMEPart // All parts having a Content-Disposition of inline
	OtherParts  []MIMEPart // All parts not in Attachments and Inlines
	// contains filtered or unexported fields
}

MIMEBody is the outer wrapper for MIME messages.

func ParseMIMEBody

func ParseMIMEBody(mailMsg *mail.Message) (*MIMEBody, error)

ParseMIMEBody parses the body of the message object into a tree of MIMEPart objects, each of which is aware of its content type, filename and headers. If the part was encoded in quoted-printable or base64, it is decoded before being stored in the MIMEPart object.

func (*MIMEBody) AddressList

func (m *MIMEBody) AddressList(key string) ([]*mail.Address, error)

Return AddressList with RFC 2047 encoded encoded names.

func (*MIMEBody) GetHeader

func (m *MIMEBody) GetHeader(name string) string

Process the specified header for RFC 2047 encoded words and return the result

type MIMEPart

type MIMEPart interface {
	Parent() MIMEPart             // Parent of this part (can be nil)
	FirstChild() MIMEPart         // First (top most) child of this part
	NextSibling() MIMEPart        // Next sibling of this part
	Header() textproto.MIMEHeader // Header as parsed by textproto package
	ContentType() string          // Content-Type header without parameters
	Disposition() string          // Content-Disposition header without parameters
	FileName() string             // File Name from disposition or type header
	Charset() string              // Content Charset
	Content() []byte              // Decoded content of this part (can be empty)
}

MIMEPart is the primary interface enmine clients will use. Each MIMEPart represents a node in the MIME multipart tree. The Content-Type, Disposition and File Name are parsed out of the header for easier access.

TODO Content should probably be a reader so that it does not need to be stored in memory.

func BreadthMatchAll

func BreadthMatchAll(p MIMEPart, matcher MIMEPartMatcher) []MIMEPart

BreadthMatchAll performs a breadth first search of the MIMEPart tree and returns all parts that cause the given matcher to return true

func BreadthMatchFirst

func BreadthMatchFirst(p MIMEPart, matcher MIMEPartMatcher) MIMEPart

BreadthMatchFirst performs a breadth first search of the MIMEPart tree and returns the first part that causes the given matcher to return true

func DepthMatchAll

func DepthMatchAll(p MIMEPart, matcher MIMEPartMatcher) []MIMEPart

DepthMatchAll performs a depth first search of the MIMEPart tree and returns all parts that causes the given matcher to return true

func DepthMatchFirst

func DepthMatchFirst(p MIMEPart, matcher MIMEPartMatcher) MIMEPart

DepthMatchFirst performs a depth first search of the MIMEPart tree and returns the first part that causes the given matcher to return true

func ParseMIME

func ParseMIME(reader *bufio.Reader) (MIMEPart, error)

ParseMIME reads a MIME document from the provided reader and parses it into tree of MIMEPart objects.

type MIMEPartMatcher

type MIMEPartMatcher func(part MIMEPart) bool

MIMEPartMatcher is a function type that you must implement to search for MIMEParts using the BreadthMatch* functions. Implementators should inspect the provided MIMEPart and return true if it matches your criteria.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL