Internet Engineering Task Force I. Radu, Ed.
Internet-Draft October 12, 2015
Intended status: Informational
Expires: April 14, 2016

Advanced Groupware Access Protocol
draft-iulian-advanced-groupware-access-protocol-12

Abstract

The Advanced Groupware Access Protocol, (AGAP) allows a client to access and store electronic mail messages, contacts, events, files, and configurations on a server. The electronic mail messages can be grouped in folders. AGAP also provides the capability for an offline client to resynchronize with the server.

AGAP does not specify a means of posting electronic mail messages; this function is handled by a mail transfer protocol such as SMTP [RFC2821] . It also does not specify a means for exchanging messages with contacts that are reported as being online; this function is handled by an instant messaging protocol such as XMPP [RFC3921] .

AGAP includes the following operations for electronic mail messages: creating, deleting, renaming, moving and coping mail folders; checking for new messages; permanently removing messages; moving and coping messages between folders; fetching information about a message; setting and clearing tags for messages; searching in messages; retrieving only a part of a message; marking messages as SPAM; deleting attachments from a message.

AGAP includes the following operations to manipulate the contacts: creating, deleting, moving, coping, tagging, and searching contacts; checking if a contact is online; fetching information about a contact.

AGAP includes the following operations related to the use of the events: creating, deleting, moving, coping and tagging events in calendar; fetching events details; searching for events.

All items are read and written in format XML encoded UTF-8 [RFC3629] and each item is identified by a unique alphanumeric identifier.

AGAP is designed to support access only to a single server per connection. It is also designed to balance the volume of text exchanged between the server and clients and its readability by humans for debugging.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on April 14, 2016.

Copyright Notice

Copyright (c) 2015 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.


Table of Contents

1. How to Read This Document

1.1. Organization of This Document

This document is written from the point of view of someone implementing an AGAP client or server, and also from the point of view of a server administrator. The protocol overview (chapter 2) presents all aspects related to a correct implementation (like the maximum length of a command or response line, charset used). The material in chapter 3 through 5 provides the states in which can be a connection at a moment, respectively what commands are valid in each state and their valid responses. Chapter 6 makes a summary of the return codes for each command. The implementers find in chapter 7 samples of conversations so that they can test the compliance of their applications with this standard.

1.2. Conventions Used in This Document

Document conventions are noted in this chapter. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT","MAY", and "OPTIONAL" in this document are to be interpreted as described in 'Key words for use in RFCs to Indicate Requirement Levels' [RFC2119] . The word "CAN" (not "MAY") is used to refer to a possible circumstance or situation, as opposed to an optional facility of the protocol.

"User" is used to refer to a human user. "Client" refers to the software being run by the user. "Server" refers to the software responding to the client requests. In examples, "C:" and "S:" indicate lines sent by the client and server respectively. "Connection" refers to the entire sequence of client/server interaction from the initial establishment of the network connection until its termination. "Conversation" is an exchange of commands and responses between the client and the server. "Account" defines all folders and their content that can be accessed from Authenticated State. All references to characters order is according to the UTF-8 [RFC3629] specification.

2. Protocol Overview

2.1. Charset Used for Commands and Responses

All data exchanged between the server and the client is done using strings encoded UTF-8 [RFC3629] . If the server or client send a string incorrect encoded then the other side can close immediately the connection.

2.2. Maximal Length of a Command or Response Line

A command or response consists of a line of text that has a maximal length of 1024 characters (including line end). A line of text is ended with the character LF (0x0A). There can be optionally a CR character (0x0D) before the LF character. If the server or client sends a line with a length greater of 1024 then the other side can close immediately the connection.

2.3. Numbers in Commands and Responses

The numbers that are used in commands are signed integers on 32 bits. The valid values are between -2,147,483,648 and 2,147,483,647.

2.4. Regular Expressions in Commands

Following is a resume of all regular expression rules that CAN be used by the commands defined in this standard:

    Logical operators:
XY       X followed by Y
X|Y      Either X or Y

    Predefined character class:
.        Any character (does not match line terminators)

    Characters:
x        The character x
\\       The backslash character
\xhh     The character with hexadecimal value 0xhh
\uhhhh   The character with hexadecimal value 0xhhhh
\t       The tab character ('\x09')
\n       The newline (line feed) character ('\x0A')
\r       The carriage-return character ('\x0D')

    Character classes:
[abc]     a, b, or c (simple class)
[^abc]    Any character except a, b, or c (negation)
[a-zA-Z]  a through z or A through Z, inclusive (range)

    Boundary matchers:
^        The beginning of a line
$        The end of a line
\b       A word boundary
\B       A non-word boundary

    Greedy quantifiers:
X?       X, once or not at all
X*       X, zero or more times
X+       X, one or more times
X{n}     X, exactly n times
X{n,}    X, at least n times
X{n,m}   X, at least n but not more than m times

    Reluctant quantifiers:
X??      X, once or not at all
X*?      X, zero or more times
X+?      X, one or more times
X{n}?    X, exactly n times
X{n,}?   X, at least n times
X{n,m}?  X, at least n but not more than m times
              

Figure 1

2.5. Unique Identification Numbers (UID)

The length of an UID is between 1 and 32 characters.

The UIDs MUST to be unique only between items from the same folder.

The characters accepted for building an UID are only all 26 Latin letters (A-Z) in lowercase and uppercase and all 10 Latin digits (0-9). An UID is case sensitive and it is the same for each connections, except after server change it and announce the change by changing the ECID assigned to the corresponding folder.

Any new item MUST have a bigger UID as all other existing items in the selected folder. The sorting is made according UTF-8 [RFC3629] (digits before letters and uppercase letters before the lowercase letters - 0..9A..Za..z). A shorter UID is before a longer one (9234 before 02345) and any zero (0) before a number is take into account by the server when two UIDs are compared.

We get an approximately maximum number of 4.50+e+17 unique combinations for 32 characters long UIDs. We get a maximum number of 3381098545 unique combinations for 8 characters long UIDs.

2.6. Folder Change Identification Numbers (FCID)

An FCID has the same format as a normal UID and each new value of an FCID is bigger as the precedent one (as is described for UIDs). An FCID is changed for a folder when the structure of the folder is changed (subfolders are added or removed). The FCID of a folder is not changed if it is changed the (sub)child of one of its children.

2.7. Entries Change Identification Numbers (ECID)

An ECID has the same format as a normal UID and each new value of an ECID is bigger as the precedent one (as is described for UIDs). If the last ECID has already had the biggest valid UID value then its new value can be the first valid UID value. An ECID is changed for a folder when items ware added or removed. Or when the server had changed the UIDs assigned to the items. This can be necessary if, for example, there is a new item and already last valid UID was assigned to an other item. The new UIDs must keep the items in the same order as before the renumbering.

2.8. Representation of Text and Binary Content in XML Bodies

Binary content must be encoded using the BASE64 [RFC4648] method and the corresponding tag must have the ENCODED attribute set to "base64" (if it is not assumed as default encoding method). All BASE64 encoded content found in one line must have a length divisible by 4. The server can refuse an encoded content having a length not divisible by 4 in a line.

A text content can be passed as it is ( UTF-8 [RFC3629] ) or it can be encoded using the BASE64 [RFC4648] method. The corresponding tag must have the ENCODED attribute set to "utf-8", in case of plain text, and to "base64", if the content was encoded using the BASE64 method.

2.9. SRV record

An SRV record (Service record) defines the location in the DNS (Domain Name System) of a server providing a specified service. It is defined in RFC 2782 [RFC2782] . A non-secured port is searched with _agap and a secured port with _agaps as _service name.

An SRV record has the form:

_service._proto.name ttl IN SRV priority weight port target

The following textual item can be used to specify the location of an AGAP service:

_agap._tcp.example.com. 86400 IN SRV 0 5 143 agapserver.example.com.

The following textual item can be used to specify the location of a secured AGAP port (via SSL):

_agaps._tcp.example.com. 86400 IN SRV 0 5 993 agapserver.example.com.

2.10. Folders

2.10.1. Naming

All folder names are case sensitive and they are encoded according to UTF-8 [RFC3629] .

A backslash (\) does not escape the character after it (it has no special meaning).

For building a folder name, the user CAN use all UTF-8 [RFC3629] characters with a value bigger then 0x1f (white space is the first allowed character), but with the exception of the slash (/ 9x2F), back slash (\ 0x5C), multiplication sign (* 0x2A), and question mark (? 0x3F).

The following folder names are also not accepted: '.', and '..'.

2.10.2. Hierarchy

None of the reserved folders can have subfolders, exception makes TRASH that must store also deleted folders and FILESHARE that holds ordinary files.

The character used for delimiting path levels is the slash (/). A path that starts with '/' represents an absolute path. All other are relative to currently selected folder (with SLCT).

If there is no folder currently selected then the client MUST use only absolute paths. It is recommended for a client to use always absolute paths.

2.10.3. Folder Types

The following folder types are defined by this standard:

Each of these types allow for subfolders in them.

2.10.4. Reserved Folders

All the following reserved folders are located in the root of the user's account:

A client can use different names for these folders when display them so that the client application can use localization and standard or customized names for them. If this is the case, then the user cannot create a folder, in the root of his account, with the same name as the real (reserved) name of the folder.

2.11. Tags

2.11.1. Syntax

The client can set tags for folder and folder items. The tags of a folder are reported by the STAT command and can be read with GFTG. The tags of an item can be get with GTAG. The tags of a server can be set with SFTG, and the tags for folder items with STAG.

The format of a tag is a name optionally followed by the equal sign (=) and a value. Each time a tag is set, the new value replace the old one. All tags that have no value assigned are returned only as names. Assigning an empty value to a tag makes it to return a name followed by the equal sign and no value. Setting a tag without a value for an item which previously had the same tag with a value makes the tag to lose its value and to be returned as name only (without the equal sign).

The characters accepted for building a TAG are only all 26 Latin letters (A-Z) in uppercase, all 10 Latin digits (0-9) and the minus sign (-). A TAG is case insensitive. Its length is between 1 and 32 characters.

The characters accepted for a TAG value are only all 26 Latin letters (A-Z) in lowercase and uppercase, all 10 Latin digits (0-9), plus the minus (-), underscore (_) and dot (.) characters. A TAG value is case sensitive. Its length is between 1 and 32 characters.

The server returns always the TAG names in uppercase, even if the client set them using a lowercase version. The server should convert silently any lowercase character in a TAG name (sent by client) to its corresponding uppercase character.

2.11.2. Reserved Tag Names

The following tag names have a meaning set by this standard for folders:

Implicit the folder's items can be read only by its owner.

The following tag names have a meaning set by this standard for messages:

2.12. Folder's Access Rights and Access Control List (ACL)

An access right is represented by a letter between a and z, respectivelly between A and Z. A minus '-' sign means no rights. A lowercase letter represents a different right then its uppercase version.

This document defines following rights:

