summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc984.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc984.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc984.txt')
-rw-r--r--doc/rfc/rfc984.txt1767
1 files changed, 1767 insertions, 0 deletions
diff --git a/doc/rfc/rfc984.txt b/doc/rfc/rfc984.txt
new file mode 100644
index 0000000..ea0f3a5
--- /dev/null
+++ b/doc/rfc/rfc984.txt
@@ -0,0 +1,1767 @@
+
+
+Network Working Group David D. Clark
+Request for Comments: 984 Mark L. Lambert
+ M. I. T. Laboratory for Computer Science
+ May 1986
+
+ PCMAIL: A Distributed Mail System for Personal Computers
+
+
+1. Status of this Document
+
+ This document is a preliminary discussion of the design of a
+ personal-computer-based distributed mail system. It is published for
+ discussion and comment, and does not constitute a standard. As the
+ proposal may change, implementation of this document is not advised.
+ Distribution of this memo is unlimited.
+
+2. Introduction
+
+ Pcmail is a distributed mail system that provides mail service to an
+ arbitrary number of users, each of which owns one or more personal
+ computers (PCs). The system is divided into two halves. The first
+ consists of a single entity called the "repository". The repository
+ is a storage center for incoming mail. Mail for a Pcmail user can
+ arrive externally from the Internet or internally from other
+ repository users. The repository also maintains a stable copy of
+ each user's mail state (this will hereafter be referred to as the
+ user's "global mail state"). The repository is therefore typically a
+ computer with a large amount of disk storage.
+
+ The second half of Pcmail consists of one or more "clients". Each
+ Pcmail user may have an arbitrary number of clients, which are
+ typically PCs. The clients provide a user with a friendly means of
+ accessing the user's global mail state over a network. In order to
+ make the interaction between the repository and a user's clients more
+ efficient, each client maintains a local copy of its user's global
+ mail state, called the "local mail state". Since clients are PCs,
+ they may not always have access to a network (and therefore to the
+ global mail state in the repository). This means that the local and
+ global mail states may not be identical all the time, making
+ synchronization between local and global mail states necessary.
+
+ Clients communicate with the repository via the Distributed Mail
+ System Protocol (DMSP); the specification for this protocol appears
+ in appendix A. The repository is therefore a DMSP server in addition
+ to a mail end-site and storage facility. DMSP provides a complete
+ set of mail manipulation operations ("send a message", "delete a
+ message", "print a message", etc.). DMSP also provides special
+ operations to allow easy synchronization between a user's global mail
+ state and his clients' local mail states. Particular attention has
+ been paid to the way in which DMSP operations act on a user's mail
+ state. All DMSP operations are atomic (that is, they are guaranteed
+
+
+Clark & Lambert [Page 1]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ either to succeed completely, or fail completely). A client can be
+ abruptly disconnected from the repository without leaving
+ inconsistent or damaged mail states.
+
+ Pcmail is a mail system for PCs. Its design has therefore been
+ heavily influenced by several characteristics unique to PCs. First,
+ PCs are relatively inexpensive. This means that people may own more
+ than one PC, perhaps putting one in an office and one at home.
+ Second, PCs are portable. Most PCs can be packed up and moved in the
+ back seat of an automobile, and a few are truly portable--about the
+ size of a briefcase--and battery-powered. Finally, PCs are
+ resource-poor. A typical PC has a small amount (typically less than
+ one megabyte) of main memory and little in the way of mass storage
+ (floppy-disk drives that can access perhaps 360 kilobytes of data).
+
+ Because PCs are relatively inexpensive and people may own more than
+ one, Pcmail has been designed to allow users multiple access points
+ to their mail state. Each Pcmail user can have several client PCs,
+ each of which can access the user's mail by communicating with the
+ repository over a network. The client PCs all maintain local copies
+ of the user's global mail state, and synchronize the local and global
+ states using DMSP.
+
+ It is possible, even likely, that many PCs will only infrequently be
+ connected to a network (and thus be able to communicate with the
+ repository). The Pcmail design therefore allows two modes of
+ communication between repository and client. "Interactive mode" is
+ used when the client PC is always connected to the network. Any
+ changes to the client's local mail state are immediately also made to
+ the repository's global mail state, and any incoming mail is
+ immediately transmitted from repository to client. "Batch mode" is
+ used by clients that have infrequent access to the repository. Users
+ manipulate the client's local mail state, queueing the changes as
+ "actions". When next connected to the repository, the actions are
+ transmitted, and the client's local mail state is synchronized with
+ the repository's global mail state.
+
+ Finally, the Pcmail design minimizes the effect of using a
+ resource-poor PC as a client. Mail messages are split into two
+ parts: a "descriptor" and a "body". The descriptor is a capsule
+ message summary whose length (typically about 100 bytes) is
+ independent of the actual message length. The body is the actual
+ message text, including an RFC-822 standard message header. While the
+ client may not have enough storage to hold a complete set of
+ messages, it can always hold a complete set of descriptors, thus
+
+
+
+
+Clark & Lambert [Page 2]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ providing the user with at least a summary of his mail state.
+ Message bodies can be pulled over from the repository as client
+ storage becomes available.
+
+ The remainder of this document is broken up into the following
+ sections: first, there is a detailed description of the repository
+ architecture. This is followed by a description of DMSP, its
+ operations, and motivation for its design. A third section describes
+ client architecture. Another section describes a typical DMSP
+ session between the repository and a client. The final section
+ discusses the current Pcmail implementation.
+
+3. Repository Architecture
+
+ A machine running repository code is typically a medium-to-large size
+ computer with a large amount of disk storage. It must also be a
+ permanent network site, since client PCs communicate with the
+ repository over a network, and rely on the repository's being
+ available at any time.
+
+ The repository must perform several tasks. First, and most
+ importantly, the repository must efficiently manage a potentially
+ large number of users and their mail states. Mail must be reliably
+ stored in a manner that makes it easy for multiple clients to access
+ the global mail state and synchronize their local mail states with
+ the global state. Second, the repository must be able to communicate
+ efficiently with its clients. The protocol used to communicate
+ between repository and client must be reliable and must provide
+ operations that (1) allow typical mail manipulation, and (2) support
+ Pcmail's distributed nature by allowing efficient synchronization
+ between local and global mail states. Third, the repository must be
+ able to process mail from sources outside the repository's own user
+ community (a primary outside source is the Internet). Internet mail
+ will arrive with a NIC RFC-822 standard message header; the recipient
+ names in the message must be properly translated from the RFC-822
+ namespace into the repository's namespace.
+
+ 3.1. Management of user mail state
+
+ Pcmail divides the world into a community of users. Each user is
+ referred to by a user object. A user object consists of a unique
+ name, a password (which the user's clients use to authenticate
+ themselves to the repository before manipulating a global mail
+ state), a list of "client objects" describing those clients
+ belonging to the user, and a list of "mailbox objects".
+
+ A client object consists of a unique name and a status. A user
+
+
+Clark & Lambert [Page 3]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ has one client object for every client he owns; a client cannot
+ communicate with the repository unless it has a corresponding
+ client object in a user's client list. Client objects therefore
+ serve as a means of identifying valid clients to the repository.
+ Client objects also allow the repository to manage local and
+ global mail state synchronization; the repository associates with
+ every global state change a list of client objects corresponding
+ to those clients which have not recorded the global change
+ locally.
+
+ A client's status is either "active" or "inactive". The
+ repository defines inactive clients as those clients which have
+ not connected to the repository within a set time period (one week
+ in the current Pcmail implementation). When an inactive client
+ does connect to the repository, the repository notifies the client
+ that it has been "reset". The repository resets a client by
+ marking all messages in the user's mail state as having changed
+ since the client last logged in. When the client next
+ synchronizes with the repository, it will receive a complete copy
+ of the repository's global mail state. A forced reset is
+ performed on the assumption that enough global state changes occur
+ in a week that the client would spend too much time performing an
+ ordinary local state-global state synchronization.
+
+ Messages are stored in mailboxes. Users can have an arbitrary
+ number of mailboxes, which serve both to store and to categorize
+ messages. Since there can be any number of mailboxes, messages
+ can be categorized to an arbitrarily fine degree. A mailbox
+ object both names a mailbox and describes its contents. Mailboxes
+ are identified by a unique name; their contents are described by
+ three numeric values. The first is the total number of messages
+ in the mailbox, the second is the total number of unseen messages
+ (messages that have never been seen by the user via any client) in
+ the mailbox, and the third is the next available message unique
+ identifier (UID). This information is stored in the mailbox
+ object to allow clients to get a summary of a mailbox's contents
+ without having to read all the messages within the mailbox.
+
+ Associated with each mailbox are an arbitrary number of message
+ objects. Each message is broken into two parts--a "descriptor",
+ which contains a summary of useful information about the message,
+ and a "body", which is the message text itself, including NIC
+ RFC-822 message header. Each message is assigned a monotonically
+ increasing UID based on the owning mailbox's next available UID.
+ Each mailbox has its own set of UIDs which, together with the
+ mailbox name and user name, uniquely identify the message within
+ the repository.
+
+
+Clark & Lambert [Page 4]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ A descriptor holds the following information: the message UID, the
+ message size in bytes and lines, four "useful" message header
+ fields (the "date:", "to:", "from:", and "subject:" fields), and
+ two groups of eight flags each. The first group of flags is
+ system defined. These flags mark whether the message has never
+ been seen, whether it has been deleted, whether it is a forwarded
+ message, and whether the message has been expunged. The remaining
+ four flags are reserved for future use. The second group of flags
+ is user defined. The repository never examines these flags
+ internally; instead they can be used by application programs
+ running on the clients. Descriptors serve as an efficient means
+ for clients to get message information without having to waste
+ time retrieving the message from the repository.
+
+ 3.2. Repository-to-RFC-822 name translation
+
+ "Address objects" provide the repository with a means for
+ translating the RFC-822-style mail addresses in Internet messages
+ into repository names. The repository provides its own namespace
+ for message identification. Any message is uniquely identified by
+ the triple (user-name, mailbox-name, message-UID). Any mailbox is
+ uniquely identified by the pair (user-name, mailbox-name). Thus
+ to send a message between two repository users, a user would
+ address the message to (user-name, mailbox-name). The repository
+ would deliver the message to the named user and mailbox, and
+ assign it a UID based on the requested mailbox's next available
+ UID.
+
+ In order to translate between RFC-822-style mail addresses and
+ repository names, the repository maintains a list of address
+ objects. Each address object is an association between an
+ RFC-822-style address and a (user-name, mailbox-name) pair. When
+ mail arrives from the Internet, the repository can use the address
+ object list to translate the recipients into (user-name,
+ mailbox-name) pairs and route the message correctly.
+
+4. Communication Between Repository and Client: DMSP
+
+ The Distributed Mail System Protocol (DMSP) is a block-stream
+ protocol that defines and manipulates the objects mentioned in the
+ previous section. It has been designed to work with Pcmail's
+ single-repository/multiple-client model of the world. In addition to
+ providing typical mail manipulation functions, DMSP provides
+ functions that allow easy synchronization of global and local mail
+ states.
+
+ DMSP is implemented on top of the Unified Stream Protocol (USP),
+
+
+Clark & Lambert [Page 5]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ specified in MIT-LCS Technical Memo 255. USP provides a reliable
+ virtual circuit block-stream connection between two machines. USP
+ defines a basic set of data types ("strings", "integers", "booleans",
+ etc.). Instances of these data types are grouped in an
+ application-defined order to form USP blocks. Each USP block is
+ defined by a numeric "block type"; a USP application can thus
+ interpret a block's contents based on knowledge of the block's type.
+ DMSP consists of a set of operations, each of which is comprised of
+ one or more different USP blocks that are sent between repository and
+ client.
+
+ A DMSP session proceeds as follows: a client begins the session with
+ the repository by opening a USP connection to the repository's
+ machine. The client then authenticates both itself and its user to
+ the repository with a "login" operation. If the authentication is
+ successful, the user performs an arbitrary number of DMSP operations
+ before ending the session with a "logout" operation (at which time
+ the connection is closed by the repository).
+
+ Because DMSP can manipulate a pair of mail states (local and global)
+ at once, it is extremely important that all DMSP operations are
+ atomic. Failure of any DMSP operation must leave both states in a
+ consistent, known state. For this reason, a DMSP operation is
+ defined to have failed unless an explicit acknowledgement is received
+ by the operation initiator. This acknowledgement can take one of two
+ basic forms, based on two broad categories that all DMSP operations
+ fall into. First, an operation can be a request to perform some mail
+ state modification, in which case the repository will acknowledge the
+ request with either an "ok" or a "failure" (in which case the reason
+ for the failure is also returned). Second, an operation can be a
+ request for information, in which case the request is acknowledged by
+ the repository's providing the information to the client. Operations
+ such as "delete a message" fall into the first category; operations
+ like "send a list of mailboxes" fall into the second category.
+
+ Following are a list of DMSP operations by object type, their block
+ types and arguments, and their expected acknowledgement block types.
+ Each DMSP block has a different number; the first digit of each block
+ type defines the object being manipulated: Operations numbered 5xx
+ are general, operations numbered 6xx are user operations, operations
+ numbered 7xx are client operations, operations numbered 8xx are
+ mailbox and address operations, and operations numbered 11xx are
+ message operations.
+
+ Blocks marked "=>" flow from client to repository; blocks marked "<="
+ flow from repository to client. If more than one block can be sent,
+ the choices are delimited by "or" ("|") characters.
+
+
+Clark & Lambert [Page 6]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ For clarity, each block type is put in a human-
+ understandable form. The block number is followed by an operation
+ name; this name is never transmitted as part of a USP block. Block
+ arguments are identified by name and type, and enclosed in square
+ brackets. "Record" data types are described by a list of
+ "field-name:field-type" pairs contained in square brackets. "Choice"
+ data types are described by a list of "tag:tag-name" pairs contained
+ in square brackets. USP data types are abbreviated as follows:
+
+ Primitive data types:
+
+ - string: str
+
+ - cardinal: card
+
+ - long-cardinal: Lcard
+
+ - integer: int
+
+ - long-integer: Lint
+
+ - boolean: bool
+
+ Compound data types:
+
+ - sequence: SEQ
+
+ - array: AR
+
+ - record: REC
+
+ - choice: CH
+
+ 4.1. General operations
+
+ The first group of DMSP operations perform general functions that
+ operate on no one particular class of object. DMSP has six
+ general operations, which provide the following services:
+
+ If either a client or the repository thinks the other is
+ malfunctioning, they can send an "abort-request". An
+ abort-request is never acknowledged; after the request is sent,
+ the sender immediately closes the USP connection and returns
+ control to its application.
+
+ => 503 (abort-request) [why:str]
+
+
+
+Clark & Lambert [Page 7]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ DMSP provides a limited remote debugging facility via the
+ "start-debug" and "end-debug" operations. When a client sends a
+ "start-debug" request, the repository enables its idea of
+ remote-debugging. The exact definition of remote debugging is
+ implementation dependent; the current repository implementation
+ simply writes debugging information to a special file. The
+ "end-debug" request disables remote debugging.
+
+ => 504 (start-debug) []
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ or
+
+ => 505 (end-debug) []
+
+ <= 500 (ok) []
+
+ In order to prevent protocol version skew between clients and the
+ repository, DMSP provides a "send-version" operation. The client
+ supplies its DMSP version number as an argument; the operation
+ succeeds if the supplied version number matches the repository's
+ DMSP version number. It fails if the two version numbers do not
+ match.
+
+ => 506 (send-version) [version-number:card]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ DMSP also provides clients with the ability to send an arbitrary
+ text message to the repository. The "log-message" operation takes
+ as an argument a string of arbitrary length; the repository
+ accepts the string; what is done with the string is
+ implementation-dependent.
+
+ => 507 log-message[message:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Finally, users can send mail to other users via the "send-message"
+ operation. The message must have an Internet-style header as
+ defined by NIC RFC-822. The repository takes the message and
+ distributes it to the mailboxes specified on the "to:", "cc:", and
+ "bcc:" fields of the message header. If one or more of the
+
+
+Clark & Lambert [Page 8]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ mailboxes exists outside the repository's user community, the
+ repository is responsible for handing the message to a local SMTP
+ server.
+
+ An OK block is sent from the repository only if the entire message
+ was successfully transmitted. If the message was destined for the
+ Internet, the send-message operation is successful if the message
+ was successfully transmitted to the local SMTP server.
+
+ => 508 (send-message) [message:SEQ[str]]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ 4.2. User operations
+
+ The next series of DMSP operations manipulates user objects. The
+ most common of these operations are "login" and "logout". A
+ client must perform a login operation before being able to access
+ a user's mail state. A DMSP login block contains five items: (1)
+ the user's name, (2) the user's password, (3) the name of the
+ client performing the login, (4) a flag telling the repository to
+ create a client object for the client if one does not exist, and
+ (5) a flag set to TRUE if the client wishes to operate in "batch
+ mode" and FALSE if the client wishes to operate in "interactive"
+ mode. The flag value allows the repository to tune internal
+ parameters for either mode of operation.
+
+ The repository can return either an OK block (indicating
+ successful authentication), a FAILURE block (indicating failed
+ authentication), or a FORCE-RESET block. This last is sent if the
+ client logging in has been marked as "inactive" by the repository
+ (clients are marked inactive if they have not connected to the
+ repository in over a week). The FORCE-RESET block indicates that
+ the client should erase its local mail state and pull over a
+ complete version of the repository's mail state. This is done on
+ the assumption that so many mail state changes have been made in a
+ week that it would be inefficient to perform a normal
+ synchronization.
+
+ => 600 (login) [user:str, password:str, client:str,
+ create-client-object?:bool,
+ batch-mode-flag:bool]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str] |
+ 705 (force-client-reset) []
+
+
+Clark & Lambert [Page 9]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ When a client is finished interacting with the repository, it
+ performs a logout operation. This allows the repository to
+ perform any necessary cleanup before closing the USP connection.
+
+ => 601 (logout) []
+
+ <= 500 (ok) []
+
+ DMSP also provides "add-user" and "remove-user" operations, which
+ allow system administrators to remotely add new users to, and
+ remove users from, the repository. These operations are
+ privileged; the repository authenticates the user requesting the
+ operation before performing an add-user or remove-user operation.
+ Both operations require the name of the user to be added or
+ removed; the add-user operation also requires a default password
+ to assign the new user.
+
+ => 602 (add-user) [user:str, password:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 603 (remove-user) [user:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ A user can change his password via the "set-password" operation.
+ The operation works much the same as the UNIX change-password
+ operation, taking as arguments the user's current password and a
+ desired new password. If the current password given matches the
+ user's current password, the user's current password is changed to
+ the new password given.
+
+ => 604 (set-password) [old-password:str,
+ new-password:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 10]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ 4.3. Client operations
+
+ DMSP provides four operations to manipulate client objects. The
+ first, "list-clients", tells the repository to send the user's
+ client list to the requesting client. The list takes the form of
+ a series of (name, status pairs).
+
+ => 700 (list-clients) []
+
+ <= 701 (client-list) [client-list:SEQ[
+ REC[name:str, status:card]]]
+
+ The "add-client" operation allows a user to add a client object to
+ his list of client objects. Although the login operation
+ duplicates this functionality via the "create-this-client?" flag,
+ the add-client operation is a useful means of creating a number of
+ new client objects while logged into the repository via an
+ existing client. The add-client operation requires the name of
+ the client to add.
+
+ => 702 (add-client) [client:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ The most common failure mode for this operation is an attempt to
+ add a client that already exists.
+
+ The "remove-client" operation removes an existing client object
+ from a user's client list. The client being removed can be the
+ client requesting the operation. The remove-client operation
+ requires the name of the client to remove.
+
+ => 703 (remove-client) [client:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ The most common failure mode here is an attempt to remove a
+ non-existent client. This is a typical failure mode for any DMSP
+ operation which operates on a named object.
+
+ The last client operation, "reset-client", causes the repository
+ to mark all messages in the user's mail state as having changed
+ since the client last logged in. When a client next synchronizes
+ with the repository, it will end up receiving a complete copy of
+ the repository's global mail state. This is useful for two
+
+
+Clark & Lambert [Page 11]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ reasons. First, a client's local mail state could easily become
+ lost or damaged, especially if it is stored on a floppy disk.
+ Second, if a client has been marked as inactive by the repository,
+ the reset-client operation provides a fast way of resynchronizing
+ with the repository, assuming that so many differences exist
+ between the local and global mail states that a normal
+ synchronization would take far too much time.
+
+ => 704 (reset-client) [client:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ 4.4. Mailbox operations
+
+ DMSP supports five operations that manipulate mailbox objects.
+ First, "list-mailboxes" has the repository send to the requesting
+ client information on each mailbox. This information consists of
+ the mailbox name, total message count, unseen message count, and
+ "next available UID". This operation is useful in synchronizing
+ local and global mail states, since it allows a client to compare
+ the user's global mailbox list with a client's local mailbox list.
+ The list of mailboxes also provides a quick summary of each
+ mailbox's contents without having the contents present.
+
+ => 800 (list-mailboxes) []
+
+ <= 801 (mailbox-list) [mailbox-list:SEQ[
+ REC[mailbox:str,
+ next-UID:Lcard,
+ num-msgs:card,
+ num-unseen-msgs:card]]]
+
+ The "add-mailbox" has the repository create a new mailbox and
+ attach it to the user's list of mailboxes. An address object
+ binding the (user-name, mailbox-name) pair to an RFC-822-style
+ address is automatically created and placed in the repository's
+ list of address objects. This allows mail coming from the
+ Internet to be correctly routed to the new mailbox.
+
+ => 802 (add-mailbox) [mailbox:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ "Remove-mailbox" removes a mailbox from the user's list of
+ mailboxes. All messages within the mailbox are also deleted and
+
+
+Clark & Lambert [Page 12]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ permanently removed from the system. Any address objects binding
+ the mailbox name to RFC-822-style mailbox addresses are also
+ removed from the system.
+
+ => 803 (remove-mailbox) [mailbox:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ DMSP also has an "expunge-mailbox" operation. Any message can be
+ deleted and "undeleted" at will. Deletions are made permanent by
+ performing an expunge-mailbox operation. The expunge operation
+ causes the repository to look through a named mailbox, removing
+ from the system any messages marked "deleted".
+
+ => 808 expunge-mailbox[mailbox:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Finally, "reset-mailbox" causes the repository to mark all the
+ messages in a named mailbox as having changed since the current
+ client last logged in. When the client next synchronizes with the
+ repository, it will receive a complete copy of the named mailbox's
+ mail state. This operation is merely a more specific version of
+ the reset-client operation (which allows the client to pull over a
+ complete copy of the user's global mail state). Its primary use
+ is for mailboxes whose contents have accidentally been destroyed
+ locally.
+
+ => 809 (reset-mailbox) [mailbox:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ 4.5. Address operations
+
+ DMSP provides three operations that allow users to manipulate
+ address objects. First, the "list-address" operation returns a
+ list of address objects associated with a particular (user-name,
+ mailbox-name) pair.
+
+ => 804 (list-addresses) [mailbox:str]
+
+ <= 501 (failure) [why:str] |
+ 805 (address-list) [address-list:SEQ[str]]
+
+
+
+Clark & Lambert [Page 13]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ The "add-address" operation adds a new address object that
+ associates a (user-name, mailbox-name) pair with a given
+ RFC-822-style mailbox address.
+
+ => 806 (add-address) [mailbox:str,
+ RFC-822-mail-address:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Finally, the "remove-address" operation destroys the address
+ object binding the given RFC-822-style mail address and the given
+ (user-name, mailbox-name) pair.
+
+ => 807 (remove-address) [mailbox:str,
+ RFC-822-mail-address:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ 4.6. Message operations
+
+ The most commonly-manipulated Pcmail objects are messages; DMSP
+ therefore provides special message operations to allow efficient
+ synchronization, as well as a set of operations to perform
+ standard message-manipulation functions. In the following
+ paragraphs, the terms "message" and "descriptor" will be used
+ interchangeably.
+
+ A client can request a particular message's flag values with the
+ "get-descriptor-flags" operation. The repository sends over an
+ array of boolean values, eight of which are system defined, and
+ eight of which are user defined and ignored by the repository.
+
+ => 1100 (get-descriptor-flags) [mailbox:str,
+ uid:Lcard]
+
+ <= 1101 (descriptor-flags) [flags:SEQ[bool]] |
+ 501 (failure) [why:str]
+
+ A user may request a series of descriptors with the
+ "get-descriptors" operation. The series is identified by a pair
+ of message UIDs, representing the lower and upper bounds of the
+ list. Since UIDs are defined to be monotonically increasing
+ numbers, a pair of UIDs is sufficient to completely identify the
+ series of descriptors. The repository returns a sequence of
+ "choices". Elements of the sequence can either be descriptors, in
+
+
+Clark & Lambert [Page 14]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ which case the choice is tagged as a descriptor, or they can be
+ notification that the requested message has been expunged
+ subsequent to the client's last connection to the repository.
+
+ => 1102 (get-descriptors) [mailbox:str,
+ low-UID:Lcard,
+ high-UID:Lcard]
+
+ <= 501 (failure) [why:str] |
+ 1103 (descriptor-list) [descriptor-list:SEQ[ CH[
+ expunged[uid:Lcard]
+ descriptor[REC[UID:Lcard,
+ flags:SEQ[bool],
+ from-field:str,
+ to-field:str,
+ date-field:str,
+ subject-field:str,
+ num-bytes:Lcard,
+ num-lines:Lcard]
+ ]]]]
+
+ The "get-changed-descriptors" operation is intended for use during
+ state synchronization. Whenever a descriptor changes state (is
+ deleted, for example), the repository notes those clients which
+ have not yet recorded the change locally. Get-changed-descriptors
+ has the repository send to the client a given number of
+ descriptors which have changed since the client's last
+ synchronization. The list sent begins with the earliest-changed
+ descriptor.
+
+ => 1105 (get-changed-descriptors) [mailbox:str,
+ max-to-send:card]
+
+ <= 501 (failure) why:str] |
+ 1103 (descriptor-list) [descriptor-list:SEQ[
+ CH[
+ expunged[uid:Lcard]
+ descriptor[REC[UID:Lcard,
+ flags:SEQ[bool],
+ from-field:str,
+ to-field:str,
+ date-field:str,
+ subject-field:str,
+ num-bytes:Lcard,
+ num-lines:Lcard]
+ ]]]]
+
+
+
+Clark & Lambert [Page 15]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ Once the changed descriptors have been looked at, a user will want
+ to inform the repository that the current client has recorded the
+ change locally. The "reset-changed-descriptors" causes the
+ repository to mark as "seen by current client" a given number of
+ changed descriptors, starting with the changed descriptor with
+ lowest UID.
+
+ => 1106 (reset-changed-descriptors) [
+ mailbox:str,
+ number-to-reset:card]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Message bodies are transmitted from repository to user with the
+ "get-message-text" operation. The separation of "get-descriptors"
+ and "get-message-text" operations allows clients with small
+ amounts of disk storage to obtain a small message summary (via
+ "get-descriptors" or "get-changed-descriptors") without having to
+ pull over the entire message.
+
+ => 1107 (get-message-text)[mailbox:str,
+ uid:Lcard]
+
+ <= 501 (failure) [why:str] |
+ 1110 (message) [message:SEQ[str]]
+
+ Frequently, a message may be too large for some clients to store
+ locally. Users can still look at the message contents via the
+ "print-message" operation. This operation has the repository send
+ a copy of the message to a named printer. The printer name need
+ only have meaning to the particular repository implementation;
+ DMSP transmits the name only as a means of identification.
+
+ => 1108 (print-message) [mailbox:str,
+ uid:Lcard,
+ printer-name:str]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ The user can set and clear any of the 16 descriptor flags with the
+ "set-flag" operation. The desired flag is set or cleared
+ according to the operation arguments.
+
+
+
+
+
+Clark & Lambert [Page 16]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ => 1109 (set-flag) [mailbox:str,
+ uid:Lcard,
+ flag-number:card,
+ flag-setting:bool]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Copying of one message into another mailbox is accomplished via
+ the "copy-message" operation.
+
+ => 1111 (copy-message) [source-mailbox:str,
+ target-mailbox:str,
+ source-uid:Lcard]
+
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+5. Client Architecture
+
+ Clients are typically PCs; Pcmail's architecture must therefore take
+ into account several characteristics common to PCs. First, PCs are
+ cheap, therefore a user may well have more than one. Second, they
+ are portable, therefore they are not expected to be constantly tied
+ into a network. Finally, they are resource-poor, so they are not
+ expected to be able to store a significant amount of state
+ information locally. The following subsections describe the
+ particular parts of Pcmail's client architecture that address these
+ three characteristics.
+
+ 5.1. Multiple clients
+
+ The fact that Pcmail users may own more than one PC forms the
+ rationalization for the multiple client model that Pcmail uses. A
+ Pcmail user may have a PC client at home, a PC at an office, and
+ maybe even a third portable PC. Each client maintains a separate
+ copy of the user's mail state, hence Pcmail's distributed nature.
+ The notion of separate clients allows Pcmail users to access mail
+ state from several different locations.
+
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 17]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ 5.2. Synchronization
+
+ Since PCs are fairly portable, the likelihood of a PC's being
+ always connected to a network is relatively small. This is
+ another reason for each client's maintaining a local copy of a
+ user's mail state. The user can then manipulate the local mail
+ state while not connected to the network (and the repository).
+ This immediately brings up the problem of synchronization between
+ local and global mail states. The repository is continually in a
+ position to receive global mail state updates, either in the form
+ of incoming mail, or in the form of changes from other clients. A
+ client that is not always connected to the net cannot immediately
+ receive the global changes. In addition, the client's user can
+ make his own changes on the local mail state.
+
+ Pcmail's architecture permits efficient synchronization between
+ client local mail states and the repository's global mail state.
+ Each client is identified in the repository by a client object
+ attached to the user. This object forms the basis for
+ synchronization between local and global mail states. Some of the
+ less common state changes include the adding and deleting of user
+ mailboxes and the adding and deleting of address objects.
+ Synchronization of these changes is performed via DMSP list
+ operations, which allow clients to compare their local versions of
+ mailbox and address object lists with the repository's global
+ version and make any appropriate changes. The majority of
+ possible changes to a user's mail state are in the form of changed
+ descriptors. Since most users will have a large number of
+ messages, and message states will change relatively often, special
+ attention needs to be paid to message synchronization.
+
+ An existing descriptor can be changed in one of two ways: first,
+ one of its sixteen flags values can be changed (this encompasses
+ reading an unseen message, deleting a message, and expunging a
+ message). The second way to change a descriptor is via the
+ arrival of incoming mail or the copying of a message from one
+ mailbox to another. Both result in a new message being added to a
+ mailbox.
+
+ In both the above cases, synchronization is required between the
+ repository and every client that has not previously noted a
+ change. To keep track of which clients have noticed a global mail
+ state change and changed their local states accordingly, each
+ descriptor has associated with it a (potentially empty) "update
+ list" of client objects. The list identifies those clients which
+ have not yet recorded a change to that descriptor's state.
+
+
+
+Clark & Lambert [Page 18]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ When a client connects to the repository, it executes a DMSP
+ "get-changed-descriptors" operation. This causes the repository
+ to return a list of all descriptor objects that have the
+ requesting client on their update list. As the client receives
+ the changed descriptors, it can store them locally, thus updating
+ the local mail state. After a changed descriptor has been
+ recorded, the client uses the DMSP "reset-descriptors" operation
+ to remove itself from the descriptor's update list. That
+ descriptor will now not be sent to the client unless (1) it is
+ explicitly requested, or (2) it changes again.
+
+ In this manner, a client can run through its user's mailboxes,
+ getting all changed descriptors, incorporating them into the local
+ mail state, and marking the change as recorded.
+
+ 5.3. Batch operation versus interactive operation
+
+ Because of the portable nature of most PCs, they may not always be
+ connected to the repository. Since each client maintains a local
+ mail state, Pcmail users can manipulate the local state while not
+ connected to the repository. This is known as "batch" operation,
+ since all changes are recorded by the client and made to the
+ repository's global state in a batch, when the client next
+ connects to the repository. Interactive operation occurs when a
+ client is always connected to the repository. In interactive
+ mode, changes made to the local mail state are immediately
+ propagated to the global state via DMSP operations.
+
+ In batch mode, interaction between client and repository takes the
+ following form: the client connects to the repository and sends
+ over all the changes made by the user to the local mail state.
+ The repository changes its global mail state accordingly. When all
+ changes have been processed, the client begins synchronization, to
+ incorporate newly-arrived mail, as well as mail state changes by
+ other clients, into the local state.
+
+ In interactive mode, since local changes are immediately
+ propagated to the repository, the first part of batch-type
+ operation is eliminated. The synchronization process also
+ changes; interactive clients can periodically poll the repository
+ for a list of changes, synchronizing a small amount at a time.
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 19]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ 5.4. Message summaries
+
+ Since PCs are assumed to have little in the way of disk storage, a
+ given client may never have enough room for a complete local copy
+ of a user's global mail state. This means that Pcmail's client
+ architecture must allow user's to obtain a clear picture of their
+ mail state without having all their messages present.
+
+ Descriptors provide message information without taking up large
+ amounts of storage. Each descriptor contains a summary of
+ information on a message. This information includes the message
+ UID, its length in bytes and lines, its status (encoded in the
+ eight system-defined and eight user-defined flags), and portions
+ of its RFC-822 header (the "to:", "from:", "subject:" and "date:"
+ fields). All of this information can be encoded in a small
+ (around 100 bytes) data structure whose length is independent of
+ the size of the message it describes.
+
+ Any client should be able to store a complete list of message
+ descriptors with little problem. This allows a user to get a
+ complete picture of his mail state without having all his messages
+ present locally. Short messages can reside on the client, along
+ with the descriptors, and long messages can either be printed via
+ the DMSP print-message operation, or specially pulled over via the
+ fetch-message-text operation.
+
+6. Typical Client-Repository Interaction
+
+ The following example describes a typical communication session
+ between the repository and a client. The client is one of three
+ belonging to user "Fred". Its name is "office-client", and since
+ Fred uses the client regularly to access his mail, the client is
+ marked as "active". Fred has two mailboxes: "main" is where all of
+ his current mail is stored; "archive" is where messages of lasting
+ importance are kept. The example will run through a simple
+ synchronization operation followed by a series of typical mail state
+ manipulations. Typically, the synchronization will be performed by
+ an application program that connects to the repository, logs in,
+ synchronizes, and logs out.
+
+ For the example, all DMSP operations will be shown in a user-readable
+ format. In reality, the operations would be sent as a stream of USP
+ blocks consisting of a block-type number followed by a stream of
+ bytes representing the block's arguments. Both the block name and its
+ number are included for convenience.
+
+
+
+
+Clark & Lambert [Page 20]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ In order to access his global mail state, the client software must
+ authenticate Fred to the repository; this is done via the DMSP login
+ operation:
+
+ 600 (login) ["fred", "ajyr63ywg", "office-client",
+ FALSE, FALSE]
+
+ This tells the repository that Fred is logging in via
+ "office-client", and that "office-client" is identified by an
+ existing client object attached to Fred's user object. The second
+ login block argument in an encrypted version of Fred's password. The
+ final argument tells the repository that Fred's client is not
+ operating in batch mode but rather in interactive mode.
+
+ Fred's authentication checks out, so the repository logs him in,
+ acknowledging the login request with an OK block.
+
+ Now that Fred is logged in, he wants to bring
+ "office-client"'s local mail state up to date. To do this, the
+ client program asks for an up-to-date list of mailboxes:
+
+ 800 (list-mailboxes) []
+
+ The repository replies with:
+
+ 801 (mailbox-list) [["main", 10, 1, 253],
+ ["archive", 100, 0, 101]]
+
+ This tells the client that there are two mailboxes, "main" and
+ "archive". "Main" has 10 messages, one of which is unseen. The next
+ incoming message will be assigned a UID of 253. "Archive", on the
+ other hand, has 100 message, none of which are unseen. The next
+ message sent to "archive" will be assigned the UID 101. There are no
+ new mailboxes in the list (if there were, the client program would
+ create them. On the other hand, if some mailboxes in the client's
+ local list were not in the repository's list, the program would
+ assume them deleted by another client and delete them locally as
+ well).
+
+ To synchronize the client need only look at each mailbox's contents
+ to see if (1) any new mail has arrived, or (2) if Fred changed any
+ messages on one of his other two clients subsequent to
+ "office-client"'s last connection to the repository.
+
+ The client asks for any changed descriptors via the
+ "get-changed-descriptors" operation. It requests at most ten changed
+ descriptors since storage is very tight on "office-client".
+
+
+Clark & Lambert [Page 21]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ 1105 (get-changed-descriptors) ["main", 10]
+
+ The repository responds with:
+
+ 1103 (descriptor-list) [[descriptor[
+ 6,
+ [T T F F F F F F F F F F F F F F],
+ "Fred@borax",
+ "Joe@fab",
+ "Wed, 23 Jan 86 11:11 EST",
+ "tomorrow's meeting",
+ 621,
+ 10]]
+ [descriptor[
+ 10,
+ [F T F F F F F F F F F F F F F F],
+ "Fred",
+ "Freds-secretary",
+ "Fri, 25 Jan 86 11:11 EST",
+ "Monthly progress report",
+ 13211,
+ 350]]
+ ]
+
+ The first descriptor in the list is one which Fred deleted on another
+ client yesterday. "Office-client" marks the local version of the
+ message as deleted. The second descriptor in the list is a new one.
+ "Office-client" adds the descriptor to its local list. Since both
+ changes have now been recorded locally, the descriptors can be reset:
+
+ 1106 (reset-descriptors) ["main", 2]
+
+ The repository clears each descriptor's update vector bit
+ corresponding to "office-client"'s client object. "Main" has now
+ been synchronized. The client now turns to Fred's "archive" mailbox
+ and asks for the first ten changed descriptors.
+
+ 1105 (get-changed-descriptors) ["archive", 10]
+
+ The repository responds with
+
+ 1103 (descriptor-list) []
+
+ The zero-length list tells "office-client" that no descriptors have
+ been changed in "archive" since its last synchronization. No new
+ synchronization needs to be performed.
+
+
+
+Clark & Lambert [Page 22]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ Fred's client is now ready to pull over the new message so Fred can
+ read it. The message is 320 lines long; there might not be
+ sufficient storage on "office-client" to hold the new message. The
+ client tries anyway:
+
+ 1107 (fetch-message-text) ["main", 10]
+
+ The repository begins transmitting the message:
+
+ 1110 (message) ["From: Fred's-secretary",
+ "To: Fred",
+ "Subject: Monthly progress report",
+ "Date: Fri, 25 Jan 86 11:11 EST",
+ "",
+ "Dear Fred,",
+ "Here is this month's progress report",
+ ...
+ ]
+
+ Halfway through the message transmission, "office-client" runs out of
+ disk space. Because all DMSP operations are defined to be atomic,
+ the portion of the message already transmitted is destroyed locally
+ and the operation fails. "Office-client" informs Fred that the
+ message cannot be pulled over because of a lack of disk space. The
+ synchronization process is now finished and Fred's client logs out.
+
+ 601 (logout) []
+
+ The repository does any housecleaning it needs to do, acknowledges
+ the logout request, and closes the USP connection.
+
+7. A Current Pcmail Implementation
+
+ The following section briefly describes a current implementation of
+ Pcmail that services a small community of users. The Pcmail
+ repository runs under UNIX on a DEC VAX-750 connected to the
+ Internet. The clients are IBM PCs, XTs, and ATs. The network
+ software that communicates with the repository allows only
+ "batch-mode" operation. Users make local state changes, which are
+ queued until the client connects to the repository. At that time,
+ the changes are performed and the local and global states
+ synchronized. The client then disconnects from the repository.
+
+ Users access and modify their local mail state via a user interface
+ program. The program uses windows and a full-screen mode of
+ operation. Users are given a rich variety of commands to operate on
+
+
+
+Clark & Lambert [Page 23]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ individual messages as well as mailboxes. The interface allows use
+ of any text editor to compose messages, and adds features of its own
+ to make RFC-822-style header composition easier.
+
+ Synchronization and the processing of queued changes is performed by
+ a separate program, which the user runs whenever he wishes. The
+ program takes any actions queued while operating the user interface,
+ and converts them into DMSP operations. All queued changes are made
+ before any synchronization is performed.
+
+ The limitation of client operation to batch mode was made for the
+ following reasons: first, the implementation is slanted toward use of
+ portable computers as clients. These computers are rarely connected
+ to the network, making interactive mode unnecessary. Those clients
+ that are constantly connected to the network run slightly less
+ efficiently than they could (since users must make changes locally
+ and then run the action-processing/synchronization program, rather
+ than simply making changes interactively).
+
+ Another important reason for limiting operation to batch mode is that
+ it allows a very simple locking scheme to prevent problems raised by
+ concurrent state updates. A user may have several clients; it is
+ therefore likely that the repository could get into a variety of
+ inconsistent states as different clients try to change the
+ repository's global mail state at the same time. To prevent these
+ inconsistencies, a user's mail state is locked as soon as a client
+ connects to the repository. The lock is released when the client
+ disconnects from the repository. This locking scheme is simple to
+ implement, but makes interactive-mode operation very cumbersome: if a
+ user remains constantly connected to the network (i.e. in interactive
+ mode), the repository would be unavailable to any of the user's other
+ clients for an unacceptable length of time.
+
+8. Conclusions
+
+ Pcmail is now used by a small community of people at the MIT
+ Laboratory for Computer Science. The repository design works well,
+ providing a fairly efficient means of storing and maintaining mail
+ state for several users. Members of another research group at LCS
+ are currently working on a replicated, scaleable version of the
+ repository designed to support a very large community of users with
+ high availability. This repository also uses DMSP and has
+ successfully communicated with clients that use the current
+ repository implementation. DMSP therefore seems to be useable over
+ several flavors of repository design. The clients, being PCs, are
+ unfortunately very limited in the way of resources, making local mail
+ state manipulation difficult at times. Synchronization is also
+
+
+Clark & Lambert [Page 24]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ relatively time consuming due to the low performance of the PCs. The
+ "batch-mode" of client operation is very useful for portable
+ computers that spend a large percentage of their time unplugged and
+ away from a network. It is somewhat less useful for the majority of
+ the clients, which are always connected to the network and could make
+ good use of an "interactive-mode" state manipulation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 25]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+I. DMSP Protocol Specification
+
+ Following is a list of DMSP block types and DMSP operations by object
+ type. Again, "=>" marks blocks flowing from client to repository;
+ "<=" marks blocks flowing from repository to client.
+
+ General operations:
+
+ => or <= 503 (abort-request) [why:str]
+ (no acknowledgement)
+
+ => 504 (start-debug) []
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 505 (end-debug) []
+ <= 500 (ok) []
+
+ => 506 (send-version) [version:card]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 507 (log-message) [message:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 508 (send-message) [message:seq[str]]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ User operations:
+
+ => 600 (login) [name:str, password:str,
+ client:str, create-client-object?:bool
+ batch-mode-flag:bool]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str] |
+ 705 (force-client-reset) []
+
+ => 601 (logout) []
+ <= 500 (ok) []
+
+ => 602 (add-user) [name:str, password:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+
+
+
+Clark & Lambert [Page 26]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ => 603 (remove-user) [user:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 604 (set-password) [old:str, new:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Client operations:
+
+ => 700 (list-clients) []
+ <= 701 (client-list) [client-list:seq[
+ rec[name:str], status:card]]
+
+ => 702 (add-client) [client:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 703 (remove-client) [client:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 704 (reset-client) [client:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Mailbox operations:
+
+ => 800 (list-mailboxes) []
+ <= 801 (mailbox-list) [mailbox-list:seq[
+ rec[mailbox:str,
+ next-uid:lcard,
+ num-msgs:card,
+ num-unseen-msgs:card]]]
+
+ => 802 (add-mailbox) [mailbox:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 803 (remove-mailbox) [mailbox:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 808 (expunge-mailbox) [mailbox:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+
+
+Clark & Lambert [Page 27]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ => 809 (reset-mailbox) [mailbox:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Address operations:
+
+ => 804 (list-addresses) [mailbox:str]
+ <= 501 (failure) [why:str] |
+ 805 (address-list) [address-list:seq[str]]
+
+ => 806 (add-address) [mailbox:str, address:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 807 (remove-address) [mailbox:str, address:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ Message operations:
+
+ => 1100 (get-descriptor-flags) [mailbox:str, uid:lcard]
+ <= 1101 (descriptor-flags) [flags:seq[bool]] |
+ 501 (failure) [why:str]
+
+ => 1102 (get-descriptors) [mailbox:str,
+ low-uid:lcard,
+ high-uid:lcard]
+ <= 501 (failure) [why:str] |
+ 1103 (descriptor-list) [descriptor-list:seq[
+ ch[
+ expunged[uid:lcard],
+ descriptor[rec[uid:lcard,
+ flags:seq[bool],
+ from-field:str,
+ to-field:str,
+ date-field:str,
+ subject-field:str,
+ nun-bytes:lcard,
+ num-lines:lcard]
+ ]]]]
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 28]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ => 1105 (get-changed-descriptors) [mailbox:str,
+ max-to-send:card]
+ <= 501 (failure) [why:str] |
+ 1103 (descriptor-list) [descriptor-list:seq[
+ ch[
+ expunged[uid:lcard],
+ descriptor[rec[uid:lcard,
+ flags:seq[bool],
+ from-field:str,
+ to-field:str,
+ date-field:str,
+ subject-field:str,
+ num-bytes:lcard,
+ num-lines:lcard]
+ ]]]]
+
+ => 1106 (reset-changed-descriptors) [
+ mailbox:str,
+ start-uid:lcard,
+ end-uid:lcard]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 1107 (get-message-text) [mailbox:str,
+ uid:lcard]
+ <= 501 (failure) [why:str] |
+ 1110 (message) [message:seq[str]]
+
+ => 1108 (print-message) [mailbox:str,
+ uid:lcard,
+ printer-name:str]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 1109 (set-flag) [mailbox:str,
+ uid:lcard,
+ flag-number:card,
+ flag-setting:bool]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+ => 1111 copy-message[source-mailbox:str,
+ target-mailbox:str,
+ source-uid:lcard]
+ <= 500 (ok) [] |
+ 501 (failure) [why:str]
+
+
+
+Clark & Lambert [Page 29]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ DMSP block types by number
+
+ General block types
+
+ ok 500
+ failure 501
+ abort-request 503
+ start-debug 504
+ end-debug 505
+ send-version 506
+ log-message 507
+ send-message 508
+
+ User operation block types
+
+ login 600
+ logout 601
+ add-user 602
+ remove-user 603
+ set-password 604
+
+ Client operation block types
+
+ list-clients 700
+ client-list 701
+ add-clien 702
+ remove-client 703
+ reset-client 704
+ force-client-reset 705
+
+ Mailbox operation block types
+
+ list-mailboxes 800
+ mailbox-list 801
+ add-mailbox 802
+ remove-mailbox 803
+ expunge-mailbox 808
+ reset-mailbox 809
+
+
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 30]
+
+
+
+RFC 984 May 1986
+PCMAIL
+
+
+ Address operation block types
+
+ list-addresses 804
+ address-list 805
+ add-address 806
+ remove-address 807
+
+ Message operation block types
+
+ get-descriptor-flags 1100
+ descriptor-flags 1101
+ get-descriptors 1102
+ descriptor-list 1103
+ get-changed-descriptors 1105
+ reset-changed-descriptors 1106
+ get-message-text 1107
+ print-message 1108
+ set-flag 1109
+ message 1110
+ copy-message 1111
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Clark & Lambert [Page 31]
+