# README
Simple IMAP Client Library
Forked from https://github.com/BrianLeishman/go-imap 02/09/2019
Brian wasn't able to find an IMAP client he liked (or found easy to use), so, now there's also this one. His goal here is to allow people to download emails quickly, and robustly, that's it. And he did it, but I needed to remove some global vars (to stop potential data races) and change the logger to better fit my application.
Getting Started
go get github.com/kgolding/go-imap
Usage
Below I've written a super basic demo function of what this library is capable of doing, and how one might use it.
package main
import (
"fmt"
"github.com/kgolding/go-imap"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Create a new instance of the IMAP connection you want to use
im := imap.New("username", "password", "mail.server.com", 993)
// Start the connection
err := im.Connect()
check(err)
defer im.Close()
// Folders now contains a string slice of all the folder names on the connection
folders, err := im.GetFolders()
check(err)
// folders = []string{
// "INBOX",
// "INBOX/My Folder"
// "Sent Items",
// "Deleted",
// }
// Now we can loop through those folders
for _, f := range folders {
// And select each folder, one at a time.
// Whichever folder is selected last, is the current active folder.
// All following commands will be executing inside of this folder
err = im.SelectFolder(f)
check(err)
// This function implements the IMAP UID search, returning a slice of ints
// Sending "ALL" runs the command "UID SEARCH ALL"
// You can enter things like "*:1" to get the first UID, or "999999999:*"
// to get the last (unless you actually have more than that many emails)
// You can check out https://tools.ietf.org/html/rfc3501#section-6.4.4 for more
uids, err := im.GetUIDs("ALL")
check(err)
// uids = []int{1, 2, 3}
// GetEmails takes a list of ints as UIDs, and returns new Email objects.
// If an email for a given UID cannot be found, there's an error parsing its body,
// or the email addresses are malformed (like, missing parts of the address), then it is skipped
// If an email is found, then an imap.Email struct slice is returned with the information from the email.
// The Email struct looks like this:
// type Email struct {
// Flags []string
// Received time.Time
// Sent time.Time
// Size uint64
// Subject string
// UID int
// MessageID string
// From EmailAddresses
// To EmailAddresses
// ReplyTo EmailAddresses
// CC EmailAddresses
// BCC EmailAddresses
// Text string
// HTML string
// Attachments []Attachment
// }
// Where the address type fields are maps like [EmailAddress:Name EmailAddress2:Name2]
// and an Attachment is a struct containing the Name, Content, and the MimeType (both as strings)
emails, err := im.GetEmails(uids...)
check(err)
if len(emails) != 0 {
// Should print a summary of one of the the emails
// (yes, I said "one of", don't expect the emails to be returned in any particular order)
fmt.Print(emails[0])
// Subject: FW: FW: FW: New Order
// To: Brian Leishman <[email protected]>
// From: Customer Service <[email protected]>
// Text: Hello, World!...(4.3 kB)
// HTML: <html xmlns:v="urn:s... (35 kB)
// 1 Attachment(s): [20180330174029.jpg (192 kB)]
}
}
}
Built With
- jhillyerd/enmime - MIME mail encoding and decoding library for Go
- dustin/go-humanize - Go Humans! (formatters for units to human friendly sizes)
Authors
- Brian Leishman - Stirling Marketing Group
- Kevin Golding
# Functions
GetTokenName returns the name of the given token type token.
IsLiteral returns if the given byte is an acceptable literal character.
New returns a Dialer which now needs one of the Connect..
# Constants
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
EESR is unused and should be ignored.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
TAtom is a string that's prefixed with `{n}` where n is the number of bytes in the string.
TContainer is a container of tokens.
TimeFormat is the Go time version of the IMAP times.
TLiteral is a literal (think string, ish, used mainly for field names, I hope).
TNil is a nil value, nothing.
TNumber is a numeric literal.
TQuoted is a quoted piece of text.
TUnset is an unset token; used by the parser.
# Variables
AddSlashes adds slashes to double quotes.
RemoveSlashes removes slashes before double quotes.
# Structs
Attachment is an Email attachment.
Dialer is basically an IMAP connection.
Email is an email message.
Token is a fetch response token (e.g.
# Type aliases
EmailAddresses are a map of email address to names.
TType is the enum type for token values.