The ACL of a folder is made from pairs of rights and an account pattern. By default the ACL of a folder cannot be changed by user and an user have no rights. The rights for an user are the union of all rights found for matching account patterns. For the state STORING and PRESENCE, the rights are checked only at the access moment.

The account pattern is a regexp as defined in chapter 2.4 Regular Expressions in Commands .

2.13. The Responses for Each Type of Folder

2.13.1. Format and Conventions

All responses are in XML format. The tags and their attributes names are written only in uppercase. The values for attributes only in lowercase. The exception are header items for a message. The tags keep the case from the message.

The content is encoded in UTF-8 [RFC3629] format.

Each type of folder returns its items in a different format.

Each tag written in uppercase must to be send as it is, each tag written in lowercase will be replaced with the right value at the time of generation.

Each tag that have a question mark will be present only once if it is the case and without the question mark.

Each tag that have a star will be present, possible many times, only if it is the case and without the star.

If a command is correct but the server cannot execute it because of an internal error, then the server returns the code 401.

2.13.2. Response for Audio Note Folders

A response holding the content of an audio note has the following structure:

<AUDIO-NOTE>
    <SUBJECT>...</SUBJECT>
    <CONTENT type="text/..." encoded="utf-8|base64">...</CONTENT>
    <AUDIO>...</AUDIO>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</AUDIO-NOTE>
              

Figure 2

Note: the subject can be any short text. The content can be encoded UTF-8 or BASE64. Implicit is content encoded in utf-8. The type can be any subtype of 'text/*'. Implicit is 'text/plain'. It is recommended to be used only 'text/plain' and 'text/html'. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Note: the audio represents the bytes of a linear PCM encoding of one channel having a frame rate of 8000 and 8 bits per sample, signed and in little endian order. These bytes are encoded BASE64.

Example:

<AUDIO-NOTE>
    <SUBJECT>Important speaker recorded</SUBJECT>
    <CONTENT type="text/plain" encoded="utf-8">
        Listen the audio.</CONTENT>
    <AUDIO>AAD//...</AUDIO>
</AUDIO-NOTE>
              

Figure 3

2.13.3. Response for Bookmark Folders

A response holding the content of a bookmark has the following structure:

<BOOKMARK>
    <SUBJECT>...</SUBJECT>
    <URL>https?://...</URL>
    <CONTENT type="text/..." encoded="utf-8|base64">...</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</BOOKMARK>
              

Figure 4

Note: the subject can be any short text. The URL must start with http:// or https://. The content can be encoded UTF-8 or BASE64. Implicit is content encoded in utf-8. The type can be any subtype of 'text/*'. Implicit is 'text/plain'. It is recommended to be used only 'text/plain' and 'text/html'. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<BOOKMARK>
    <SUBJECT>The best search engine</SUBJECT>
    <URL>http://www.google.com/</URL>
    <CONTENT type="text/plain" encoded="utf-8">
        Use it every day.</CONTENT>
</BOOKMARK>
              

Figure 5

2.13.4. Response for Calendar Folders

A calendar entry represents a non repetitive or repetitive action who took a specified amount of time. The format for a timestamp is: yyyy-mm-dd hh:mm:ss. All times are UTC/GMT times according Representation of dates and times [ISO.8601.1988]. The DESCRIPTION must be BASE-64 encoded if there are empty lines present. Implicitly the description is in UTF-8, but if it is BASE-64 encoded then there must be present 'encoded="base64"'. The implicit type of description is text/plain, but it can be also text/html.

The VERSION of a calendar entry is used when there are sent updates. Each new version must have a higher number.

The CONTENT has an implicit type of text/plain.

The list of weekdays are:

  • MO - monday
  • TU - tuesday
  • WE - wednesday
  • TH - thursday
  • FR - friday
  • SA - satuerday
  • SU - sunday

The LOCATION is a two fields record, with a TAB character (UTF-8 code 9) delimiting the two fields. It is represented bellow as \t.

The ALARM represents the timestamp in UTC when the alarm must be triggered.

A response holding the content of a calendar entry has the following structure:

<CALENDAR>
    <UID>a_unique_string</UID>
    <VERSION>version_as_a_number</VERSION>
    <AUTHOR>author@domain</AUTHOR>
    <SUBJECT>a subject</SUBJECT>
    <STATUS>DECLINED|NEEDS-ACTION|ACCEPTED|another status</STATUS>
    <FREE_BUSY>FREE|TENTATIVE|BUSY|OUT OF OFFICE|other</FREE_BUSY>
    <LOCATION>location name\tlocation address</LOCATION>
    <LOCATION-MAX-CAPACITY>max-available</LOCATION-MAX-CAPACITY>
    <LOCATION-USED-CAPACITY>occupated</LOCATION-USED-CAPACITY>
    <START>yyyy-mm-dd hh:mm:ss</START>
    <END>yyyy-mm-dd hh:mm:ss</END>
    <CONTENT type="text/..." encoded="utf-8|base64">
             description</CONTENT>
    <ATTENDEE attending="required|optional"
    answer="not-invited|not-answered|rejected|attempting|accepted">
             attendee_as_name_or_email</ATTENDEE>...
    <RESOURCE>resource_as_name_or_email</RESOURCE>...
    <CATEGORY>a category</CATEGORY>...
    <ALARM signal='audio|popup|email' email='email@address,...'>
           yyyy-mm-dd hh:mm:ss</ALARM>
    <JOURNAL>path_to_jrnl_folder</JOURNAL>...
    <REPEAT-RULES>?
        <DAYS>weekday,..</DAYS>?
    </REPEAT-RULES>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</CALENDAR>
              

Figure 6

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<CALENDAR>
    <UID>CALENDAR-UIDx1234:author@domain</UID>
    <VERSION>1</VERSION>
    <AUTHOR>author@domain</AUTHOR>
    <SUBJECT>To improve the draft for AGAP</SUBJECT>
    <STATUS>ACCEPTED</STATUS>
    <FREE_BUSY>BUSY</FREE_BUSY>
    <LOCATION>Tower Office    Landstrasse, Wien</LOCATION>
    <START>2014-02-15 10:40:00</START>
    <END>2014-03-25 15:59:59</END>
    <CONTENT type="text/plain" encoded="utf-8">
        Improved AGAP</CONTENT>
    <ATTENDEE attending="required" answer="accepted">
        iulian.radu@gmx.at</ATTENDEE>
    <RESOURCE>PC</RESOURCE>
    <CATEGORY>IETF_Drafts</CATEGORY>
    <ALARM type='popup'>-300</ALARM>
    <JOURNAL>/journal/projectX</JOURNAL>
    <REPEAT-RULES>
        <DAYS>MO,TU,WE,TH,FR</DAYS>
    </REPEAT-RULES>
</CALENDAR>
              

Figure 7

2.13.5. Response for Configuration Folders

A response holding the configuration has the following structure:

<CONFIGURATION>
    <name>value</name>...
</CONFIGURATION>
              

Figure 8

Example:

<CONFIGURATION>
    <CHECK-EACH-MIN>10</CHECK-EACH-MIN>
    <QUOTA>1024</QUOTA>
</CONFIGURATION>
              

Figure 9

2.13.6. Response for Contact Folders

A response holding the contact information has the following structure:

<CONTACT>
    <SUBJECT>a title</SUBJECT>
    <SALES-LEAD>|Lead|Qualified|Disqualified|
    Opportunity|Customer|Former</SALES-LEAD>?
    <TITLE>Dr.|Prof.|...</TITLE>?
    <NAME>full name</NAME>
    <FOLLOWUP>yyyymmddHHMMSS+tztz</FOLLOWUP>?
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
    <GENDER>m|f|</GENDER>?
    <BIRTHDAY>yyyy-mm-dd</BIRTHDAY>?
    <PHOTO type='image/...'>photo encoded base64</PHOTO>?
    <JOURNAL>/path/to/journal</JOURNAL>?
    <CALENDAR>/path/to/calendar</CALENDAR>?
    <COMPANY>company name</COMPANY>?
    <JOB-TITLE>job title</JOB-TITLE>?
    <WORK-DAYS>working day,...</WORK-DAYS>?
    <WORK-HOURS>hh:mm hh:mm hh:mm hh:mm</WORK-HOURS>?
    <WORK-ADDRESS>company address</WORK-ADDRESS>*
    <WORK-PHONE>company phone number</WORK-PHONE>*
    <FAX>fax</FAX>?
    <WORK-EMAIL>name &lt;email&gt;</WORK-EMAIL>*
    <WORK-WEB name='name'>https?://...</WORK-WEB>*
    <DEPUTY-NAME>assistent name</DEPUTY-NAME>?
    <DEPUTY-PHONE>assisten phone number</DEPUTY-PHONE>?
    <HOME-ADDRESS>address at home</HOME-ADDRESS>*
    <HOME-PHONE>phone number at home</HOME-PHONE>*
    <HOME-EMAIL>name &lt;email&gt;</HOME-EMAIL>*
    <HOME-WEB name='name'>https?://...</HOME-WEB>*
    <MESSAGE type="text/..." encoded="utf-8|base64">a message</MESSAGE>
    <CONTENT type="text/..." encoded="utf-8|base64">a note</CONTENT>
</CONTACT>
              

Figure 10

GENDER has m for male, f for female and nothing for unknown. BIRTHDAY has the date in UTC. The list of weekdays are:

  • MO - monday
  • TU - tuesday
  • WE - wednesday
  • TH - thursday
  • FR - friday
  • SA - satuerday
  • SU - sunday

Example:

<CONTACT>
    <SUBJECT>Iulian Radu</SUBJECT>
    <TITLE>DI</TITLE>
    <NAME>Iulian Radu</NAME>
    <GENDER>m</GENDER>
    <PHOTO type='image/jpeg'>ABCDEFGHIJ==</PHOTO>
    <WORK-DAYS>MO,TU,WE,TH,FR</WORK-DAYS>
    <WORK-HOURS>09:00 12:00 13:00 17:00</WORK-HOURS>
    <WORK-EMAIL>Iulian Radu &lt;iulian.radu@gmx.at&gt;</WORK-EMAIL>
    <CONTENT type="text/plain" encoded="utf-8">author</CONTENT>
</CONTACT>
              

Figure 11

2.13.7. Response for File Folders

A response holding the content of a file has the following structure:

<FILE>
    <SUBJECT>filename</SUBJECT>
    <TYPE>mime/type</TYPE>
    <SIZE>size</SIZE>
    <AUTHOR>author@domain</AUTHOR>?
    <DESCRIPTION encoded="utf-8|base64">a short text</DESCRIPTION>
    <CONTENT encoded="utf-8|base64">content</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</FILE>
              

Figure 12

The valid encodings type are: utf-8 and base64. The default encoding is utf-8. The size is in bytes. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<FILE>
    <SUBJECT>Example.txt</SUBJECT>
    <TYPE>text/plain</TYPE>
    <SIZE>6</SIZE>
    <DESCRIPTION>my first example</DESCRIPTION>
    <CONTENT encoded="base64">c3VyZS4=</CONTENT>
