Mail Architecture

Mail-related WebDAV properties

Most mail-related WebDAV properties are in either the urn:schemas:mailheader: or urn:schemas:httpmail: namespaces. In fact, many properties are available in both of those namespaces. Every RFC 822 header in the message is copied literally to a property in the urn:schemas:mailheader: namespace with the same name. urn:schemas:httpmail: on the other hand has only a subset of headers, but in a more processed form. (For example, if there are non-ASCII characters in the subject of a message, urn:schemas:httpmail:subject will have a UTF-8 representation of the subject, while urn:schemas:mailheader:subject will have the MIME-encoded ASCII representation.)

A few important mail-related WebDAV properties are:

  • urn:schemas:httpmail:read (aka E2K_PR_HTTPMAIL_READ), urn:schemas:httpmail:hasattachment (aka E2K_PR_HTTPMAIL_HAS_ATTACHMENT), and PR_ACTION_FLAG, which are used to generate the Camel message flags.

  • urn:schemas:httpmail:messageflag (aka E2K_PR_HTTPMAIL_MESSAGE_FLAG), urn:schemas:mailheader:reply-by (aka E2K_PR_MAILHEADER_REPLY_BY), and urn:schemas:mailheader:completed (aka E2K_PR_MAILHEADER_COMPLETED), to determine "flag for followup" information.

  • DAV:getcontentlength (aka E2K_PR_DAV_CONTENT_LENGTH), which tells the message size.

MIME messages

Normal message/rfc822 messages delivered by SMTP, or copied into the folder with a PUT (eg, by Connector) are the easiest type of mail item to deal with.

The PR_TRANSPORT_MESSAGE_HEADERS property of a real MIME message contains the complete MIME structure of the message with none of the actual content. (Eg, all of the RFC822 and MIME headers, plus multipart boundary delimeters.) This can be used to create most of the summary information for a message.

MAPI messages

Messages sent by other local users using Outlook, and some messages generated by Exchange itself, are not represented as MIME messages internally. While Exchange will fake up MIME headers if you GET the message, these messages don't have a PR_TRANSPORT_MESSAGE_HEADERS property, so to create summary information, we have to fetch urn:schemas:mailheader: properties and fake up the headers from there.

A few types of MAPI messages get additional special handling:

  • Delegated meeting requests

    When you set up your delegates to get copies of your meeting requests, Exchange mangles the message/rfc822 body in various ways. (In Connector, mail_util_demangle_delegated_meeting fixes things for us.)

  • Sticky notes

    Technically, these aren't in mail folders, but they're handled by the mail code. This is a silly hack because I was bored one day. If the folder is a stickynotes folders instead of a mail folder, Connector fetches some additional properties and uses mail_util_stickynote_to_rfc822 to make an HTML message simulating the stickynote.

Non-mail Documents

Public folders that are not calendar, contact, or task folders are treated as mail folders by default, but are sometimes used for things other than mail, such as storing Word documents.

These objects have basically no email properties at all, and when you GET the bodies, they're application/x-msword or whatever instead of message/rfc822.

Sometimes these items will have a PR_INTERNET_FREE_DOC_INFO property that contains a Content-Type header, but not always. So in that case, we get the E2K_PR_DAV_CONTENT_TYPE and make Content-* headers ourselves. Then we fake up the rest of the headers to make the document look like an email message with an attached document.