libetpan - fdik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

654 lines
21 KiB

1/ Introduction
---------------
libEtPan! is mainly a library that will handle all kind of mailbox access.
For example: IMAPrev4, POP3, NNTP, mbox, MH.
You have two kinds of mailbox access, either using low-level functions
with a different interface for each kind of access or using higher-level
functions, using a driver to wrap the higher-level API.
2/ Low-level
------------
2.1/ IMAP4rev1 - Internet Message Access Protocol - Version 4rev1
-----------------------------------------------------------------
Each command of the IMAP4rev1 Standard (RFC 2060) is implemented in
the IMAP4rev1 module. Directory imap/.
2.1.1/ References
- RFC 2060 - INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1
- draft-crispin-imapv-15.txt
Not yet implemented :
- draft-crispin-imapv-20.txt
2.1.2/ Dependencies
- tools/
2.1.3/ Files descriptions
description of header files :
mailimap.[ch] -- functions that implements each IMAP4rev1 command
mailimap_helper.[ch] -- helper interface for the previous functions
mailimap_types.[ch] -- definition of types and constructors for these
types
mailimap_types_helper.[ch] -- contains function definitions that will help
to create data necessary to use IMAP4rev1 module
mailimap_socket.[ch] -- provides a function to connect to an
IMAP4rev1 server over TCP
mailimap_ssl.[ch] -- provides a function to connect to an
IMAP4rev1 server over TLS layer
2.1.4/ Interface
Include for this module is mailimap.h and includes all other headers.
The interface of IMAP4rev1 is documented in the following files :
mailimap.h
mailimap_types.h
mailimap_types_helper.h
2.2/ POP3 - Post Office Protocol - Version 3
--------------------------------------------
Each command of the POP3 Standard (RFC 1939 and RFC 2449) is implemented
in the POP3 module. Directory pop3/.
2.1.1/ References
- RFC 1939 - Post Office Protocol - Version 3
- RFC 2449 - POP3 Extension Mechanism (CAPA)
Not yet implemented :
- RFC 1734 - POP3 AUTHentication command
2.1.2/ Dependencies
- tools/
2.2.3/ Files descriptions
mailpop3.[ch] -- functions that implements each POP3 command
mailpop3_helper.[ch] -- helper interface for the previous functions
mailpop3_socket.[ch] -- provides a function to connect to a
POP3 server over TCP
mailpop3_ssl.[ch] -- provides a function to connect to a
POP3 server over TLS layer
2.2.4/ Interface
Include for this module is mailpop3.h and includes all other headers.
There is not yet documentation for POP3 module.
2.3/ NNTP - Network News Transfer Protocol
------------------------------------------
Each command of the NNTP Standard (RFC 977 and RFC 2980) is implemented
in the NNTP module. Directory nntp/.
2.3.1/ References
- RFC 977 - Network News Transfer Protocol
- RFC 2980 - Common NNTP Extensions
Not yet implemented :
- RFC 1036 - Standard for Interchange of USENET Messages
- son of RFC 1036 : FTP://zoo.toronto.edu/pub/news.txt.Z
2.3.2/ Dependencies
- tools/
2.3.3/ Files descriptions
newsnntp.[ch] -- functions that implements each NNTP command
newsnntp_socket.[ch] -- provides a function to connect to a
NNTP server over TCP
newsnntp_ssl.[ch] -- provides a function to connect to a
POP3 server over TLS layer
2.3.4/ Interface
Include for this module is newsnntp.h and includes all other headers.
There is not yet documentation for NNTP module.
2.4/ mbox
---------
The mbox module provides a set of functions to manipulate mbox mailboxes.
These functions make a safe lock on the mailbox they work with.
This module will assign to each message a unique message identifier
so that we can work with message numbers in mbox files without other
programs interfer.
Directory mbox/.
2.4.1/ References
- http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/content-length.html
- http://www.qmail.org/qmail-manual-html/man5/mbox.html
2.4.2/ Dependencies
- tools/
- imf/
2.5.3/ Specific to libEtPan!
- "X-LibEtPan-UID" header
2.5.4/ Files descriptions
mailmbox.[ch] -- functions to manipulate mbox mailboxes.
mailmbox_parse.[ch] -- this module is in charge of parsing the
mbox file content
mailmbox_types.[ch] -- definition of types and constructors for these
types
2.4.5/ Interface
Include for this module is mailmbox.h and includes all other headers.
There is not yet documentation for mbox module.
2.5/ MH
-------
The MH module provides a set of functions to manipulate MH mailboxes.
Directory mh/.
2.5.1/ References
- almost none
2.5.2/ Dependencies
- tools/
2.5.3/ Files descriptions
mailmh.[ch] -- functions to manipulate MH mailboxes.
2.5.4/ Interface
Include for this module is mailmh.h.
There is not yet documentation for MH module.
2.6/ IMF - Internet Message Format
----------------------------------
The IMF module provides functions to parse data given in RFC 2822
format (Internet Message Format).
Directory imf/.
2.6.1/ References
- RFC 2822 - Internet Message Format (Not entirely implemented)
- RFC 2076 - Common Internet Message Headers
Not yet implemented :
- RFC 2298 - An Extensible Message Format
for Message Disposition Notifications
2.6.2/ Dependencies
- tools/
2.6.3/ Files descriptions
mailimf.[ch] -- functions to parse RFC 2822 messages.
mailimf_types.[ch] -- definition of types and constructors for these
types
mailimf_types_helper.[ch] -- contains function definitions that will help
to create data necessary to use IMF module.
mailimf_write.[ch] -- functions that output RFC 2822 messages or
sub-part of the messages in a (FILE *).
2.6.4/ Interface
Include for this module is mailimf.h and includes all other headers.
The interface of IMAP4rev1 is documented in the following files :
mailimf.h
mailimf_types.h
mailimf_types_helper.h
mailimf_write.h
2.7/ MIME - Multipurpose Internet Mail Extensions
-------------------------------------------------
The MIME module provides functions to parse structure of MIME messages.
Directory mime/.
2.7.1/ References
- RFC 2045 - Multipurpose Internet Mail Extensions (MIME) Part One: Format of
Internet Message Bodies.
- RFC 2047 - MIME (Multipurpose Internet Mail Extensions) Part Three: Message
Header Extensions for Non-ASCII Text.
- RFC 2183 - Communicating Presentation Information in Internet Messages:
The Content-Disposition Header Field
Not implemented :
- RFC 2046 - Multipurpose Internet Mail Extensions (MIME) Part Two: Media
Types.
2.7.2/ Dependencies
- tools/
- imf/
2.7.3/ Files descriptions
mailmime.[ch] -- functions to parse the MIME fields (RFC 2045).
mailmime_content.[ch] -- functions to parse the MIME message. You get
the different parts and you can decode them.
mailmime_decode.[ch] -- functions to parse the MIME-encoded fields.
mailmime_disposition.[ch] -- functions to parse the Content-Disposition field
(RFC 2183)
mailmime_types.[ch] -- definition of types and constructors for these
types
mailmime_types_helper.[ch] -- contains function definitions that will help
to create data necessary to use MIME module.
mailmime_write.[ch] -- functions that output MIME messages or
sub-part of the messages in a (FILE *).
2.7.4/ Interface
Include for this module is mailmime.h and includes all other headers.
There is not yet documentation for MIME module.
2.8/ SMTP - Simple Mail Transfer Protocol
-----------------------------------------
Each command of the SMTP Standard (RFC 2821 and RFC 1891) is implemented
in the SMTP module. Directory smtp/.
2.8.1/ References
- RFC 2821 - Simple Mail Transfer Protocol (Not entirely implemented)
- RFC 1891 - SMTP Service Extension for Delivery Status Notifications
2.8.2/ Depencencies
- tools/
2.8.3/ Files descriptions
mailsmtp.[ch] -- functions that implements each SMTP command
mailsmtp_helper.[ch] -- functions to get an easier use of SMTP module
mailsmtp_socket.[ch] -- provides a function to connect to a
SMTP server over TCP
mailsmtp_ssl.[ch] -- provides a function to connect to a
SMTP server over TLS layer
mailsmtp_types.h -- definition of types
2.8.4/ Interface
Include for this module is mailsmtp.h and includes all other headers.
There is not yet documentation for MIME module.
2.9/ Miscellaneous
2.9.1/ References
- RFC 2234 - Augmented BNF for Syntax Specifications: ABNF
- RFC 2595 - Using TLS with IMAP, POP3 and ACAP
2.9.2/ Tools
tools/ directory contains some tools functions and useful data structures.
alloc.h -- a wrapper on malloc()
carray.[ch] -- an array, that grows automatically when elements
are added.
charconv.[ch] -- character set converter. For example, it will
translate an iso-8859-1 string to an utf-8 string.
chash.[ch] -- a hash table which keys can be anything
cinthash.[ch] -- a hash table which keys are integers
(should be removed and replaced with chash)
clist.[ch] -- a double-linked list
connect.[ch] -- easy interface to connect a TCP server
hmac_md5.h
md5.[ch]
md5global.h -- MD5 calculation
mail.h -- some constants
maildb_helper.[ch] -- wrappers to DB 2.x 3.x or 4.x
maillock.[ch] -- safely lock a given file
mailstream.[ch] -- stream interface - buffered reading and writing
on files/socket/SSL connection
mailstream_helper.[ch] -- useful functions for stream
(for example: read a line)
mailstream_low.[ch] -- driver interface for a stream
mailstream_socket.[ch] -- stream driver for file descriptors (includes socket)
mailstream_ssl.[ch] -- stream driver for SSL connection
mailstream_types.h -- data structure definition
mapping.[ch] -- map parts of files in memory (no more used)
mmapstring.[ch] -- a string, that grows automatically when data
are added.
3/ Higher-level
---------------
The higher level will allow us to query folder informations or to get
messages information or content.
There is four kinds of identities :
- storage
- folders
- session
- messages
In the higher-level interface, you manipulate data types from IMF and
MIME module, plus additionnal data types of higher-level.
3.1/ Objects
------------
3.1.1/ Storage
A storage (struct mail_storage) represents whether a server or
a main path, It can be an IMAP server, the root path of a MH or a mbox file.
3.1.2/ Folders
A folder can be created from a storage.
Folders (struct mail_folder) are the mailboxes we can choose in the
server or as sub-folder of the main path.
Folders for IMAP are the IMAP mailboxes, for MH this is one of the
folder of the MH storage, for mbox, there is only one folder, the
mbox file content;
3.1.3/ Session
Storage and folders communicate with the lower-layer through the
mail session data structure.
A mail session (struct mailsession) is a mail access to a server
or a mail access in the local file system. It allow us to send commands
to the mail access.
A mail storage is using a mail session to communicate.
A folder folder also uses a mail session to get information or to send
information. It can be the same session or not, depdending of the
implementation.
3.1.4/ Messages
From a session, we can get a message (struct mailmessage) to read.
3.2/ Drivers
------------
For a mail access, three drivers exist.
One for storage, one for session, one for message.
Note that the folder access rely only on session driver.
3.2.1/ storage driver interface
mail_storage_driver is the driver structure for mail storage
- name is the name of the driver
- connect() connects the storage to the remote access or to
the path in the local filesystem.
- get_folder() can have two kinds of behaviour.
Either it creates a new session and independant from the session
used by the storage and select the given mailbox or
it selects the given mailbox in the current session.
It depends on the efficiency of the mail driver.
- free_data() frees the data created with mail_storage constructor.
a constructor for each kind of access has to be implemented.
3.2.2/ session driver interface
maildriver is the driver structure for mail sessions
- name is the name of the driver
- initialize() is the function that will initializes a data structure
specific to the driver, it returns a value that will be stored
in the field data of the session.
The field data of the session is the state of the session,
the internal data structure used by the driver.
It is called when creating the mailsession structure with
mailsession_new().
- uninitialize() frees the structure created with initialize()
- parameters() implements functions specific to the given mail access
- connect_stream() connects a stream to the session
- connect_path() notify a main path to the session
- starttls() changes the current stream to a TLS stream
- login() notifies the user and the password to authenticate to the
session
- logout() exits the session and closes the stream
- noop() does no operation on the session, but it can be
used to poll for the status of the connection.
- check_folder() makes a checkpoint of the session
- select_folder() selects a mailbox
- expunge_folder() deletes all messages marked \Deleted
- status_folder() queries the status of the folder
(number of messages, number of recent messages, number of
unseen messages)
- append_message() adds a RFC 2822 message to the current
given mailbox
- get_messages_list() returns the list of message numbers
of the current mailbox.
- get_envelopes_list() fills the parsed fields in the
mailmessage structures of the mail_envelopes_list.
- remove_message() removes the given message from the mailbox.
The message is permanently deleted.
- get_message returns a mailmessage structure that corresponds
to the given message number.
3.2.3/ message driver interface
mailmessage_driver is the driver structure to get information from messages.
- name is the name of the driver
- initialize() is the function that will initializes a data structure
specific to the driver, it returns a value that will be stored
in the field data of the mailsession.
The field data of the session is the state of the session,
the internal data structure used by the driver.
It is called when initializing the mailmessage structure with
mailmessage_init().
- uninitialize() frees the structure created with initialize().
It will be called by mailmessage_free().
- flush() will free from memory all temporary structures of the message
(for example, the MIME structure of the message).
- fetch_result_free() will free all strings resulted by fetch() or
any fetch_xxx() functions that returns a string.
- fetch() returns the content of the message (headers and text).
- fetch_header() returns the content of the headers.
- fetch_body() returns the message text (message content without headers)
- fetch_size() returns the size of the message content.
- get_bodystructure() returns the MIME structure of the message.
- fetch_section() returns the content of a given MIME part
- fetch_section_header() returns the header of the message
contained by the given MIME part.
- fetch_section_mime() returns the MIME headers of the
given MIME part.
- fetch_section_body() returns the text (if this is a message, this is the
message content without headers) of the given MIME part.
- fetch_envelope() returns a mailimf_fields structure, with a list of
fields chosen by the driver.
- get_flags() returns a the flags related to the message.
When you want to get flags of a message, you have to make sure to
call get_flags() at least once before using directly message->flags.
3.3/ Higher level interface
---------------------------
3.3.1/ Files descriptions
generic_cache.[ch] -- functions that implements cache and
flags storing mechanism
imapdriver.[ch] -- IMAP driver for session
imapdriver_cached.[ch] -- IMAP driver for session, using cache,
IMAP already has flags.
imapdriver_cached_message.[ch] -- IMAP driver for message, using cache
IMAP already has flags.
imapdriver_message.[ch] -- IMAP driver for message
imapdriver_types.[ch] -- tools function for IMAP driver (types
conversion from IMAP module).
imapstorage.[ch] -- IMAP driver for storage
imfcache.[ch] -- implements cache for parsed fields
libetpan.h -- includes all necessary header files to
use libEtPan!
maildriver.[ch] -- wrappers to calls to the session driver
maildriver_tools.[ch] -- default implementation for drivers,
when the driver does not parse the
messages.
maildriver_types.[ch] -- data types declaration and constructors
maildriver_types_helper.[ch] -- easy data creation
mailmessage.[ch] -- wrappers to calls to the message driver
mailstorage.[ch] -- storage creation, calls to the storage
driver and implementation of folders.
mailstorage_tools.[ch] -- tools for storage (connection)
mailthread.[ch] -- threading: collection of the mails
into a treee
mboxdriver.[ch] -- mbox driver for session
mboxdriver_cached.[ch] -- mbox driver for session, using flags
and cache
mboxdriver_cached_message.[ch] -- mbox driver for message, using flags
and cache
mboxdriver_message.[ch] -- mbox driver for message
mboxdriver_tools.[ch] -- mbox driver common functions
mboxstorage.[ch] -- mbox driver for storage
mhdriver.[ch] -- MH driver for session
mhdriver_cached.[ch] -- MH driver for session, using flags
and cache
mhdriver_cached_message.[ch] -- MH driver for message, using flags
and cache.
mhdriver_message.[ch] -- MH driver for message
mhdriver_tools.[ch] -- MH driver common functions
mhstorage.[ch] -- MH driver for storage
nntpdriver.[ch] -- NNTP driver for session
nntpdriver_cached.[ch] -- NNTP driver for session, using flags
and cache
nntpdriver_cached_message.[ch] -- NNTP driver for message, using flags
and cache
nntpdriver_message.[ch] -- NNTP driver for message
nntpdriver_tools.[ch] -- NNTP driver common functions
nntpstorage.[ch] -- NNTP driver for storage
pop3driver.[ch] -- POP3 driver for session
pop3driver_cached.[ch] -- POP3 driver for session, using flags
and cache
pop3driver_cached_message.[ch] -- POP3 driver for message, using flags
and cache
pop3driver_message.[ch] -- POP3 driver for message
pop3driver_tools.[ch] -- POP3 driver common functions
pop3storage.[ch] -- POP3 driver for storage
3.3.2/ Interfaces
Include for this module is libetpan.h and includes all other headers.
The interface of higher layer is documented in the following files :
maildriver.h
maildriver_types.h
maildriver_types_helper.h
mailmessage.h
mailstorage.h
mailstorage_types.[h]
mailthread.h
4/ Architecture
---------------
(see layer.fig)
5/ Example of use
-----------------
You can find some example in tests/
6/ Constraints
--------------
- libEtPan! must run on a system where mmap() is available.
- for mbox particularly, libEtPan! make assumption on the fact that a
file can be entirely mapped into memory. But if you don't read
mailboxes of 1 Go, it should be fine.