</FILE>
              

Figure 13

2.13.8. Response for Filter Folders

An ruleOp can be: AND, OR, NOT, UID, TAG, HAS, IS, WILDCARD, REGEXP or NEW. The value associated to ruleOp is specified as an XML text node. The HAS has one attribute: PATH. The IS, WILDCARD and REGEXP tags have two attributes: PATH and OP. Their values are set as for a filter command (see chapter 4.3 Syntax of a Filter for more information). The tag RULES group all its rules in an AND group.

There must be assigned at least one folder and must be present at least a rule. Optionally can be gived a description using ABOUT tag. Cannot be assigned as folders for being searched folders of the following types: FILT and FOLD.

A response holding the content of a file has the following structure:

<FILTER>
    <ABOUT>...</ABOUT>?
    <FOLDERS>
        <FOLDER>...</FOLDER>...
    </FOLDERS>
    <RULES>
        <ruleOp>...</ruleOp>...
    </RULES>
</FILTER>
              

Figure 14

Example:

<FILTER>
    <ABOUT>A sample FILT filter.</ABOUT>
    <FOLDERS>
        <FOLDER>/INBOX</FOLDER>
        <FOLDER>/Spam</FOLDER>
    </FOLDERS>
    <RULES>
        <OR>
            <IS path="/MESSAGE/HEADER/subject" op="=">Viagra</IS>
            <AND>
                <UID>UIDx1234:UIDx4321</UID>
                <TAG>SPAM</TAG>
            </AND>
        </OR>
    </RULES>
</FILTER>
              

Figure 15

2.13.9. Response for Location Folders

A response holding the content of a location has the following structure:

<LOCATION>
    <SUBJECT>a subject</SUBJECT>
    <ADDRESS>the full address, inclusive country</ADDRESS>
    <CAPACITY>maximum-capacity|0</CAPACITY>
    <CALENDAR>associated-calendar</CALENDAR>
    <CONTENT encoded='utf-8|base64' type='text/...'>
    a description</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
    <LAT>lat.itude</LAT>
    <LNG>lon.gitude</LNG>
</LOCATION>
              

Figure 16

The default encoding for CONTENT is utf-8. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color. maximum-capacity is 0 if unknown.

Example:

<LOCATION>
    <SUBJECT>Main Office</SUBJECT>
    <ADDRESS>Landstraße 1, Wien, Austria</ADDRESS>
    <CONTENT encoded='utf-8' type='text/html'>The address of
    the main office.</CONTENT>
    <CATEGORY>Client</CATEGORY>
</LOCATION>
              

Figure 17

2.13.10. Response for Internet Radio Folders

A response holding the content of a radio has the following structure:

<RADIO>
    <SUBJECT>...</SUBJECT>
    <URL>https?://...</URL>
    <TYPE>audio/...</TYPE>
    <GENRE>...</GENRE>
    <CONTENT type="text/..." encoded="utf-8|base64">...</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</RADIO>
              

Figure 18

Note: the subject can be any short text. The URL must start with http:// or https://. The content can be encoded UTF-8 or BASE64. Implicit is content encoded in utf-8. The type can be any subtype of 'text/*'. Implicit is 'text/plain'. It is recommended to be used only 'text/plain' and 'text/html'. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<RADIO>
    <SUBJECT>Hits24</SUBJECT>
    <URL>http://streaming208.radionomy.com:80/Hits-24</URL>
    <TYPE>audio/mpeg</TYPE>
    <GENRE>infos pistes pop rock top40</GENRE>
    <CONTENT type="text/plain" encoded="utf-8">
        Use it every day.</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</RADIO>
              

Figure 19

2.13.11. Response for Japp Folders

A response holding the content of a Japp has the following structure:

<JAPP>
    <SUBJECT>JAPP's name</SUBJECT>
    <ICON type="image/mime-type">icon</ICON>
    <JAR>jar file name</JAR>
    <MAIN-CLASS>main-class</MAIN-CLASS>
    <SIZE>size</SIZE>
    <DESCRIPTION encoded="utf-8|base64">a short text</DESCRIPTION>
    <CONTENT>content of the jar file</CONTENT>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</JAPP>
              

Figure 20

The default encoding for DESCRIPTION is utf-8. The ICON and CONTENT are assumed to be encoded base64. The content is a jar file having as main class the class defined in the tag MAIN-CLASS. The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<JAPP>
    <SUBJECT>Sokoban</SUBJECT>
    <ICON type="image/png">AnIcon==</ICON>
    <JAR>Sokoban.jar</JAR>
    <MAIN-CLASS>japp.Sokoban</MAIN-CLASS>
    <SIZE>9</SIZE>
    <DESCRIPTION>a short text</DESCRIPTION>
    <CONTENT>ABCDEFGHIJ==</CONTENT>
</JAPP>
              

Figure 21

The DESCRIPTION tag do not accept an encoded attribute and the text must not have in it empty lines. If the text has empty lines then the server must refuse to accept this XML.

2.13.12. Response for Journal Folders

A journal entry represents a non repetitive action who took no time. The format for a timestamp is: yyyy-mm-dd hh:mm:ss. All times are UTC/GMT times according Representation of dates and times [ISO.8601.1988]. The DESCRIPTION must be BASE-64 encoded if there are empty lines present. Implicitly the description is in UTF-8, but if it is BASE-64 encoded then there must be present 'encoded="base64"'. The implicit type of description is text/plain, but it can be also text/html. A response holding the content of a journal entry has the following structure:

<JOURNAL>
    <TIMESTAMP>yyyy-mm-dd hh:mm:ss</TIMESTAMP>
    <AUTHOR>author@domain</AUTHOR>
    <SUBJECT>a summary</SUBJECT>
    <CONTENT type="text/..." encoded="utf-8|base64">
        a description</CONTENT>
    <ATTENDEE>attendee_as_name_or_email<ATTENDEE>...
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</JOURNAL>
              

Figure 22

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<JOURNAL>
    <TIMESTAMP>2011-06-07 13:52:38</TIMESTAMP>
    <AUTHOR>user@example.com</AUTHOR>
    <SUBJECT>The AGAP was updated</SUBJECT>
    <CONTENT type="text/html">A new version of AGAP
        was uploaded to IETF</CONTENT>
    <ATTENDEE>secretary@ietf.com</ATTENDEE>
    <ATTENDEE>Iulian Radu
        &lt;iulian.radu@gmx.at&gt;</ATTENDEE>
</JOURNAL>
              

Figure 23

2.13.13. Response for Message Folders

A response holding the content of a message has the following structure:

<MESSAGE>
    <HEADER>
        <header-item-once>value</header-item-once>...
        <header-item-multi>value 1
 value 2
 ...
 value n...</header-item-multi>...
    </HEADER>
    <TEXT? encoded="utf-8|base64">main text</TEXT>
    <HTML? encoded="utf-8|base64">main html</HTML>
    <ATTACHMENT-{id}*>
        <HEADER>
            ...
        </HEADER>
        <BODY encoded="utf-8|base64">
            ...
        </BODY>
    </ATTACHMENT-{id}>...
</MESSAGE>
              

Figure 24

The first attachment id has value 1.

The id of on item tag shows the order of the items in the original message.

The default content encoding is utf-8. It is assumed that the content for TEXT and HTML is encoded in UTF-8 when the ENCODED attribut has the value base64.

The items in the header of the main message and attachments are the same with the one from the email message.

There can be at most 2,147,483,647 attachments defined and their numbers must be sequential starting with 1.

Example:

<MESSAGE>
    <HEADER>
        <from>example@no-spam.com</from>
        <to>example@example.com</to>
        <received>
            <item>
from mail.yahoo.com by example.com; Tue, 16 Mar 2010 12:14:24 +0100
            </item>
            <item>
from no-spam.com by mail.yahoo.com; Mon, 15 Mar 2010 11:13:23 +0100
            </item>
        </received>
        <content-type>multipart/mixed; boundary="XYZ"</content-type>
        <subject>A basic example</subject>
    </HEADER>
    <TEXT>Please see the attachments.</TEXT>
    <HTML>
&lt;b&gt;Please&lt;/b&gt; see the &lt;u&gt;attachments&lt;/u&gt;.
    </HTML>
    <ATTACHMENT-1/>
      <HEADER>
        <content-type>text/plain</content-type>
      </HEADER>
      <BODY encoded="utf-8">See the picture.</BODY>
    </ATTACHMENT-1>
    <ATTACHMENT-2>
      <HEADER>
        <content-type>image/jpeg</content-type>
        <content-transfer-encoding>base64</content-transfer-encoding>
      </HEADER>
      <BODY encoded="base64">c3VyZS4=</BODY>
    </ATTACHMENT-2>
</MESSAGE>
              

Figure 25

The previous example corresponds to a message with the following structure:

  • multipart/mixed
    • multipart/alternative
      • text/plain
      • text/html

    • text/plain
    • image/jpeg

2.13.14. Response for Note Folders

A response holding the content of the note has the following structure:

<NOTE>
    <SUBJECT>a title</SUBJECT>
    <CONTENT type="text/..." encoded="utf-8|base64">a note</CONTENT>
    <FOLLOWUP>yyyymmddHHMMSS+tztz</FOLLOWUP>?
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</NOTE>
              

Figure 26

Note: the subject can be any short text. The content can be encoded UTF-8 or BASE64. Implicit is content encoded in utf-8. The type can be any subtype of 'text/*'. Implicit is 'text/plain'. It is recommended to be used only 'text/plain' and 'text/html'. The followup represents when this note should be read again (checked). The fields of followup means:

  • yyyy - the year
  • mm - the year's month as a number (01 to 12)
  • dd - the month's day (01 to 31)
  • HH - the day's hour (00 to 23)
  • MM - the hour's minute (00 to 59)
  • SS - the minut's second (00 to 59)
  • +tztz - the timezone as four digits (-1200 to +1300)

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<NOTE>
    <SUBJECT>Important!</SUBJECT>
    <CONTENT type="text/plain" encoded="utf-8">
        To review the code.</CONTENT>
</NOTE>
              

Figure 27

2.13.15. Response for Symbolic Link Folders

This type of folder allows for specifying a link to an item found in an other folder. It cannot indicate an item found in an other SLNK folder.

Example:

<SYMBOLIC-LINK>
    <PATH>/Reports</PATH>
    <UID>UIDx0012345</UID>
</SYMBOLIC-LINK>
              

Figure 28

2.13.16. Response for Task Folders

A task entry represents a non repetitive action who took a specified amount of time and which can have subtasks associated. The format for a timestamp is: yyyy-mm-dd hh:mm:ss. All times are UTC/GMT times according Representation of dates and times [ISO.8601.1988]. The DESCRIPTION must be BASE-64 encoded if there are empty lines present. Implicitly the description is in UTF-8, but if it is BASE-64 encoded then there must be present 'encoded="base64"'. The implicit type of description is text/plain, but it can be also text/html.

The VERSION of a task is used when there are sent updates. Each new version must have a higher number.

