9 IMAP: Reading Mail
9.1 Connecting and Selecting Mailboxes
(imap-connection? v) → boolean? v : any/c
(imap-connect server username password mailbox) →
imap-connection? exact-nonnegative-integer? exact-nonnegative-integer? server : string? username : (or/c string? bytes?) password : (or/c string? bytes?) mailbox : (or/c string? bytes?)
The second and third return values indicate the total number of messages in the mailbox and the number of recent messages (i.e., messages received since the mailbox was last selected), respectively.
See also imap-port-number.
A user’s primary mailbox is always called "INBOX". (Capitalization doesn’t matter for that mailbox name.)
Updated message-count and recent-count values are available through imap-messages and imap-recent. See also imap-new? and imap-reset-new!.
(imap-port-number) → (integer-in 0 65535) (imap-port-number k) → void? k : (integer-in 0 65535)
(imap-connect* in out username password mailbox) →
imap-connection? exact-nonnegative-integer? exact-nonnegative-integer? in : input-port? out : output-port? username : (or/c string? bytes?) password : (or/c string? bytes?) mailbox : (or/c string? bytes?)
(imap-disconnect imap) → void? imap : imap-connection?
(imap-force-disconnect imap) → void? imap : imap-connection?
(imap-reselect imap mailbox) →
exact-nonnegative-integer? exact-nonnegative-integer? imap : imap-connection? mailbox : (or/c string? bytes?)
Do not use this procedure to poll a mailbox to see whether there are any new messages. Use imap-noop, imap-new?, and imap-reset-new! instead.
(imap-examine imap mailbox) →
exact-nonnegative-integer? exact-nonnegative-integer? imap : imap-connection? mailbox : (or/c string? bytes?)
9.2 Selected Mailbox State
The return information is the same as for imap-reselect.
(imap-poll imap) → void? imap : imap-connection?
(imap-messages imap) → exact-nonnegative-integer? imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-recent imap) → exact-nonnegative-integer? imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-unseen imap) → (or/c exact-nonnegative-integer? false/c) imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-uidnext imap) → (or/c exact-nonnegative-integer? false/c) imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-uidvalidity imap) → (or/c exact-nonnegative-integer? false/c) imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-new? imap) → boolean? imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
(imap-reset-new! imap) → void? imap : imap-connection?
(imap-get-expunges imap) → (listof exact-nonnegative-integer?) imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication.
The server can notify the client of newly deleted messages during most other commands, but not asynchronously between commands. Furthermore, the server cannot report new deletions during imap-get-messages or imap-store operations.
Before calling any IMAP operation that works in terms of message numbers, pending expunge notifications must be handled by calling imap-get-expunges.
(imap-pending-expunges? imap) → boolean? imap : imap-connection?
(imap-get-updates imap)
→
(listof (cons/c exact-nonnegative-integer? (listof pair?))) imap : imap-connection?
This operation does not communicate with the server. It merely reports the result of previous communication. It also clears the update information from the connection after reporting it.
When a server reports information that supersedes old reported information for a message, or if the server reports that a message has been deleted, then old information for the message is dropped. Similarly, if imap-get-messages is used to explicitly obtain information, any redundant (or out-of-date) information is dropped.
A client need not use imap-get-updates ever, but accumulated information for the connection consumes space.
(imap-pending-updates? imap) → boolean? imap : imap-connection?
9.3 Manipulating Messages
(imap-get-messages imap msg-nums fields) → (listof list?) imap : imap-connection? msg-nums : (listof exact-nonnegative-integer?)
fields :
(listof (one-of/c 'uid 'header 'body 'flags))
'uid —
the value is an integer 'header —
the value is a header (a string, but see net/head) 'body —
the value is a byte string, with CRLF-separated lines 'flags —
the value is a list of symbols that correspond to IMAP flags; see imap-flag->symbol
The return value is a list of entry items in parallel to msg-nums. Each entry is itself a list containing value items in parallel to fields.
Pending expunges must be handled before calling this function; see imap-get-expunges.
Example: | |||||
|
(imap-flag->symbol flag) → symbol? flag : symbol?
(symbol->imap-flag sym) → symbol? sym : symbol?
|
|
| symbol |
| IMAP flag |
| message flags: |
| 'seen |
| '|\Seen| |
|
|
| 'answered |
| '|\Answered| |
|
|
| 'flagged |
| '|\Flagged| |
|
|
| 'deleted |
| '|\Deleted| |
|
|
| 'draft |
| '|\Draft| |
|
|
| 'recent |
| '|\Recent| |
| mailbox flags: |
| 'noinferiors |
| '|\Noinferiors| |
|
|
| 'noselect |
| '|\Noselect| |
|
|
| 'marked |
| '|\Marked| |
|
|
| 'unmarked |
| '|\Unmarked| |
|
|
| 'hasnochildren |
| '|\HasNoChildren| |
|
|
| 'haschildren |
| '|\HasChildren| |
The imap-flag->symbol and symbol->imap-flag functions act like the identity function when any other symbol is provided.
(imap-store imap mode msg-nums imap-flags) → void? imap : imap-connection? mode : (one-of/c '+ '- '!) msg-nums : (listof exact-nonnegative-integer?) imap-flags : (listof symbol?)
'+ —
add the given flags to each message '- —
remove the given flags from each message '! —
set each message’s flags to the given set
The msg-nums argument specifies a set of messages by their message positions (not their uids). The flags argument specifies the imap flags to add/remove/install.
Pending expunges must be handled before calling this function; see imap-get-expunges. The server will not report back message-state changes (so they will not show up through imap-get-updates).
Examples: | |||||||||
|
(imap-expunge imap) → void? imap : imap-connection?
9.4 Querying and Changing (Other) Mailboxes
(imap-copy imap msg-nums dest-mailbox) → void? imap : imap-connection? msg-nums : (listof exact-nonnegative-integer?) dest-mailbox : (or/c string? bytes?)
Pending expunges must be handled before calling this function; see imap-get-expunges.
(imap-append imap mailbox message) → void? imap : imap-connection? mailbox : string? message : (or/c string? bytes?)
(imap-status imap mailbox statuses) → list? imap : imap-connection? mailbox : (or/c string? bytes?) statuses : (listof symbol?)
The statuses list specifies the request, and the return value includes one value for each symbol in statuses. The allowed status symbols are:
'messages —
number of messages 'recent —
number of recent messages 'unseen —
number of unseen messages 'uidnext —
uid for next received message 'uidvalidity —
id that changes when all uids are changed
Use imap-messages to get the message count for the currently selected mailbox, etc. Use imap-new? and imap-reset-new! to detect when new messages are available in the currently selected mailbox.
(imap-mailbox-exists? imap mailbox) → boolean? imap : imap-connection? mailbox : (or/c string? bytes?)
(imap-create-mailbox imap mailbox) → void? imap : imap-connection? mailbox : (or/c string? bytes?)
(imap-list-child-mailboxes imap mailbox [ delimiter]) → (listof (list/c (listof symbol?) bytes?)) imap : imap-connection? mailbox : (or/c string? bytes? false/c)
delimiter : (or/c string? bytes?) = (imap-get-hierarchy-delimiter)
The return value is a list of mailbox-information lists. Each mailbox-information list contains two items:
a list of imap flags for the mailbox
the mailbox’s name
(imap-get-hierarchy-delimiter imap) → bytes? imap : imap-connection?
(imap-mailbox-flags imap mailbox) → (listof symbol?) imap : imap-connection? mailbox : (or/c string? bytes?)
9.5 IMAP Unit
imap@ and imap^ are deprecated. They exist for backward-compatibility and will likely be removed in the future. New code should use the net/imap module.
(require net/imap-unit) |
imap@ : unit?
9.6 IMAP Signature
(require net/imap-sig) |
imap^ : signature
Includes everything exported by the net/imap module.