109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
// Package imap implements IMAP4rev1 (RFC 3501).
|
|
package imap
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// A StatusItem is a mailbox status data item that can be retrieved with a
|
|
// STATUS command. See RFC 3501 section 6.3.10.
|
|
type StatusItem string
|
|
|
|
const (
|
|
StatusMessages StatusItem = "MESSAGES"
|
|
StatusRecent StatusItem = "RECENT"
|
|
StatusUidNext StatusItem = "UIDNEXT"
|
|
StatusUidValidity StatusItem = "UIDVALIDITY"
|
|
StatusUnseen StatusItem = "UNSEEN"
|
|
|
|
StatusAppendLimit StatusItem = "APPENDLIMIT"
|
|
)
|
|
|
|
// A FetchItem is a message data item that can be fetched.
|
|
type FetchItem string
|
|
|
|
// List of items that can be fetched.
|
|
const (
|
|
// Macros
|
|
FetchAll FetchItem = "ALL"
|
|
FetchFast FetchItem = "FAST"
|
|
FetchFull FetchItem = "FULL"
|
|
|
|
// Items
|
|
FetchBody FetchItem = "BODY"
|
|
FetchBodyStructure FetchItem = "BODYSTRUCTURE"
|
|
FetchEnvelope FetchItem = "ENVELOPE"
|
|
FetchFlags FetchItem = "FLAGS"
|
|
FetchInternalDate FetchItem = "INTERNALDATE"
|
|
FetchRFC822 FetchItem = "RFC822"
|
|
FetchRFC822Header FetchItem = "RFC822.HEADER"
|
|
FetchRFC822Size FetchItem = "RFC822.SIZE"
|
|
FetchRFC822Text FetchItem = "RFC822.TEXT"
|
|
FetchUid FetchItem = "UID"
|
|
)
|
|
|
|
// Expand expands the item if it's a macro.
|
|
func (item FetchItem) Expand() []FetchItem {
|
|
switch item {
|
|
case FetchAll:
|
|
return []FetchItem{FetchFlags, FetchInternalDate, FetchRFC822Size, FetchEnvelope}
|
|
case FetchFast:
|
|
return []FetchItem{FetchFlags, FetchInternalDate, FetchRFC822Size}
|
|
case FetchFull:
|
|
return []FetchItem{FetchFlags, FetchInternalDate, FetchRFC822Size, FetchEnvelope, FetchBody}
|
|
default:
|
|
return []FetchItem{item}
|
|
}
|
|
}
|
|
|
|
// FlagsOp is an operation that will be applied on message flags.
|
|
type FlagsOp string
|
|
|
|
const (
|
|
// SetFlags replaces existing flags by new ones.
|
|
SetFlags FlagsOp = "FLAGS"
|
|
// AddFlags adds new flags.
|
|
AddFlags = "+FLAGS"
|
|
// RemoveFlags removes existing flags.
|
|
RemoveFlags = "-FLAGS"
|
|
)
|
|
|
|
// silentOp can be appended to a FlagsOp to prevent the operation from
|
|
// triggering unilateral message updates.
|
|
const silentOp = ".SILENT"
|
|
|
|
// A StoreItem is a message data item that can be updated.
|
|
type StoreItem string
|
|
|
|
// FormatFlagsOp returns the StoreItem that executes the flags operation op.
|
|
func FormatFlagsOp(op FlagsOp, silent bool) StoreItem {
|
|
s := string(op)
|
|
if silent {
|
|
s += silentOp
|
|
}
|
|
return StoreItem(s)
|
|
}
|
|
|
|
// ParseFlagsOp parses a flags operation from StoreItem.
|
|
func ParseFlagsOp(item StoreItem) (op FlagsOp, silent bool, err error) {
|
|
itemStr := string(item)
|
|
silent = strings.HasSuffix(itemStr, silentOp)
|
|
if silent {
|
|
itemStr = strings.TrimSuffix(itemStr, silentOp)
|
|
}
|
|
op = FlagsOp(itemStr)
|
|
|
|
if op != SetFlags && op != AddFlags && op != RemoveFlags {
|
|
err = errors.New("Unsupported STORE operation")
|
|
}
|
|
return
|
|
}
|
|
|
|
// CharsetReader, if non-nil, defines a function to generate charset-conversion
|
|
// readers, converting from the provided charset into UTF-8. Charsets are always
|
|
// lower-case. utf-8 and us-ascii charsets are handled by default. One of the
|
|
// the CharsetReader's result values must be non-nil.
|
|
var CharsetReader func(charset string, r io.Reader) (io.Reader, error)
|