The CONTENT has an implicit type of text/plain.

The PRIORITY 0 means that there was no priority assigned and the higher the number the higer is the priority. The EFFORT means how difficult it is to implement this. The BENEFIT is how high is the ROI after implementing and using this. The POINTS is a value based on PRIORITY, EFFORT and BENEFIT and it is intendet to offer a mean for ordering the tasks. The higher the number the quicker should be the task implemented. The START-DAYS and DUE-DAYS says in which days of the week the task must start or end. The list is made from two letter days names delimited with comma. The list of weekdays are:

  • MO - monday
  • TU - tuesday
  • WE - wednesday
  • TH - thursday
  • FR - friday
  • SA - satuerday
  • SU - sunday

The GLUE defines the realtion between this task and its subtasks. If there is a delay present then it is applied between the connected ends of the two tasks. If the new timestamp do not meet the requirements of START-DAYS or END-DAYS then the user should be asked for deciding the new dates.

The ALARM represents the timestamp in UTC when the alarm must be triggered.

A response holding the content of a task entry has the following structure:

<TASK>
    <UID>a_unique_string</UID>
    <VERSION>version_as_a_number</VERSION>
    <AUTHOR>author@domain</AUTHOR>
    <SUBJECT>a subject</SUBJECT>
    <STATUS>NOT-ASSIGNED|ASSIGNED|ACCEPTED|DECLINED|ON-HOLD|
    WAITING-FOR-INFO|IN-PROGRESS|READY-FOR-REVIEW|IN-REVIEW|
    APPROVED|DONE|another status</STATUS>
    <LOCATION>a location as string</LOCATION>
    <LOCATION-MAX-CAPACITY>capacity</LOCATION-MAX-CAPACITY>
    <START-EARLIEST>yyyy-mm-dd hh:mm:ss</START-EARLIEST>?
    <START-LATEST>yyyy-mm-dd hh:mm:ss</START-LATEST>?
    <START-DAYS>weekday,..</START-DAYS>?
    <START>yyyy-mm-dd hh:mm:ss</START>
    <DUE-EARLIEST>yyyy-mm-dd hh:mm:ss</DUE-EARLIEST>?
    <DUE-LATEST>yyyy-mm-dd hh:mm:ss</DUE-LATEST>?
    <DUE-DAYS>weekday,..</DUE-DAYS>?
    <DUE>yyyy-mm-dd hh:mm:ss</DUE>
    <PRIORITY>priority_as_a_number_btwn_0_and_100</PRIORITY>
    <PERCENT>percent_as_a_number_between_0_and_100</PERCENT>
    <EFFORT>effort_as_a_number_between_0_and_100</EFFORT>
    <BENEFIT>benefit_as_a_number_between_0_and_100</BENEFIT>
    <POINTS>points_as_a_number_between_0_and_10000000</POINTS>
    <CONTENT type="text/..." encoded="utf-8|base64">
             description</CONTENT>
    <ATTENDEE>attendee_as_name_or_email</ATTENDEE>...
    <RESOURCE>resource_as_name_or_email</RESOURCE>...
    <CATEGORY>a category</CATEGORY>...
    <PARENT>TASK_UID_parent_task</PARENT>?
    <SUBTASK>TASK_UID_subtask</SUBTASK>...
    <GLUE link="start-start|start-due|due-start|due-due"
         delay="+-seconds">UID_(sub)task UID_(sub)task</GLUE>...
    <ALARM signal='audio|popup|email' email='email@address,...'>
           yyyy-mm-dd hh:mm:ss</ALARM>
    <JOURNAL>path_to_jrnl_folder</JOURNAL>...
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</TASK>
              

Figure 29

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

Example:

<TASK>
    <UID>TASK-UIDx1234:author@domain</UID>
    <VERSION>1</VERSION>
    <AUTHOR>author@domain</AUTHOR>
    <SUBJECT>To improve the draft for AGAP</SUBJECT>
    <STATUS>IN-PROGRESS</STATUS>
    <LOCATION>Wien</LOCATION>
    <LOCATION-MAX-CAPACITY>1000</LOCATION-MAX-CAPACITY>
    <START-EARLIEST>2014-01-01 09:00:00</START-EARLIEST>
    <START-LATEST>2014-06-01 09:00:00</START-LATEST>
    <START-DAYS>MO,TU,WE,TH,FR</START-DAYS>
    <START>2014-02-15 10:40:00</START>
    <DUE-LATEST>2014-06-30 17:59:59</DUE-LATEST>
    <DUE>2014-03-25 15:59:59</DUE>
    <PRIORITY>80</PRIORITY>
    <PERCENT>15</PERCENT>
    <EFFORT>50</EFFORT>
    <BENEFIT>100</BENEFIT>
    <POINTS>400000</POINTS>
    <CONTENT type="text/plain" encoded="utf-8">
        Improved AGAP</CONTENT>
    <ATTENDEE>iulian.radu@gmx.at</ATTENDEE>
    <RESOURCE>PC</RESOURCE>
    <CATEGORY>IETF_Drafts</CATEGORY>
    <GLUE type="due-start" delay="86400">UIDNextDraftVersion</GLUE>
    <ALARM type='popup'>-300</ALARM>
    <JOURNAL>/journal/projectX</JOURNAL>
</TASK>
              

Figure 30

There is defined a virtual property DURATION which returns the difference in seconds between DUE and START.

2.13.17. Response for Timezone Folders

This type of folder allows for specifying a time zone and a title for it.

Example:

<TIME-LOCATION>
    <SUBJECT>Vienna, Austria</SUBJECT>
    <TIMEZONE>Europe/Vienna</TIMEZONE>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</TIME-LOCATION>
              

Figure 31

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

2.13.18. Response for Versioned Documents Folders

A response holding the content of a versioned document has the following structure:

<DOCUMENT>
    <SUBJECT>a title</SUBJECT>
    <VERSION>version</VERSION>?
    <PERCENT>percent_as_a_number_between_0_and_100</PERCENT>
    <AUTHOR>author@domain</AUTHOR>?
    <CREATED>creation_date_time_utc</CREATED>?
    <CONTENT type="text/..." encoded="utf-8|base64">a note</CONTENT>
    <FOLLOWUP>yyyymmddHHMMSS+tztz</FOLLOWUP>?
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
</DOCUMENT>
              

Figure 32

Note: the subject can be any short text. The content can be encoded UTF-8 or BASE64. Implicit is content encoded in utf-8. The type can be any subtype of 'text/*'. Implicit is 'text/plain'. It is recommended to be used only 'text/plain' and 'text/html'. The followup represents when this note should be read again (checked). The fields of followup means:

  • yyyy - the year
  • mm - the year's month as a number (01 to 12)
  • dd - the month's day (01 to 31)
  • HH - the day's hour (00 to 23)
  • MM - the hour's minute (00 to 59)
  • SS - the minut's second (00 to 59)
  • +tztz - the timezone as four digits (-1200 to +1300)

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color. The percent indicate how much from the document is done. The created tag holds the date when the file was created. The format for the date is: YYYY-MM-DD hh:mm:ss. If the created tag is missing, then the server will use its current timestamp at the saving time. If the version is missing and the file is with STOR saved, then the version will be 1. If it is saved with RPLC, then the version will be the next arithmetical version.

Example:

<DOCUMENT>
    <SUBJECT>Important!</SUBJECT>
    <VERSION>2</VERSION>
    <PERCENT>90</PERCENT>
    <CREATED>2015-09-30 18:20</CREATED>
    <CONTENT type="text/plain" encoded="utf-8">
        To review the code.</CONTENT>
</DOCUMENT>
              

Figure 33

2.13.19. Response for Weather Folders

This type of folder allows for specifying a location and a title for it.

Example:

<WEATHER>
    <SUBJECT>Vienna, Austria</SUBJECT>
    <LOCATION>Vienna</LOCATION>
    <CATEGORY color='rrggbb'>a category</CATEGORY>?
    ...
</WEATHER>
              

Figure 34

The color of a category is optional and it is defined as a string having only ASCII hex digits, with the first two digits representing the red component, the middle two digits representing the green component, and the last two digits representing the blue component. All components are represented in hexadecimal. The client can use this value (if present) or can ignore it and use its own color.

3. States

3.1. Not-authenticated State

This is the default state when a new connection is made to the server. The client becomes a welcome message.

From this state the client can use the command 'AUTH mechanism' to move in the 'Pre-authentication State'. This is the only other state in which the server can go.

The client can use the command 'STLS' for commuting in the encrypted mode of the channel. After STLS the server remains in the 'Not-authenticated State'. There is no command for switching back to clear-text communication.

The client can use the command 'SGZP' for commuting in the compressed mode of the channel. After SGZP the server remains in the 'Not-authenticated State'. There is no command for switching back to not-compressed communication.

A client can use at the same time the both modes (encrypted and compressed).

The client can use the command 'QUIT' for terminating the connection.

For finding what extensions are installed in server, the client can use the 'CAPA' command.

3.2. Pre-authentication State

This is the state where a client authenticate itself and move to the 'Authenticated State' or returns to the 'Not-authenticated State'.

This standard defines only one method for AUTH: PLAIN. Following is a description of the commands flow used by this authentication mechanism.

The client must send a 'USER account' followed by a 'PASS password' (if the server confirms the acceptance of the account name). If the pair account and password is accepted then the server move to the state 'Authenticated State' and the folder INBOX is selected by server. If this folder does not exist then the server moves in the 'Not-Selected State' and the client must to select an existing folder for operating with this account. If this pair is rejected then the server returns to the 'Not-authenticated State'. That means that the client must to send a new 'AUTH mechanism' for trying a new authentication.

The client can use the command 'QUIT' for terminating the connection.

A client can enter into this state only after a successful 'AUTH' command in 'Not-authenticated State'.

3.3. Authenticated (and Selected) State

This is the state from which a client operates with the content of an account.

From this state the client can use the command 'EXIT' to move in the 'Not-authenticated State'. After an unsuccessful SLCT, the server goes in 'Not-selected State'.

The client can use the command 'QUIT' for terminating the connection.

Check the following chapter for finding which commands can be performed from this state.

A client can enter into this state only after a successful authentication in the 'Pre-authenticated State' or after a successful 'SLCT' command in the 'Authenticated State' or 'Not-selected State'.

3.4. (Authenticated but) Not-selected State

This is the state from which a client must to select a folder for performing further operations.

From this state the client must use the command 'SLCT' to select a folder and to move in the 'Authenticated State'. This is the only other state in which the server can go.

The client CAN use the command 'LIST' for finding valid folder names that eventually CAN be selected with 'SLCT' command.

The client CAN use the command 'QUIT' for terminating the connection.

A client CAN enter into this state only after an unsuccessful 'SLCT' command or if the INBOX folder does not exists and it cannot be selected automatically after a successful authentication.

3.5. Presence State

This is the state in which a client can only ask information about the presence of an user/account.

