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
Index ¶
- Variables
- func ConvertToUTF8String(charset string, textBytes []byte) (string, error)
- func DecodeHeader(input string) string
- func DecodeToUTF8Base64Header(input string) string
- func IsAttachment(header mail.Header) bool
- func IsBinaryBody(mailMsg *mail.Message) bool
- func IsMultipartMessage(mailMsg *mail.Message) bool
- func IsPlain(header mail.Header, emptyContentTypeIsPlain bool) bool
- func NewCharsetReader(charset string, input io.Reader) (io.Reader, error)
- type Base64Cleaner
- type MIMEBody
- type MIMEPart
- func BreadthMatchAll(p MIMEPart, matcher MIMEPartMatcher) []MIMEPart
- func BreadthMatchFirst(p MIMEPart, matcher MIMEPartMatcher) MIMEPart
- func DepthMatchAll(p MIMEPart, matcher MIMEPartMatcher) []MIMEPart
- func DepthMatchFirst(p MIMEPart, matcher MIMEPartMatcher) MIMEPart
- func NewMIMEPart(parent MIMEPart, contentType string) MIMEPart
- func ParseMIME(reader *bufio.Reader) (MIMEPart, error)
- type MIMEPartMatcher
Constants ¶
This section is empty.
Variables ¶
var AddressHeaders = []string{"From", "To", "Delivered-To", "Cc", "Bcc", "Reply-To"}
AddressHeaders enumerates SMTP headers that contain email addresses
Functions ¶
func ConvertToUTF8String ¶
ConvertToUTF8String uses the provided charset to decode a slice of bytes into a normal UTF-8 string.
func DecodeHeader ¶
DecodeHeader (per RFC 2047) using Golang's mime.WordDecoder
func DecodeToUTF8Base64Header ¶
DecodeToUTF8Base64Header decodes a MIME header per RFC 2047, reencoding to =?utf-8b?
func IsAttachment ¶
IsAttachment returns true, if the given header defines an attachment. First it checks if the Content-Disposition header defines an attachement or inline attachment. If this test is false, the Content-Type header is checked for attachment, but not inline. Email clients use inline for their text bodies.
Valid Attachment-Headers:
Content-Disposition: attachment; filename="frog.jpg" Content-Disposition: inline; filename="frog.jpg" Content-Type: attachment; filename="frog.jpg"
func IsBinaryBody ¶
IsBinaryBody returns true if the mail header defines a binary body.
func IsMultipartMessage ¶
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 IsPlain ¶
IsPlain returns true, if the the MIME headers define a valid 'text/plain' or 'text/html' part. If the emptyContentTypeIsPlain argument is set to true, a missing Content-Type header will result in a positive plain part detection.
func NewCharsetReader ¶
NewCharsetReader generates charset-conversion readers, converting from the provided charset into UTF-8. The CharsetReader signature is defined by Golang's mime.WordDecoder
This function is similar to: https://godoc.org/golang.org/x/net/html/charset#NewReaderLabel
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.
type MIMEBody ¶
type MIMEBody struct { Text string // The plain text portion of the message HTML string // The HTML portion of the message IsTextFromHTML bool // Plain text was empty; down-converted HTML 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 ¶
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 ¶
AddressList returns a mail.Address slice with RFC 2047 encoded encoded names.
type MIMEPart ¶
type MIMEPart interface { Parent() MIMEPart // Parent of this part (can be nil) SetParent(MIMEPart) // Sets Parent of this part FirstChild() MIMEPart // First (top most) child of this part SetFirstChild(MIMEPart) // Sets first child of this part (we are parent) NextSibling() MIMEPart // Next sibling of this part SetNextSibling(MIMEPart) // Sets next sibling of this part (shares our parent) Header() textproto.MIMEHeader // Header as parsed by textproto package SetHeader(textproto.MIMEHeader) // Sets the part MIME header ContentType() string // Content-Type header without parameters SetContentType(string) // Sets the Content-Type header Disposition() string // Content-Disposition header without parameters SetDisposition(string) // Sets the Content-Disposition header FileName() string // File Name from disposition or type header SetFileName(string) // Set file name Charset() string // Content character set label SetCharset(string) // Set content character set label Content() []byte // Decoded content of this part (can be empty) SetContent([]byte) // Set content of this part }
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 NewMIMEPart ¶
NewMIMEPart creates a new memMIMEPart object. It does not update the parents FirstChild attribute.
type MIMEPartMatcher ¶
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.