In this state the client can use only the command 'PGET' to ask for presence information of an account (inclusive finding when a meeting can be scheduled) and the command 'QUIT' for terminating the connection.

3.6. Storing State

This is the state in which a client can only add items (for example: messages, events) in an account which it is not his/her.

In this state the client can use only the command 'FSTO' to find and store the item into a folder of specified type from specified user and the command 'QUIT' for terminating the connection.

4. Commands

4.1. Semantic and Syntax

Each command has its name from 4 letters and it is matched case-insensitive.

Each command is separated by its arguments by a 0x20 character. Also, each argument is separated from its adjacent arguments by a 0x20 character.

The minimal response has only the return code without any text.

A list of elements is enclosed between parentheses (round brackets).

4.2. Syntax of a Tag List

A tag list is used by the following commands: FTAG, GTAG, SFTG and STAG.

A tag list defines what action to be done with its tags.

Syntax: ACTION TAG TAG=VALUE ...

ACTION:

  • = - set only these tags;
  • + - add these tags
  • - - delete these tags.

Note: When it is used the delete tags action and for a tag is set a value then the tag is deleted only if the current value match the value found in the delete command. If in delete command is specified a value for a tag which actually has no value set then this tag is not deleted. If in delete command is specified only the name of a tag without a value and the tag has a value assigned then the tag is deleted.

Example:

C: STAG UIDx1234 = SEEN SPAM=YES
C: STAG UIDx1234 + SEEN FLAG=RED OWNER=RAI
C: STAG UIDx1234 - FLAG JUNK OWNER=JOHN SEEN=
            

Figure 35

4.3. Syntax of a Filter

4.3.1. Syntax of a Filter for a Command

A filter of this type is used by the following commands: FCPY, FMOV, FDEL, FTAG, FRTR and FIND.

A filter defines rules for matching items. It is defined as lines with rules and it is ended by an empty line.

The keywords of the filter are case insensitive matched (ex.: UID and Uid are the same).

A rule must be completely defined in the same line (exception are grouping, AND, OR, and NOT rules).

Accepted rules:

  • ( ) - grouping for AND and OR;
  • AND - all following rules are with AND bonded (until the end of the current group). It is the implicit rule when the first rule is not an AND or an OR;
  • OR - all following rules are with OR bonded (until the end of the current group);
  • NOT - invert the result of the following rule;
  • UID uid - one UID;
  • UID uid_begin_range:uid_end_range - inclusive range (uid_end_range is optional and if it missing then it is assumed the maximum valid UID: 32 of lower-case letter z);
  • PATH path - the path where is located the item (path is written between ' and ' can be escaped with \');
  • TAG tag_name - a tag of an item;
  • TAG tag_name=tag_value - an item's tag with a value (tag_value is the complete value);
  • HAS field_path - check if exists a field in content (as XML);
  • IS field_path op string - a field from the content (as XML) with an exact matched text (string is written between ' and ' can be escaped with \'); op can be: <, <=, =, !=, >=, >;
  • WILDCARD field_path op wildcard_string - a field from the content (as XML) with a case-insensitive wildcard expression matched text (widlcard_string is written between ' and ' can be escaped with \'); op can be: =, !=; the widlcard_string can match only a part of the content. In a wildcard_string a '?' matches none or one character and a '*' matches zero or more characters.
  • REGEXP field_path op regexp_string - a field from the content (as XML) with a regular expression matched text (regexp_string is written between ' and ' can be escaped with \'); op can be: =, !=; the regexp_string can match only a part of the content.
  • NEW - it is true if an item is marked as new; after a new item was reported or retrieved (by FIND, FRTR, RETC, RETR or a filter folder) it will be marked as no longer being new and it will not be matched by a new search for new items.

The field_path is a PATH as it is returned by RETR and must point to a not binary end leaf. It contains only tag names separated with /. It is accepted as instead of the first tag to have a * (star) for searching in items of different types but having a common tag (like CATEGORY). Example: /MESSAGE/HEADER/subject, /MESSAGE/HEADER/received, /MESSAGE/TEXT, /MESSAGE/HTML, /MESSAGE/ATTACHMENT-1/HEADER/type, /MESSAGE/ATTACHMENT-1/BODY, /*/CATEGORY. There is an exception, for FILT folder types the path /FILTER/FOLDERS returns the list of folders with a folder path per line and the path /FILTER/FOLDERS/FOLDER is invalid.

Searching for a TAG without associating and a value to it will match all items having this tag, even if it have values set for it.

It can be searched only in the body of attachments that have a content type of type 'text/*'.

Example 1: These filters find all messages with the UID between UIDx0001:UIDx1000 and that were seen and marked as being spam or having a virus (the AND is redundant in the second case). Both filter definitions are equivalent.

C: UID UIDx0001:UIDx1000 ( OR TAG SPAM TAG HAS=VIRUS ) TAG SEEN
C: UID UIDx0001:UIDx1000 (AND ( OR TAG SPAM TAG HAS=VIRUS ) TAG SEEN)
            

Figure 36

Example 2:

C: AND and1 and2 OR and3or1 and3or2 OR and3or3 and3or4
C: AND and1 and2 OR and3or1 and3or2 AND and3or3and1 and3or3and2
C: OR or1 or2 AND or3and1 or3and2 AND or3and3 or3and4
C: OR or1 or2 AND or3and1 or3and2 OR or3and3or1 or3and3or2
C: AND and1 and2 (OR and3or1 and3or2) and4 and5
C: OR or1 or2 (AND or3and1 or3and2) or4 or5
            

Figure 37

Example 3:

C: IS /MESSAGE/HEADER/subject = 'From University'
C: REGEXP /MESSAGE/HEADER/FROM != '[^0-9]+@example\.com$'
            

Figure 38

4.3.2. Syntax of a Filter for a FILT Folder

A filter of this type is used by the following command: STOR.

A filter defines rules for matching the different messages from different folders. It is defined as an XML with target folders and rules.

The keywords of the filter are case sensitive matched (ex.: UID and Uid are not the same). They are always lowercase.

Accepted rules:

  • AND - all its items must be matched;
  • OR - at least one of its items must be matched;
  • NOT - invert the result of its child rule;
  • UID uid - one UID;
  • UID uid_begin_range:uid_end_range - inclusive range;
  • TAG tag_name - a tag;
  • TAG tag_name=tag_value - a tag with a value (tag_value is the complete value);
  • HAS field_path - check if exists a field in content (as XML);
  • IS field_path op string - a field from the content (as XML) with an exact matched text (string is written between ' and ' can be escaped with \'); op can be: <, <=, =, !=, >=, >;
  • WILDCARD field_path op wildcard_string - a field from the content (as XML) with a case-insensitive wildcard expression matched text (wildcard_string is written between ' and ' can be escaped with \'); op can be: =, !=; the wildcard_string can match only a part of the content. In a wildcard_string a '?' matches zero or one characters and a '*' matches zero or more characters.
  • REGEXP field_path op regex_string - a field from the content (as XML) with a regular expression matched text (regex_string is written between ' and ' can be escaped with \'); op can be: =, !=; the regex_string can match only a part of the content.

The field_path is a PATH as it is returned by RETR and must point to a not binary end leaf. It contains only tag names separated with /. Example: /MESSAGE/HEADER/subject, /MESSAGE/HEADER/received, /MESSAGE/TEXT, /MESSAGE/HTML, /MESSAGE/ATTACHMENT-1/BODY. There is an exception, for FILT folder types the path /FILTER/FOLDERS returns the list of folders with a folder path per line and the path /FILTER/FOLDERS/FOLDER is invalid.

Searching for a TAG without associating and a value to it will match all items that have this tag even if it have values set for it (the empty string is also considered matched).

The following two examples corresponds to the two examples from the previous chapter:

<FILTER>
    <FOLDERS>
        <FOLDER>/INBOX</FOLDER>
    </FOLDERS>
    <RULES>
        <AND>
            <UID>UIDx0001:UIDx0010</UID>
            <OR>
                <TAG>SPAM</TAG>
                <TAG>HAS=VIRUS</TAG>
            </OR>
            <TAG>SEEN</TAG>
        </AND>
    </RULES>
</FILTER>
            

Figure 39

Example 2:

<FILTER>
  <FOLDERS>
    <FOLDER>/INBOX</FOLDER>
  </FOLDERS>
  <RULES>
    <OR>
      <IS path="/MESSAGE/HEADER/subject" op="=">From University</IS>
      <REGEXP path="/MESSAGE/HEADER/FROM" op="!=">
         [^0-9]+@example\.com$</REGEXP>
    </OR>
  </RULES>
</FILTER>
            

Figure 40

4.4. The Welcome Message - not-authenticated state

Results: 200 401 410 531

Result 200 - the client is accepted for sending commands;

Result 401 - there was an internal error;

Result 410 - too many connections;

Result 531 - the client is rejected permanently.

Description: When a client connects to the server it receives a welcome message. This message begins with a response code that shows if the client is accepted for sending commands.

Examples:

S: 200 Welcome localhost [127.0.0.1]
            

Figure 41

S: 401 Internal error, please contact our administrator
            

Figure 42

S: 410 Sorry, too many connections, please retry later
            

Figure 43

S: 531 Your hostname/IP (localhost:127.0.0.1) is blacklisted
            

Figure 44

4.5. Command QUIT - all states

Name: quit

Arguments: none

Result: 200

Description: The QUIT command close the connection between the client and server.

Example:

C: QUIT
S: 200 OK Bye
            

Figure 45

4.6. Command AUTH mechanism - not-authenticated state

Name: authenticate

Argument: mechanism

Results: 200 510 511

Result 200 - the mechanism is known and accepted.

Result 510 - unknown command.

Result 511 - the mechanism is unknown/unsupported.

Description: Choose an authentication method. The name of the mechanism can contain only latin letters (A-Z), digits (0-9), the signs minus (-) and underscore (_). It is case insensitive. All supported mechanisms must to be advertised in CAPA's list of capabilities as AUTH-MechanismNameInUpperCase.

The PLAIN Authentication Mechanism: the client send the username and password in clear text using the commands USER and PASS.

The MD5 and SHA1 Authentication Mechanisms: the server send an additional line starting with a dot and providing a prefix that will gone be used by the client to send back to the server an MD5 or SHA-1 value computed on the string build from this prefix and user's password. This prefix can have between 1 and 256 characters. Allowed characters are any UTF-8 characters having a code bigger the decimal value 31 (first valid character is space). The initial dot is not part of the prefix. The client send the username and the computed hash using the commands USER and HASH.

The PRESENCE Authentication Mechanism: this mechanism is used by a client to query the presence of an user having an account on the server. If the server knows to forward the request to other servers (in case that requested account in not local) then it can return the answer from the remote server. The client send the username and password in clear text using the commands USER and PASS. For an anonymous access the server can accept as username anonymous and as password the email address of the connecting user. Once the username and password are accepted, the server enters in the presence state and the client can execute only the commands PGET and QUIT.

The PRESENCE-MD5 and PRESENCE-SHA1 Authentication Mechanisms: these mechanisms are working similar with MD5 and SHA1 authentication mechanisms, only that move the server in the same status as PRESENCE authentication mechanism.

The STORING Authentication Mechanism: this mechanism is used by a client to store items in accounts which are not his/hers. The client send the username and password in clear text using the commands USER and PASS. For an anonymous access the server can accept as username anonymous and as password the email address of the connecting user. Once the username and password are accepted, the server enters in the storing state and the client can execute only the commands FSTO and QUIT.

The STORING-MD5 and STORING-SHA1 Authentication Mechanisms: these mechanisms are working similar with MD5 and SHA1 authentication mechanisms, only that move the server in the same status as STORING authentication mechanism.

Examples:

C: AUTH PLAIN
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send PASS
C: PASS email@example.com
S: 200 OK User anonymous authenticated
            

Figure 46

C: AUTH MD5
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH 79054025255fb1a26e4bc422aef54eb1
S: 200 OK Authenticated
            

Figure 47

C: AUTH SHA1
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b4
S: 200 OK Authenticated
            

Figure 48

C: AUTH PRESENCE
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send PASS
C: PASS email@example.com
S: 200 OK User anonymous authenticated
            

Figure 49

C: AUTH PRESENCE-MD5
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH 79054025255fb1a26e4bc422aef54eb1
S: 200 OK User anonymous authenticated
            

Figure 50

C: AUTH PRESENCE-SHA1
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b4
S: 200 OK User anonymous authenticated
            

Figure 51

C: AUTH STORING
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send PASS
C: PASS email@example.com
S: 200 OK User anonymous authenticated
            

Figure 52

C: AUTH STORING-MD5
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH 79054025255fb1a26e4bc422aef54eb1
S: 200 OK User anonymous authenticated
            

Figure 53

C: AUTH STORING-SHA1
S: .Hash prefix ... for user's password
S: 200 OK Send USER
C: USER anonymous
S: 200 OK Send HASH
C: HASH de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b4
S: 200 OK User anonymous authenticated
            

Figure 54

C: AUTH
S: 510 UNKNOWN command
            

Figure 55

C: AUTH unknown
S: 511 UNKNWON method
            

Figure 56

4.7. Command CAPA - not-authenticated state

Name: capabilities

Arguments: none

Result: 200

Description: Ask for the parts of this standards or extensions supported by the server.

Following is a list with all capabilities defined and covered by this document. If the server do no present an item from the following list then the client must assume that the sever is unable to do the associated operations of the missing item.

  • ADBK - contact information;
  • AUTH-PLAIN - suport plain authentication;
  • AUTH-PRESENCE - suport authentication for asking about presence;
  • AUTH-PRESENCE-MD5 - suport authentication for asking about presence;
  • AUTH-PRESENCE-SHA1 - suport authentication for asking about presence;
  • AUTH-MD5 - suport MD5 authentication;
  • AUTH-SHA1 - suport SHA1 authentication;
  • AUTH-STORING - suport authentication for receiving items;
  • AUTH-STORING-MD5 - suport authentication for receiving items;
  • AUTH-STORING-SHA1 - suport authentication for receiving items;
  • CALE - events;
  • CHNG - list the FCID of all folders;
  • CONF - user accounts configuration;
  • FACL - ACL for folders;
  • FILE - storing files;
  • FILT - definition of a filter;
  • STOR - accepts storing from external sources;
  • JAPP - Java applications;
  • JRNL - journal items;
  • MESG - email messages;
  • NOTE - short texts;
  • PNFO - presence;
  • SPWD spwdFlags - server accepts compression;
  • SGZP - server accepts compression;
  • STLS - server can encrypt the communication channel;
  • TASK - tasks.

spwdFlags indicate the format for the password. After each flag can be specified a number indicating the minimum amount of characters which must correspond to this flag. If a flag is present then it is assumed that at least one character must correspond to it. The order of flags did not impose to keep that order in the new password. The following SPWD flag are defined by this draft:

  • a - a lowercase latin letter (a-z)
  • A - a uppercase latin letter (A-Z)
  • - - a digit (0-9)
  • . - not a latin letter or digit (not a-z, A-Z, nor 0-9)

Example:

C: CAPA
S: .GZIP
S: .TLS
S: .SPWD A1a7-1.1
S: .Extension1
S: .Extension.2 argument1
S: .Extension-3 argument1 argument2
S: 200 OK CAPA completed
            

Figure 57

4.8. Command SGZP - not-authenticated state

Name: start using GZip

Arguments: none

Results: 200 510

Result 200 - the communication is now compressed.

Result 510 - unknown/unsupported command.

Description: Change the communication in compressed mode using GZIP [RFC1952] as compression method. If this command is executed from the compression mode then it simply returns a 200 response code. The response to this command is using still the not-compressed mode of the channel. The compression becomes effective only after a 200 response line was send by the server.

Note: With GZIP the data is compressed using the LZ77 algorithm and Huffman coding. Starting using this mode is like starting to write clear texts into a GZIP format archive and reading texts from a GZIP format archive. The compression is used both by the client and the server and they start to use it with the next line they send after the 200 response line received from the server.

Examples:

C: SGZP
S: 200 OK Using GZIP
            

Figure 58

C: SGZP
S: 510 UNKNOWN command
            

Figure 59

4.9. Command STLS - not-authenticated state

Name: start using TLS

Arguments: none

Results: 200 510

Result 200 - the communication is now encrypted.

Result 510 - unknown/unsupported command.

Description: Change the communication in mode TLS. If this command is executed from the encrypted mode then it simply returns a 200 response code. The response to this command is using still the not-encrypted mode of the channel. The encryption becomes effective only after a 200 response line was send by the server.

Examples:

C: STLS
S: 200 OK Using TLS
            

Figure 60

C: STLS
S: 510 UNKNOWN command
            

Figure 61

4.10. Command HASH - pre-authenticated state (MD5 and SHA1)

Name: hash

Argument: hash_code

Result: 200 510 511 512

Result 200 - the pair user/hash was successfully authenticated.

Result 510 - unknown/unsupported command.

Result 511 - invalid hash.

Result 512 - first send USER and then HASH.

Description: Send the hash code associated to the previous authentication method (MD5 or SHA1), previous USER and provided prefix.

Examples:

C: AUTH MD5
S: .prefix is-here!
S: 200 OK Send USER
C: USER account
S: 200 OK Send HASH
C: HASH 79054025255fb1a26e4bc422aef54eb1
S: 200 OK Authenticated
            

Figure 62

C: USER account
S: 200 OK Send HASH
C: HASH
S: 510 UNKNOWN command
            

Figure 63

C: USER account
S: 200 OK Send HASH
C: HASH 79054025255fb1a26e4bc422aef54eb1
S: 511 WRONG user/hash pair
            

Figure 64

C: AUTH SHA1
S: .prefix is-here!
S: 200 OK Send USER
C: HASH de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3
S: 512 EXPECTED USER
            

Figure 65

4.11. Command PASS - pre-authenticated state (PLAIN)

Name: password

Argument: password

Result: 200 510 511 512

Result 200 - the pair user/password was successfully authenticated.

Result 510 - unknown/unsupported command.

Result 511 - invalid password.

Result 512 - first send USER and then PASS.

Description: Send the password associated to the previous USER.

Examples:

C: USER account
S: 200 OK Send PASS
C: PASS password
S: 200 OK Authenticated
            

Figure 66

C: USER account
S: 200 OK Send PASS
C: PASS
S: 510 UNKNOWN command
            

Figure 67

C: USER account
S: 200 OK Send PASS
C: PASS password
S: 511 WRONG user/password pair
            

Figure 68

C: AUTH PLAIN
S: 200 OK AUTH completed
C: PASS password
S: 512 EXPECTED USER
            

Figure 69

4.12. Command USER - pre-authenticated state (PLAIN, MD5 and SHA1)

Name: user

Argument: account

Result: 200

Result: 200 510 511

Result 200 - the user is accepted and expecting the password.

Result 510 - unknown/unsupported command.

Result 511 - invalid account.

Description: Send an account name for authentication and authorization.

Examples:

C: AUTH PLAIN
S: 200 OK Send USER
C: USER account
S: 200 OK Send PASS
            

Figure 70

C: AUTH PLAIN
S: 200 OK Send USER
C: USER
S: 510 UNKNOWN command
            

Figure 71

C: AUTH PLAIN
S: 200 OK Send USER
C: USER account
S: 511 INVALID username
            

Figure 72

4.13. Command AACL - authenticated state

Name: add a ACL for selected folder

Arguments: rights account

Result: 200 510 511 541

Result 200 - the command was successful.

Result 510 - unknown/unsupported command.

Result 511 - the rights are incorrect or the account is missing.

Result 541 - the user does not have enough rights to change the ACL rights.

Description: Add a new ACL to the current list of ACLs for selected folder or replace the old rights if exists an item for this account.

Examples:

C: AACL ADR *@mydomain.com
S: 200 OK The ACL was successfully added
C: AACL R *@mydomain.com
S: 200 OK The ACL was successfully replaced
            

Figure 73

C: AACL
S: 510 UNKNOWN command
            

Figure 74

C: AACL GR user@domain.com
S: 511 UNKNOWN right G
            

Figure 75

4.14. Command APBL - authenticated state

Name: set currently selected folder as public folder for its type

Arguments: none

Result: 200 410 510

Result 200 - the command was successful.

Result 410 - for the moment the selected folder cannot be added to the list of public folders.

Result 510 - unknown/unsupported command.

Description: Add currently selected folder to the list of public folders.

Note: If there was already set a folder for this type then the previously folder is removed from the list.

Examples:

C: APBL
S: 200 OK Folder /MyCalendar was made PUBLIC for CALE
            

Figure 76

C: APBL
S: 410 Please retry to add it later
            

Figure 77

C: APBL
S: 510 UNKNOWN command
            

Figure 78

4.15. Command CHNG - authenticated and not-selected state

Name: report the FCID (Folder Change ID) for all folders

Arguments: path?

Result: 200 510 511

Result 200 - the command was successful.

Result 510 - unknown/unsupported command.

Result 511 - the path is invalid.

Description: Return a list with the FCID of all folders or of the specified path.

Note: For no path in the list is included and the root folder for all other folders as slash ('/').

Examples:

C: CHNG
S: .0BIH /
S: .0009 /Temporary
S: .0001 /Temporary/1980
S: .0BIG /INBOX
S: .0123 /ARCHIVE
S: .0003 /ARCHIVE/2010
S: .0003 /ARCHIVE/2011
S: .00aA /ARCHIVE/2010/OLD
S: 200 OK CHNG completed
C: CHNG /Temporary/1980
S: .0001 /Temporary/1980
S: 200 OK CHNG completed
            

Figure 79

Note: A change in /ARCHIVE/2010 will change the FCID of /ARCHIVE/2010, but not the FCID of /ARCHIVE nor /.

C: CHNG
S: 510 UNKNOWN command
            

Figure 80

C: CHNG /no/path
S: 511 UNKNOWN path
            

Figure 81

4.16. Command COPY - authenticated state

Name: copy item

Arguments: UID_source path_destination_folder

Result: 200 510 511

Result 200 - the copy was successful.

Result 510 - unknown/unsupported command.

Result 511 - unknown uid, invalid destination folder or path not absolute.

Result 541 - the user does not have enough rights to read items from source or write in destination folder.

Description: Copy an item from currently selected folder into another folder (by UID).

Note: For copying a folder the client must use CPYF or CPFC.

Examples:

C: COPY UIDx1234 /ARCHIVE_FOLDER/TODAY
S: 200 OK COPY completed
            

Figure 82

C: COPY
S: 510 UNKNOWN command
            

Figure 83

C: COPY UIDx1234 ARCHIVE_FOLDER/TODAY
S: 511 INVALID UID
C: COPY MSGx1234 ARCHIVE_FOLDER/1970
S: 511 INVALID Destination
            

Figure 84

4.17. Command CPFC - authenticated state

Name: copy folder content

Argument: path_destination_folder

Result: 200 510 511

Result 200 - the copy was successful.

Result 510 - unknown/unsupported command.

Result 511 - invalid destination folder, destination is not an absolute path or destination does not exists.

Result 541 - the user does not have enough rights to read items from source or write in destination folder.

Description: Copy the non-folder content of a folder into another folder.

Examples (in TODAY are copied only the messages from INBOX):

C: SLCT /INBOX
S: 200 Selected /INBOX
C: CPFC /ARCHIVE_FOLDER/TODAY
S: 200 OK CPFC completed (100 items)
            

Figure 85

C: CPFC
S: 510 UNKNOWN command
            

Figure 86

C: CPFC NoAbsolutePath
S: 511 INVALID Destination
C: CPFC /IDoNotExist
S: 511 Destination folder not found
            

Figure 87

4.18. Command CPYF - authenticated state

Name: copy folder and its content and subfolders

Argument: path_destination_folder/new_folder_name

Result: 200 510 511

Result 200 - the copy was successful.

Result 510 - unknown/unsupported command.

Result 511 - invalid destination folder, destination is not an absolute path or destination exists.

Result 541 - the user does not have enough rights to read items from source or to create the destination folder.

Description: Copy a folder together with its content and subfolders into another new folder.

Examples:

C: SLCT /INBOX
S: 200 Selected /INBOX
C: CPYF /ARCHIVE_FOLDER/TODAY
S: 200 OK CPYF completed (100 items, 5 subfolders)
            

Figure 88

C: CPYF
S: 510 UNKNOWN command
            

Figure 89

C: CPYF NoAbsolutePath
S: 511 INVALID destination
C: CPYF /IAlreadyExist
S: 511 Destination folder exists
            

Figure 90

4.19. Command DACL - authenticated state

Name: delete an ACL from selected folder

Argument: account

Result: 200 220 510 511

Result 200 - the command was successful and the account was removed from ACL.

Result 220 - the command was successful, but the account was not found in ACL.

Result 510 - unknown/unsupported command.

Result 511 - the account is missing or incorrect.

Result 541 - the user does not have enough rights to change the ACL rights.

Description: Delete an ACL from currently selected folder ACLs.

Examples:

C: DACL *@mydomain.com
S: 200 OK The ACL was successfully deleted
            

Figure 91

C: DACL user@domain.com
S: 220 Entry not found
            

Figure 92

C: DACL
S: 510 UNKNOWN command
            

Figure 93

C: DACL @domain.com
S: 511 UNKNOWN item format
            

Figure 94

4.20. Command DELE - authenticated state

Name: delete item

Argument: UID path?

Result: 200 510 511

Result 200 - the item was successfully deleted.

Result 510 - unknown/unsupported command.

Result 511 - unknown uid.

Result 541 - the user does not have enough rights to delete the item.

Description: Delete an item by uid or a value based on path in this uid.

Note: It cannot be undone.

Examples:

C: DELE UIDx1234
S: 200 OK Message deleted
            

Figure 95

C: DELE
S: 510 UNKNOWN command
            

Figure 96

C: DELE 1234
S: 511 INVALID UID
            

Figure 97

4.21. Command DELF - authenticated state

Name: delete folder

Arguments: none

Result: 200 510 511

Result 200 - the folder was successfully deleted.

Result 510 - unknown/unsupported command.

Result 511 - no folder was selected or the user do not have the ACL right to delete from currently selected folder.

Result 541 - the user does not have enough rights to delete the folder.

Description: Delete currently selected folder and all its content and subfolders. If the operation is successful then after it no folder is selected.

Note: It cannot be undone.

Examples:

C: DELF
S: 200 OK Folder '/delete/me' was deleted
            

Figure 98

C: DELF
S: 510 UNKNOWN command
            

Figure 99

C: DELF
S: 511 Please select first a folder
C: DELF
S: 511 /INBOX cannot be deleted
            

Figure 100

4.22. Command DPBL - authenticated state

Name: remove currently selected folder from the list of public folders

Arguments: none

Result: 200 220 410 510

Result 200 - the command was successful and currently selected folder was removed from the list of public folders.

Result 220 - the command was successful, but currently selected folder was not in the list of public folders.

Result 410 - for the moment the selected folder cannot be removed from the list of public folders.

Result 510 - unknown/unsupported command.

Description: Remove currently selected folder from the list of public folders (if it is already there).

Examples:

C: DPBL
S: 200 OK Folder /MyCalendar is no longer public
            

Figure 101

C: DPBL
S: 220 OK Folder /MyCalendar was not in the list
            

Figure 102

C: DPBL
S: 410 Please retry to remove it later
            

Figure 103

C: DPBL
S: 510 UNKNOWN command
            

Figure 104

4.23. Command EXIT - authenticated state

Name: exit

Arguments: none

Result: 200

Description: Return the server to the Not-authenticated State.

Example:

C: EXIT
S: 200 OK EXIT completed
            

Figure 105

4.24. Command FCNT - authenticated state

Name: find items and returns how many items matched the filter

Argument: filter*

Result: 110 200 220 511

Result 110 - the client can send the filter.

Result 200 - the find was successful.

Result 220 - no item matching the filter was found.

Result 511 - wrong filter.

Result 541 - the user does not have enough rights to read items.

Description: Search for items only from currently selected folder (no subfolders) that correspond to a filter and return the number of matched items. If the search is done for a filter folder then the server does not expect any filter and apply the current filter (if any). If there is no filter in the filter folder then it is returned 0 and the 220 code. If there is no match for the filter then it is returned 0 and the 220 code.

Note: For not FILT folders, the filter is delivered after the acceptance of the command. An empty filter matches all items from that folder.

Examples:

C: SLCT /MESG-Folder
C: FCNT
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: .3
S: 200 OK FCNT completed (3 matches)
C: SLCT /FILT-Folder
C: FCNT
S: .3
S: 200 OK FCNT completed (3 matches)
            

Figure 106

C: FCNT
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: .0
S: 220 OK FCNT completed (no matches)
            

Figure 107

C: FCNT
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 108

4.25. Command FCPY - authenticated state

Name: find and copy items

Arguments: path_destination_folder filter*

Result: 110 200 210 220 510 511 541

Result 110 - the client can send the filter.

Result 200 - the find and copy was successful for all found UIDs.

Result 210 - the find and copy was successful but not for all found UIDs.

Result 220 - no item matching the filter was found.

Result 510 - unknown/unsupported command.

Result 511 - invalid destination folder or wrong filter.

Result 541 - the user does not have enough rights to read items from source or write in destination folder.

Description: Search for items only in currently selected folder (no subfolders) that correspond to a filter and copy them to a new folder. The tags are also copied. If there is no match for the filter then it is returned a 200 code.

Note: The filter is delivered after the acceptance of the command (response code 110).

Examples:

C: FCPY /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 200 OK FCPY completed (10 matches)
            

Figure 109

C: FCPY /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 210 OK FCPY completed (8 from 10 were copied - out of space)
            

Figure 110

C: FCPY /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FCPY completed (no matches)
            

Figure 111

C: FCPY
S: 510 UNKNOWN command
            

Figure 112

C: FCPY MISSING
S: 511 INVALID folder or path not absolute
C: FCPY SEND
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 113

4.26. Command FDEL - authenticated state

Name: find and delete items

Argument: path? filter*

Result: 110 200 210 220 511

Result 110 - the client can send the filter.

Result 200 - the find and delete was successful for all found UIDs.

Result 210 - the find and delete was successful but not for all found UIDs.

Result 220 - no item matching the filter was found or the path was not found in any found item.

Result 511 - wrong filter (inclusive empty filter) or no ACL right to delete.

Result 541 - the user does not have enough rights to delete items.

Description: Search for items only in currently selected folder (no subfolders) that correspond to a filter and delete them (no copy in TRASH) or a value based on path in founded uids. If there is no match for the filter then it is returned a 200 code.

Note: The filter is delivered after the acceptance of the command (response code 110). No filter removes all items.

Examples:

C: FDEL
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 200 OK FDEL completed (10 matches)
C: FDEL /MESSAGE/ATTACHMENT-1
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 200 OK FDEL completed (all 10 attachments deleted)
            

Figure 114

C: FDEL
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 210 OK FDEL completed (only 8 from 10 matches were deleted)
C: FDEL /MESSAGE/ATTACHMENT-1
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 210 OK FDEL completed (only 8 from 10 attachments were deleted)
            

Figure 115

C: FDEL
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FDEL completed (no matches)
C: FDEL /MESSAGE/ATTACHMENT-1
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FDEL completed (no attachments found in 10 items)
            

Figure 116

C: FDEL
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 117

4.27. Command FIND - authenticated state

Name: find items

Argument: filter*

Result: 110 200 220 511

Result 110 - the client can send the filter.

Result 200 - the find was successful.

Result 220 - no item matching the filter was found.

Result 511 - wrong filter.

Result 541 - the user does not have enough rights to read items.

Description: Search for items only from currently selected folder (no subfolders) that correspond to a filter and return their UIDs. If the search is done for a filter folder then the server does not expect any filter and apply the current filter (if any). If there is no filter in the filter folder then it is returned only the return code. The answer consists of the UIDs and, for a filter folder, they are followed by a 0x20 character and the absolute path for which are the corresponding UID. If there is no match for the filter then it is returned a 220 code.

Note: For not FILT folders, the filter is delivered after the acceptance of the command. An empty filter matches all items from that folder.

Examples:

C: SLCT /MESG-Folder
C: FIND
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: .UIDx1234
S: .UIDx1235
S: .UIDx2340
S: 200 OK FIND completed (3 matches)
C: SLCT /FILT-Folder
C: FIND
S: .UIDx1234 /INBOX
S: .UIDx1234 /Trash
S: .UIDx1235 /Trash
S: 200 OK FIND completed (3 matches)
            

Figure 118

C: FIND
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FIND completed (no matches)
            

Figure 119

C: FIND
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 120

4.28. Command FMOV - authenticated state

Name: find and move

Arguments: path_destination_folder filter*

Result: 110 200 210 220 510 511 541

Result 110 - the client can send the filter.

Result 200 - the find and move was successful for all found UIDs.

Result 210 - the find and move was successful but not for all found UIDs.

Result 220 - no item matching the filter was found.

Result 510 - unknown/unsupported command.

Result 511 - invalid destination folder, wrong filter, or no right to move.

Result 541 - the user does not have enough rights to read items from source or write in destination folder.

Description: Search for items only from currently selected folder (no subfolders) that correspond to a filter and move them to a new folder. The tags are also moved. If there is no match for the filter then it is returned a 200 code.

Note: The filter is delivered after the acceptance of the command (response code 110).

Examples:

C: FMOV /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 200 OK FMOV completed (10 matches)
            

Figure 121

C: FMOV /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND TAG SPAM
C:
S: 210 OK FMOV completed (8 from 10 moved - out of space)
            

Figure 122

C: FMOV /ARCHIVE/SPAM
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FMOV completed (no matches)
            

Figure 123

C: FMOV
S: 510 UNKNOWN command
            

Figure 124

C: FMOV MISSING
S: 511 INVALID folder or not absolute path
C: FMOV /SEND
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 125

4.29. Command FRTR - authenticated state

Name: find items and retrieve fields

Argument: filter* part*

Result: 110 200 220 511

Result 110 - the client can send the filter and the items parts.

Result 200 - the find was successful.

Result 220 - no item matching the filter was found.

Result 511 - wrong filter or items parts.

Result 541 - the user does not have enough rights to read items.

Description: Search for items only from currently selected folder (no subfolders) that correspond to a filter and return their UIDs together with the requested parts from them. If the search is done for a filter folder then the server does not expect any filter and apply the current filter (if any). If there is no filter in the filter folder then it is returned only the return code. If there are no parts specified then only the UIDs are returned. Each requested part becomes a number starting with 1 and being assigned in the same order as the fields. It is defined a special part named '#' which returns all tags associated to a UID. Each tag is returned on its own line prefixed with the corresponding starting number. It is possible to look only for a tag by adding its name after '#' (like #SEEN) and if it exists then it is returned its name, an equal sign and its value, if it has any value. It is possible to look for a tag having a value by adding its name, equal sign and the searched value after '#' (like #MYTAG=myValue) and if it exists with the given value then it is returned its name, an equal sign and its value.

Note: The number 0 is reserved for the UID. The answer consists of the UIDs and, for a filter folder, they are followed by a 0x20 character and the absolute path for which are the corresponding UID. If the item is marked as new then the UID is prefixed with a multiplication sign (*). The item is then marked as no longer being new. If there is no match for the filter then it is returned a 220 code.

Note: For not FILT folders, the filter is delivered after the acceptance of the command. An empty filter matches all items from that folder.

Examples: The first message has only a value in To, the second has two, and the last one none. The second message has no subject.

C: SLCT /MESG-Folder
C: FRTR
S: 110 OK SEND filter&parts definition (end each with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
C: /MESSAGE/HEADER/subject
C: /MESSAGE/HEADER/from
C: /MESSAGE/HEADER/to
C: #
C:
S: .0 UIDx1234
S: .1 Not so important
S: .2 contact@win.com
S: .3 you@example.com
S: .0 *UIDx1235
S: .2 spam@ultimate-spam.com
S: .3 you@example.com
S: .3 your_boss@example.com
S: .0 UIDx2340
S: .1 Please respond
S: .2 office@example.com
S: .4 SEEN
S: .4 EXPIRED=NO
S: 200 OK FRTR completed (3 matches)
C: FRTR
S: 110 OK SEND filter&parts definition (end each with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
C:
S: .0 UIDx1234
S: .0 UIDx1235
S: .0 UIDx2340
S: 200 OK FRTR completed (3 matches)
C: SLCT /FILT-Folder
C: FRTR
S: 110 OK SEND the parts definition (end it with an empty line)
C: /MESSAGE/HEADER/subject
C: /MESSAGE/HEADER/from
C:
S: .0 UIDx1234 /INBOX
S: .1 Please respond
S: .2 office@example.com
S: .0 UIDx1234 /Trash
S: .1 Very urgent
S: .2 spam@ultimate-spam.com
S: .0 *UIDx1235 /Trash
S: .1 Not so important
S: .2 contact@win.com
S: 200 OK FRTR completed (3 matches)
            

Figure 126

C: FRTR
S: 110 OK SEND filter&parts definition (end each with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
C: /MESSAGE/HEADER
C:
S: 220 OK FRTR completed (no matches)
            

Figure 127

C: FRTR
S: 110 OK SEND filter&parts definition (end each with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
C: FRTR
S: 110 OK SEND filter&parts definition (end each with an empty line)
C: UID UIDx0001:UIDx9000
C:
C: INVALID/PATH
C:
S: 511 INVALID part definition
            

Figure 128

4.30. Command FSTO - storing state

Name: find and write an item into a folder with a specified type from a certain user

Arguments: FolderType Account

Result: 110 200 410 510 511 541

Result 110 - the requested folder was found and the client can send the item.

Result 200 - the item was successfully stored or there was no content sent by the client.

Result 410 - if the item cannot be stored.

Result 510 - unknown/unsupported command.

Result 511 - invalid folder type, unknown account, the data is not a valid XML or its schema does not correspond to the type of the destination folder.

Result 541 - the user does not have enough rights to write items.

Description: Locate a folder with a specified type in an user account for receiving items from other users and store there the item sent by the client. It behaves like STOR.

Note: Do not send a message content using CDATA as it can hold empty lines and an empty line means for the server the end of the message to be stored.

Examples:

C: FSTO MESG kontakt@agap.at
S: 110 Send the message ended with an empty line
C: <MESSAGE><HEADER>...</HEADER><TEXT>...</TEXT></MESSAGE>
C:
S: 200 OK Message stored with UID UIDx1234 into INBOX
            

Figure 129

C: FSTO
S: 510 UNKNOWN command
C: FSTO MESG
S: 510 UNKNOWN command
            

Figure 130

C: FSTO -1 kontakt@agap.at
S: 511 INVALID folder type
C: FSTO MESG nouser@agap.at
S: 511 UNKNOWN account name
            

Figure 131

C: FSTO MESG kontakt@agap.at
S: 541 Not enough rights. Please contact your administrator.
            

Figure 132

4.31. Command FTAG - authenticated state

Name: find and tag items

Arguments: tag_list filter*

Result: 110 200 210 220 510 511

Result 110 - the client can send the filter.

Result 200 - the find and set of tag(s) was successful for all found UIDs.

Result 210 - the find and set of tag(s) was successful but not for all found UIDs.

Result 220 - no item matching the filter was found.

Result 510 - unknown/unsupported command.

Result 511 - invalid tag list, wrong filter, or no right to tag.

Result 541 - the user does not have enough rights to tag items.

Description: Search for items only from currently selected folder (no subfolders) that correspond to a filter and change their tags. If there is no match for the filter then it is returned a 200 code.

Note: The filter is delivered after the acceptance of the command (response code 110).

Examples:

C: FTAG + SEEN
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND NEW
C:
S: 200 OK FTAG completed (10 matches)
            

Figure 133

C: FTAG + SEEN
S: 110 OK SEND filter definition (end it with an empty line)
C: UID 00000001:00001000 AND NEW
C:
S: 210 OK FTAG completed (only 8 from 10 matches taged)
            

Figure 134

C: FTAG + SEEN
S: 110 OK SEND filter definition (end it with an empty line)
C: UID UIDx0001:UIDx9000 TAG SPAM
C:
S: 220 OK FIND completed (no matches)
            

Figure 135

C: FTAG
S: 510 UNKNOWN command
            

Figure 136

C: FTAG SEEN
S: 511 INVALID tag list
C: FTAG + SEEN
S: 110 OK SEND filter definition (end it with an empty line)
C: LATER
C:
S: 511 INVALID filter definition
            

Figure 137

4.32. Command GACL - authenticated state

Name: get all ACLs for selected folder

Arguments: none

Result: 200

Result 200 - the command was successful.

Description: It returns a list with all defined ACLs for currently selected folder. If the user do not have the ACL right C then it receives only the entries matching his account.

Examples:

C: GACL
S: 200 OK No ACL were defined
C: GACL
S: .CR anonymous
S: .RAD *@mydomain.com
S: .A partner@extdomain.com
S: 200 OK The ACL list for anonymous
C: GACL
S: .A partner@extdomain.com
S: 200 OK The ACL list for partner
            

Figure 138

4.33. Command GFTG - authenticated state

Name: get tags of currently selected folder

Arguments: none

Result: 200 510 511

Result 200 - the tags for UID were successful displayed.

Result 510 - unknown/unsupported command.

Description: Return the tags associated to currently selected folder.

Examples:

C: GFTG
S: .SYNC
S: .HIDDEN=NO
S: 200 OK GFTG completed
            

Figure 139

C: GFTG
S: 510 UNKNOWN command
            

Figure 140

4.34. Command GPBL - authenticated and not-selected state

Name: get the list of public folders

Arguments: none

Results: 200 510

Result 200 - the list was successful delivered (even if it is empty).

Result 510 - unknown command.

Description: Return the list of all folders declared PUBLIC together with their type.

Note: There should be only one folder for each type.

Examples:

C: GPBL
S: .MESG /INBOX
S: .CALE /CALENDAR
S: .ADBK /Public/CONTACT
S: .FILE /Project X/Public Files
S: .JRNL /JOURNAL
S: .TASK /Project X/Tasks
S: 200 OK GPBL completed
            

Figure 141

C: GPBL
S: 510 UNKNOWN command
            

Figure 142

4.35. Command GTAG - authenticated state

Name: get tag of an item

Arguments: UID

Result: 200 510 511

Result 200 - the tags for UID were successful displayed.

Result 510 - unknown/unsupported command.

Result 511 - invalid UID.

Description: Return the tags associated to an item.

Examples:

C: GTAG UIDx1000
S: .SEEN
S: .SPAM
S: 200 OK GTAG completed
C: GTAG UIDx1001
S: 200 OK GTAG completed
            

Figure 143

C: GTAG
S: 510 UNKNOWN command
            

Figure 144

C: GTAG -1
S: 511 INVALID UID
            

Figure 145

4.36. Command LINK - authenticated

Name: add symbolic link to an other folder

Arguments: name, path (on a new line)

Results: 110 200 511 541

Result 110 - the server expect the path.

Result 200 - the link was successful created.

Result 513 - the path does not exists or the name is already used for a subfolder.

Result 541 - the user does not have enough rights to create the link.

Description: Creates in currently slected folder a new folder pointing to an other folder. By deleting this new created folder, the original folder is not created.

Path': It must be an absolute (begins with /) path. The slash sign (/) is used to delimit folders in the hierarchy. The server can return 511 if it founds '.' or '..' in path or '/' in the new folder name.