forked from Mirrors/freeswitch
838eb8aaec
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3763 d0543943-73ff-0310-b7d9-9358b9ac24b2
22816 lines
425 KiB
HTML
22816 lines
425 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
|
|
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>libEtPan! API</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"></HEAD
|
|
><BODY
|
|
CLASS="BOOK"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="BOOK"
|
|
><A
|
|
NAME="LIBETPAN-API"
|
|
></A
|
|
><DIV
|
|
CLASS="TITLEPAGE"
|
|
><H1
|
|
CLASS="TITLE"
|
|
><A
|
|
NAME="AEN2"
|
|
>libEtPan! API</A
|
|
></H1
|
|
><H3
|
|
CLASS="AUTHOR"
|
|
><A
|
|
NAME="AEN6"
|
|
></A
|
|
>Viet Hoa DINH</H3
|
|
><P
|
|
CLASS="COPYRIGHT"
|
|
>Copyright © 2003 DINH Viet Hoa</P
|
|
><HR></DIV
|
|
><DIV
|
|
CLASS="TOC"
|
|
><DL
|
|
><DT
|
|
><B
|
|
>Table of Contents</B
|
|
></DT
|
|
><DT
|
|
>1. <A
|
|
HREF="#AEN13"
|
|
>Introduction</A
|
|
></DT
|
|
><DT
|
|
>2. <A
|
|
HREF="#AEN16"
|
|
>Tools and datatypes</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN19"
|
|
>Array</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#CARRAY-NEW"
|
|
>carray_new and carray_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CARRAY-SET-SIZE"
|
|
>carray_set_size</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CARRAY-COUNT"
|
|
>carray_count, carray_add, carray_get and carray_set</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CARRAY-DELETE"
|
|
>carray_delete</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CARRAY-DATA"
|
|
>carray_data</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#CLIST"
|
|
>List</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-NEW"
|
|
>clist_new and clist_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-COUNT"
|
|
>clist_isempty and clist_count</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-BEGIN"
|
|
>running through clist</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-APPEND"
|
|
>clist modification</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-FOREACH"
|
|
>clist_foreach</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CLIST-CONCAT"
|
|
>clist_concat</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN161"
|
|
>Hash table</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-NEW"
|
|
>chash_new and chash_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-GET"
|
|
>chash_set and chash_get</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-DELETE"
|
|
>chash_delete</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-RESIZE"
|
|
>chash_resize</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-BEGIN"
|
|
>running through the chash</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#CHASH-COUNT"
|
|
>chash_size and chash_count</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN229"
|
|
>Buffered I/O</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTREAM-SOCKET"
|
|
>socket stream</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTREAM-SSL"
|
|
>TLS stream</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTREAM-LOW"
|
|
>non-buffered I/O</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN312"
|
|
>strings</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MMAP-STRING-NEW"
|
|
>constructor and destructor</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MMAP-STRING-ASSIGN"
|
|
>string value modification</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MMAP-STRING-APPEND"
|
|
>insertion in string, deletion in string</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MMAP-STRING-REF"
|
|
>referencing string</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
></DL
|
|
></DD
|
|
><DT
|
|
>3. <A
|
|
HREF="#IMF"
|
|
>Internet Message Format</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN397"
|
|
>Quick start</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN400"
|
|
>Parse message headers</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN420"
|
|
>Render the message headers</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN425"
|
|
>Data types</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>mailimf_mailbox - mailbox</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ADDRESS"
|
|
>mailimf_address - address</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MAILBOX-LIST"
|
|
>mailimf_mailbox_list - list of mailboxes</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>mailimf_address_list - list of addresses</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-GROUP"
|
|
>mailimf_group - named group of mailboxes</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-DATE-TIME"
|
|
>mailimf_date_time - date of a message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ORIG-DATE"
|
|
>mailimf_orig_date - parsed content of date header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FROM"
|
|
>mailimf_from - parsed content of From header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-SENDER"
|
|
>mailimf_sender - parsed content of Sender header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-REPLY-TO"
|
|
>mailimf_reply_to - parsed content of Reply-To header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-TO"
|
|
>mailimf_to - parsed content of To header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-CC"
|
|
>mailimf_cc - parsed content of Cc</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-BCC"
|
|
>mailimf_bcc - parsed content of Bcc field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>mailimf_message_id - parsed content of Message-ID header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-IN-REPLY-TO"
|
|
>mailimf_in_reply_to - parsed content of In-Reply-To
|
|
field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-REFERENCES"
|
|
>mailimf_references - parsed content of References field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-SUBJECT"
|
|
>mailimf_subject - parsed content of Subject field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-COMMENTS"
|
|
>mailimf_comments - parsed content of Comments field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-KEYWORDS"
|
|
>mailimf_keywords - parsed content of Keywords field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-RETURN"
|
|
>mailimf_return - parsed content of Return-Path field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-PATH"
|
|
>mailimf_path - address in Return-Path field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-OPTIONAL-FIELD"
|
|
>mailimf_optional_field - non-standard header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FIELD"
|
|
>mailimf_field - header field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>mailimf_fields - list of header fields</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-BODY"
|
|
>mailimf_body - message body without headers</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MESSAGE"
|
|
>mailimf_message - parsed message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-SINGLE-FIELDS"
|
|
>mailimf_single_fields - simplified fields</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN1094"
|
|
>Parser functions</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ADDRESS-LIST-PARSE"
|
|
>mailimf_address_list_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ADDRESS-PARSE"
|
|
>mailimf_address_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-BODY-PARSE"
|
|
>mailimf_body_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ENVELOPE-AND-OPTIONAL-FIELDS-PARSE"
|
|
>mailimf_envelope_and_optional_fields_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ENVELOPE-FIELDS-PARSE"
|
|
>mailimf_envelope_fields_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-OPTIONAL-FIELDS-PARSE"
|
|
>mailimf_optional_fields_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FIELDS-PARSE"
|
|
>mailimf_fields_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-IGNORE-FIELD-PARSE"
|
|
>mailimf_ignore_field_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MAILBOX-LIST-PARSE"
|
|
>mailimf_mailbox_list_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MAILBOX-PARSE"
|
|
>mailimf_mailbox_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MESSAGE-PARSE"
|
|
>mailimf_message_parse</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN1381"
|
|
>Creation functions</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-MAILBOX-LIST-ADD"
|
|
>mailimf_mailbox_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-ADDRESS-LIST-ADD"
|
|
>mailimf_address_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FIELDS-ADD"
|
|
>mailimf_fields</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN1556"
|
|
>Rendering of messages</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILIMF-FIELDS-WRITE"
|
|
>Header fields</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
></DL
|
|
></DD
|
|
><DT
|
|
>4. <A
|
|
HREF="#AEN1586"
|
|
>MIME</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN1598"
|
|
>Quick start</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN1601"
|
|
>Parse MIME message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN1609"
|
|
>Render the MIME message</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN1614"
|
|
>Data types</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-COMPOSITE-TYPE"
|
|
>mailmime_composite_type - Composite MIME type</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>mailmime_content - MIME content type (Content-Type)</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISCRETE-TYPE"
|
|
>mailmime_discrete_type - MIME discrete type</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELD"
|
|
>mailmime_field - MIME header field</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>mailmime_fields - header fields</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-PARAMETER"
|
|
>mailmime_parameter - MIME type parameter</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-TYPE"
|
|
>mailmime_type - MIME main type</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-LANGUAGE"
|
|
>mailmime_language - Language of MIME part</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DATA"
|
|
>mailmime_data - Content of MIME part</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME"
|
|
>mailmime - MIME part</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION"
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION-TYPE"
|
|
>mailmime_disposition_type - Type of MIME disposition</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION-PARM"
|
|
>mailmime_disposition_parm - MIME disposition parameter</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-SINGLE-FIELDS"
|
|
>mailmime_single_fields - MIME headers</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN2180"
|
|
>Parser functions</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-CONTENT-PARSE"
|
|
>mailmime_content_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DESCRIPTION-PARSE"
|
|
>mailmime_description_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-ENCODING-PARSE"
|
|
>mailmime_encoding_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELD-PARSE"
|
|
>mailmime_field_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-ID-PARSE"
|
|
>mailmime_id_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS-PARSE"
|
|
>mailmime_fields_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-VERSION-PARSE"
|
|
>mailmime_version_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-PARAMETER-PARSE"
|
|
>mailmime_parameter_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-LANGUAGE-PARSE"
|
|
>mailmime_language_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION-PARSE"
|
|
>mailmime_disposition_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION-TYPE-PARSE"
|
|
>mailmime_disposition_type_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-ENCODED-PHRASE-PARSE"
|
|
>mailmime_encoded_phrase_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-PARSE"
|
|
>mailmime_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-BASE64-BODY-PARSE"
|
|
>mailmime_base64_body_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-QUOTED-PRINTABLE-BODY-PARSE"
|
|
>mailmime_quoted_printable_body_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-BINARY-BODY-PARSE"
|
|
>mailmime_binary_body_parse</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-PART-PARSE"
|
|
>mailmime_part_parse</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN2583"
|
|
>Rendering of MIME parts</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS-WRITE"
|
|
>mailmime_fields_write, mailmime_content_write and
|
|
mailmime_content_type_write</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-WRITE"
|
|
>mailmime_write</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-QUOTED-PRINTABLE-WRITE"
|
|
>mailmime_quoted_printable_write
|
|
and mailmime_base64_write</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DATA-WRITE"
|
|
>mailmime_data_write</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN2669"
|
|
>Creation functions</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DISPOSITION-NEW-FILENAME"
|
|
>mailmime_disposition_new_filename and
|
|
mailmime_disposition_new_with_data</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS-NEW-EMPTY"
|
|
>mailmime_fields_new_empty and mailmime_fields_add</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS-NEW-WITH-DATA"
|
|
>mailmime_fields_new_with_data and
|
|
mailmime_fields_new_with_version</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-GET-CONTENT-MESSAGE"
|
|
>mailmime_get_content_message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-DATA-NEW-DATA"
|
|
>mailmime_data_new_data and mailmime_data_new_file</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-NEW-MESSAGE-DATA"
|
|
>mailmime_new_message_data, mailmime_new_empty and
|
|
mailmime_new_with_content</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-SET-PREAMBLE-FILE"
|
|
>mailmime_set_preamble_file, mailmime_set_epilogue_file,
|
|
mailmime_set_preamble_text and mailmime_set_epilogue_text</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-SET-BODY-FILE"
|
|
>mailmime_set_body_file and mailmime_set_body_text</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-ADD-PART"
|
|
>mailmime_add_part, mailmime_remove_part,
|
|
mailmime_smart_add_part and mailmime_smart_remove_part</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-SET-IMF-FIELDS"
|
|
>mailmime_set_imf_fields</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-FIELDS-NEW-ENCODING"
|
|
>mailmime_fields_new_encoding and
|
|
mailmime_fields_new_filename</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN2946"
|
|
>Helper functions</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-TRANSFER-ENCODING-GET"
|
|
>mailmime_transfer_encoding_get</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMIME-CONTENT-CHARSET-GET"
|
|
>mailmime_content_charset_get and
|
|
mailmime_content_param_get</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
></DL
|
|
></DD
|
|
><DT
|
|
>5. <A
|
|
HREF="#AEN2988"
|
|
>Storages, folders, messages</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN2990"
|
|
>Introduction</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#AEN2993"
|
|
>Message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN2996"
|
|
>MIME part</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN2999"
|
|
>Mailbox</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3002"
|
|
>Storage</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3005"
|
|
>Folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3008"
|
|
>Session</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN3011"
|
|
>Error codes</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3015"
|
|
>Storage</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTORAGE-DRIVER"
|
|
>Storage driver</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTORAGE"
|
|
>Storage</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTORAGE-NEW"
|
|
>mailstorage_new and mailstorage_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILSTORAGE-CONNECT"
|
|
>mailstorage_connect and mailstorage_disconnect</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3074"
|
|
>IMAP storage</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3077"
|
|
>Example</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN3082"
|
|
>Folder</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-DRIVER"
|
|
>Folder driver</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3095"
|
|
>Folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-NEW"
|
|
>mailfolder_new and mail_folder_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-CONNECT"
|
|
>mailfolder_connect and mailfolder_disconnect</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-NOOP"
|
|
>mailfolder_noop</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-CHECK"
|
|
>mailfolder_check</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-EXPUNGE"
|
|
>mailfolder_expunge</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-STATUS"
|
|
>mailfolder_status</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-APPEND-MESSAGE"
|
|
>mailfolder_append_message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-GET-MESSAGES-LIST"
|
|
>mailfolder_get_messages_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-GET-ENVELOPES-LIST"
|
|
>mailfolder_get_envelopes_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-GET-MESSAGE"
|
|
>mailfolder_get_message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILFOLDER-GET-MESSAGE-BY-UID"
|
|
>mailfolder_get_message_by_uid</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3193"
|
|
>Example</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN3198"
|
|
>Message</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-DRIVER"
|
|
>Message driver</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE"
|
|
>Message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-NEW"
|
|
>mailmessage_new</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-INIT"
|
|
>mailmessage_init</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FLUSH"
|
|
>mailmessage_flush</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-CHECK"
|
|
>mailmessage_check</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-RESULT-FREE"
|
|
>mailmessage_fetch_result_free</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH"
|
|
>mailmessage_fetch</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-HEADER"
|
|
>mailmessage_fetch_header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-BODY"
|
|
>mailmessage_fetch_body</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-SIZE"
|
|
>mailmessage_fetch_size</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-GET-BODYSTRUCTURE"
|
|
>mailmessage_get_bodystructure</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-SECTION"
|
|
>mailmessage_fetch_section</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-SECTION-HEADER"
|
|
>mailmessage_fetch_section_header</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-SECTION-MIME"
|
|
>mailmessage_fetch_section_mime</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-SECTION-BODY"
|
|
>mailmessage_fetch_section_body</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-FETCH-ENVELOPE"
|
|
>mailmessage_fetch_envelope</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-GET-FLAGS"
|
|
>mailmessage_get_flags</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-RESOLVE-SINGLE-FIELDS"
|
|
>mailmessage_resolve_single_fields</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-LIST"
|
|
>Message list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILMESSAGE-TREE"
|
|
>Message tree</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAIL-FLAGS"
|
|
>Message flags</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3467"
|
|
>Example</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
><DT
|
|
><A
|
|
HREF="#AEN3472"
|
|
>Session</A
|
|
></DT
|
|
><DD
|
|
><DL
|
|
><DT
|
|
><A
|
|
HREF="#MAILSESSION-DRIVER"
|
|
>Session driver</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#MAILSESSION"
|
|
>Session</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3670"
|
|
>mailsession_parameters</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3674"
|
|
>mailsession_connect_stream</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3678"
|
|
>mailsession_connect_path</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3682"
|
|
>mailsession_starttls</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3686"
|
|
>mailsession_login</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3690"
|
|
>mailsession_logout</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3694"
|
|
>mailsession_noop</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3698"
|
|
>mailsession_check_folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3702"
|
|
>mailsession_select_folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3706"
|
|
>mailsession_expunge_folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3710"
|
|
>mailsession_status_folder</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3714"
|
|
>mailsession_messages_number</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3718"
|
|
>mailsession_recent_number</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3722"
|
|
>mailsession_unseen_number</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3726"
|
|
>mailsession_append_message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3730"
|
|
>mailsession_get_messages_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3734"
|
|
>mailsession_get_envelopes_list</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3741"
|
|
>mailsession_get_message</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="#AEN3750"
|
|
>mailsession_get_message_by_uid</A
|
|
></DT
|
|
></DL
|
|
></DD
|
|
></DL
|
|
></DD
|
|
></DL
|
|
></DIV
|
|
><DIV
|
|
CLASS="LOT"
|
|
><DL
|
|
CLASS="LOT"
|
|
><DT
|
|
><B
|
|
>List of Examples</B
|
|
></DT
|
|
><DT
|
|
>2-1. <A
|
|
HREF="#AEN35"
|
|
>carray creation</A
|
|
></DT
|
|
><DT
|
|
>2-2. <A
|
|
HREF="#AEN45"
|
|
>preallocating carray</A
|
|
></DT
|
|
><DT
|
|
>2-3. <A
|
|
HREF="#AEN66"
|
|
>carray access</A
|
|
></DT
|
|
><DT
|
|
>2-4. <A
|
|
HREF="#AEN79"
|
|
>deletion in carray</A
|
|
></DT
|
|
><DT
|
|
>2-5. <A
|
|
HREF="#AEN101"
|
|
>clist creation</A
|
|
></DT
|
|
><DT
|
|
>2-6. <A
|
|
HREF="#AEN129"
|
|
>displaying content of clist</A
|
|
></DT
|
|
><DT
|
|
>2-7. <A
|
|
HREF="#AEN145"
|
|
>deleting elements in a clist</A
|
|
></DT
|
|
><DT
|
|
>2-8. <A
|
|
HREF="#AEN158"
|
|
>merging two clists</A
|
|
></DT
|
|
><DT
|
|
>2-9. <A
|
|
HREF="#AEN191"
|
|
>chash insert and lookup</A
|
|
></DT
|
|
><DT
|
|
>2-10. <A
|
|
HREF="#AEN198"
|
|
>key deletion in a chash</A
|
|
></DT
|
|
><DT
|
|
>2-11. <A
|
|
HREF="#AEN219"
|
|
>running through a chash</A
|
|
></DT
|
|
><DT
|
|
>3-1. <A
|
|
HREF="#AEN431"
|
|
>example of mailbox</A
|
|
></DT
|
|
><DT
|
|
>3-2. <A
|
|
HREF="#AEN438"
|
|
>mailbox creation and display</A
|
|
></DT
|
|
><DT
|
|
>3-3. <A
|
|
HREF="#AEN465"
|
|
>address creation and display</A
|
|
></DT
|
|
><DT
|
|
>3-4. <A
|
|
HREF="#AEN480"
|
|
>Creation and display of mailimf_mailbox_list</A
|
|
></DT
|
|
><DT
|
|
>3-5. <A
|
|
HREF="#AEN495"
|
|
>creation and display of list of addresses</A
|
|
></DT
|
|
><DT
|
|
>3-6. <A
|
|
HREF="#AEN502"
|
|
>example of group</A
|
|
></DT
|
|
><DT
|
|
>3-7. <A
|
|
HREF="#AEN515"
|
|
>creation and display of a group</A
|
|
></DT
|
|
><DT
|
|
>3-8. <A
|
|
HREF="#AEN522"
|
|
>example of date</A
|
|
></DT
|
|
><DT
|
|
>3-9. <A
|
|
HREF="#AEN553"
|
|
>creation and display of date</A
|
|
></DT
|
|
><DT
|
|
>3-10. <A
|
|
HREF="#AEN569"
|
|
>creation and display of Date field</A
|
|
></DT
|
|
><DT
|
|
>3-11. <A
|
|
HREF="#AEN585"
|
|
>creation and display of a From header</A
|
|
></DT
|
|
><DT
|
|
>3-12. <A
|
|
HREF="#AEN601"
|
|
>creation and display of Sender field</A
|
|
></DT
|
|
><DT
|
|
>3-13. <A
|
|
HREF="#AEN616"
|
|
>creation and display of Reply-To field</A
|
|
></DT
|
|
><DT
|
|
>3-14. <A
|
|
HREF="#AEN632"
|
|
>creation and display of To field</A
|
|
></DT
|
|
><DT
|
|
>3-15. <A
|
|
HREF="#AEN648"
|
|
>creation and display of Cc field</A
|
|
></DT
|
|
><DT
|
|
>3-16. <A
|
|
HREF="#AEN664"
|
|
>creation and display of Bcc field</A
|
|
></DT
|
|
><DT
|
|
>3-17. <A
|
|
HREF="#AEN673"
|
|
>example of Message-ID</A
|
|
></DT
|
|
><DT
|
|
>3-18. <A
|
|
HREF="#AEN684"
|
|
>creation and display of Message-ID field</A
|
|
></DT
|
|
><DT
|
|
>3-19. <A
|
|
HREF="#AEN702"
|
|
>creation and display of In-Reply-To field</A
|
|
></DT
|
|
><DT
|
|
>3-20. <A
|
|
HREF="#AEN720"
|
|
>creation and display of References field</A
|
|
></DT
|
|
><DT
|
|
>3-21. <A
|
|
HREF="#AEN734"
|
|
>creation and display of Subject field</A
|
|
></DT
|
|
><DT
|
|
>3-22. <A
|
|
HREF="#AEN748"
|
|
>creation and display of Comment field</A
|
|
></DT
|
|
><DT
|
|
>3-23. <A
|
|
HREF="#AEN763"
|
|
>creation and display of Keywords field</A
|
|
></DT
|
|
><DT
|
|
>3-24. <A
|
|
HREF="#AEN778"
|
|
>creation and display of Return-Path field</A
|
|
></DT
|
|
><DT
|
|
>3-25. <A
|
|
HREF="#AEN794"
|
|
>Creation and display of return path</A
|
|
></DT
|
|
><DT
|
|
>3-26. <A
|
|
HREF="#AEN814"
|
|
>creation and display of non-standard fields</A
|
|
></DT
|
|
><DT
|
|
>3-27. <A
|
|
HREF="#AEN961"
|
|
>creation and display of field</A
|
|
></DT
|
|
><DT
|
|
>3-28. <A
|
|
HREF="#AEN977"
|
|
>creation and display of header fields</A
|
|
></DT
|
|
><DT
|
|
>3-29. <A
|
|
HREF="#AEN997"
|
|
>creation and display of message body</A
|
|
></DT
|
|
><DT
|
|
>3-30. <A
|
|
HREF="#AEN1017"
|
|
>creation and display of message</A
|
|
></DT
|
|
><DT
|
|
>3-31. <A
|
|
HREF="#AEN1088"
|
|
>using mailimf_single_fields</A
|
|
></DT
|
|
><DT
|
|
>3-32. <A
|
|
HREF="#AEN1091"
|
|
>using mailimf_single_fields without memory allocation</A
|
|
></DT
|
|
><DT
|
|
>3-33. <A
|
|
HREF="#AEN1120"
|
|
>parsing a list of addresses</A
|
|
></DT
|
|
><DT
|
|
>3-34. <A
|
|
HREF="#AEN1147"
|
|
>parsing an address</A
|
|
></DT
|
|
><DT
|
|
>3-35. <A
|
|
HREF="#AEN1174"
|
|
>parsing a message body</A
|
|
></DT
|
|
><DT
|
|
>3-36. <A
|
|
HREF="#AEN1201"
|
|
>parsing commonly used fields and return other fields
|
|
in a non-parsed form</A
|
|
></DT
|
|
><DT
|
|
>3-37. <A
|
|
HREF="#AEN1228"
|
|
>parsing commonly used fields</A
|
|
></DT
|
|
><DT
|
|
>3-38. <A
|
|
HREF="#AEN1255"
|
|
>parsing optional fields</A
|
|
></DT
|
|
><DT
|
|
>3-39. <A
|
|
HREF="#AEN1282"
|
|
>parsing header fields</A
|
|
></DT
|
|
><DT
|
|
>3-40. <A
|
|
HREF="#AEN1304"
|
|
>skipping fields</A
|
|
></DT
|
|
><DT
|
|
>3-41. <A
|
|
HREF="#AEN1329"
|
|
>parsing a list of mailboxes</A
|
|
></DT
|
|
><DT
|
|
>3-42. <A
|
|
HREF="#AEN1354"
|
|
>parsing a mailbox</A
|
|
></DT
|
|
><DT
|
|
>3-43. <A
|
|
HREF="#AEN1378"
|
|
>parsing a message</A
|
|
></DT
|
|
><DT
|
|
>3-44. <A
|
|
HREF="#AEN1411"
|
|
>creating a list of mailboxes</A
|
|
></DT
|
|
><DT
|
|
>3-45. <A
|
|
HREF="#AEN1553"
|
|
>creation of header fields</A
|
|
></DT
|
|
><DT
|
|
>3-46. <A
|
|
HREF="#AEN1583"
|
|
>rendering of fields</A
|
|
></DT
|
|
><DT
|
|
>4-1. <A
|
|
HREF="#AEN1635"
|
|
>create and display MIME composite type</A
|
|
></DT
|
|
><DT
|
|
>4-2. <A
|
|
HREF="#AEN1667"
|
|
>Creation and display of MIME content type</A
|
|
></DT
|
|
><DT
|
|
>4-3. <A
|
|
HREF="#AEN1691"
|
|
>Creation and display of MIME discrete type</A
|
|
></DT
|
|
><DT
|
|
>4-4. <A
|
|
HREF="#AEN1757"
|
|
>Creation and display of MIME header field</A
|
|
></DT
|
|
><DT
|
|
>4-5. <A
|
|
HREF="#AEN1784"
|
|
>Creation and display of MIME transfer encoding mechanism</A
|
|
></DT
|
|
><DT
|
|
>4-6. <A
|
|
HREF="#AEN1799"
|
|
>Creation and display of MIME fields</A
|
|
></DT
|
|
><DT
|
|
>4-7. <A
|
|
HREF="#AEN1821"
|
|
>Creation and display of MIME type parameter</A
|
|
></DT
|
|
><DT
|
|
>4-8. <A
|
|
HREF="#AEN1851"
|
|
>Creation and display of MIME main type</A
|
|
></DT
|
|
><DT
|
|
>4-9. <A
|
|
HREF="#AEN1864"
|
|
>Creation and display of language of MIME part</A
|
|
></DT
|
|
><DT
|
|
>4-10. <A
|
|
HREF="#AEN1906"
|
|
>Creation and display of MIME part content</A
|
|
></DT
|
|
><DT
|
|
>4-11. <A
|
|
HREF="#AEN2007"
|
|
>Creation and display of MIME part</A
|
|
></DT
|
|
><DT
|
|
>4-12. <A
|
|
HREF="#AEN2026"
|
|
>Creation and display of MIME disposition information</A
|
|
></DT
|
|
><DT
|
|
>4-13. <A
|
|
HREF="#AEN2041"
|
|
>Creation and display of MIME disposition type</A
|
|
></DT
|
|
><DT
|
|
>4-14. <A
|
|
HREF="#AEN2090"
|
|
>Creation and display of MIME disposition
|
|
parameter</A
|
|
></DT
|
|
><DT
|
|
>4-15. <A
|
|
HREF="#AEN2177"
|
|
>Creation and display of single fields</A
|
|
></DT
|
|
><DT
|
|
>4-16. <A
|
|
HREF="#AEN2203"
|
|
>Parsing MIME content type</A
|
|
></DT
|
|
><DT
|
|
>4-17. <A
|
|
HREF="#AEN2227"
|
|
>Parsing MIME description</A
|
|
></DT
|
|
><DT
|
|
>4-18. <A
|
|
HREF="#AEN2251"
|
|
>parsing MIME encoding mechanism</A
|
|
></DT
|
|
><DT
|
|
>4-19. <A
|
|
HREF="#AEN2267"
|
|
>parsing MIME header field</A
|
|
></DT
|
|
><DT
|
|
>4-20. <A
|
|
HREF="#AEN2291"
|
|
>Parsing MIME content identifier</A
|
|
></DT
|
|
><DT
|
|
>4-21. <A
|
|
HREF="#AEN2307"
|
|
>parsing MIME header fields</A
|
|
></DT
|
|
><DT
|
|
>4-22. <A
|
|
HREF="#AEN2331"
|
|
>parsing MIME version</A
|
|
></DT
|
|
><DT
|
|
>4-23. <A
|
|
HREF="#AEN2356"
|
|
>parsing a MIME parameter</A
|
|
></DT
|
|
><DT
|
|
>4-24. <A
|
|
HREF="#AEN2380"
|
|
>Parsing the MIME content langage</A
|
|
></DT
|
|
><DT
|
|
>4-25. <A
|
|
HREF="#AEN2404"
|
|
>Parsing the MIME content disposition</A
|
|
></DT
|
|
><DT
|
|
>4-26. <A
|
|
HREF="#AEN2427"
|
|
>parsing a MIME content disposition type</A
|
|
></DT
|
|
><DT
|
|
>4-27. <A
|
|
HREF="#AEN2455"
|
|
>decoding a MIME encoded header string</A
|
|
></DT
|
|
><DT
|
|
>4-28. <A
|
|
HREF="#AEN2478"
|
|
>parsing a MIME message</A
|
|
></DT
|
|
><DT
|
|
>4-29. <A
|
|
HREF="#AEN2501"
|
|
>Parsing a base64 encoded part</A
|
|
></DT
|
|
><DT
|
|
>4-30. <A
|
|
HREF="#AEN2524"
|
|
>Parsing a quoted printable encoded part</A
|
|
></DT
|
|
><DT
|
|
>4-31. <A
|
|
HREF="#AEN2547"
|
|
>Parsing a binary encoded part</A
|
|
></DT
|
|
><DT
|
|
>4-32. <A
|
|
HREF="#AEN2580"
|
|
>Parsing a MIME encoded part</A
|
|
></DT
|
|
><DT
|
|
>4-33. <A
|
|
HREF="#AEN2610"
|
|
>rendering MIME header fields</A
|
|
></DT
|
|
><DT
|
|
>4-34. <A
|
|
HREF="#AEN2649"
|
|
>render base64 or quoted printable</A
|
|
></DT
|
|
><DT
|
|
>4-35. <A
|
|
HREF="#AEN2694"
|
|
>creating a MIME content disposition</A
|
|
></DT
|
|
><DT
|
|
>4-36. <A
|
|
HREF="#AEN2713"
|
|
>creating a MIME header fields list</A
|
|
></DT
|
|
><DT
|
|
>4-37. <A
|
|
HREF="#AEN2728"
|
|
>creating new fields</A
|
|
></DT
|
|
><DT
|
|
>4-38. <A
|
|
HREF="#AEN2746"
|
|
>Creating a MIME content type</A
|
|
></DT
|
|
><DT
|
|
>4-39. <A
|
|
HREF="#AEN2779"
|
|
>creating MIME content</A
|
|
></DT
|
|
><DT
|
|
>4-40. <A
|
|
HREF="#AEN2809"
|
|
>creating a MIME part</A
|
|
></DT
|
|
><DT
|
|
>4-41. <A
|
|
HREF="#AEN2837"
|
|
>setting preamble and epilogue</A
|
|
></DT
|
|
><DT
|
|
>4-42. <A
|
|
HREF="#AEN2861"
|
|
>creating a MIME part</A
|
|
></DT
|
|
><DT
|
|
>4-43. <A
|
|
HREF="#AEN2892"
|
|
>modifying MIME structure</A
|
|
></DT
|
|
><DT
|
|
>4-44. <A
|
|
HREF="#AEN2909"
|
|
>modifying MIME structure</A
|
|
></DT
|
|
><DT
|
|
>4-45. <A
|
|
HREF="#AEN2943"
|
|
>creating MIME fields with only Content-Transfer-Encoding</A
|
|
></DT
|
|
><DT
|
|
>4-46. <A
|
|
HREF="#AEN2960"
|
|
>extracting MIME encoding mechanism</A
|
|
></DT
|
|
><DT
|
|
>4-47. <A
|
|
HREF="#AEN2985"
|
|
>extracting information from MIME content type</A
|
|
></DT
|
|
><DT
|
|
>5-1. <A
|
|
HREF="#AEN3079"
|
|
>use of storage</A
|
|
></DT
|
|
><DT
|
|
>5-2. <A
|
|
HREF="#AEN3195"
|
|
>use of folder</A
|
|
></DT
|
|
><DT
|
|
>5-3. <A
|
|
HREF="#AEN3469"
|
|
>use of message</A
|
|
></DT
|
|
></DL
|
|
></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><HR><H1
|
|
><A
|
|
NAME="AEN13"
|
|
></A
|
|
>Chapter 1. Introduction</H1
|
|
><P
|
|
> This document will describe the API of libEtPan!
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><HR><H1
|
|
><A
|
|
NAME="AEN16"
|
|
></A
|
|
>Chapter 2. Tools and datatypes</H1
|
|
><P
|
|
> libEtPan! include a collection of datatypes such as lists,
|
|
arrays, hash tables and tools such as buffered I/O.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN19"
|
|
>Array</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct carray_s carray;
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
> is an array of pointers that will
|
|
resize automatically in case a new element is added.
|
|
</P
|
|
><P
|
|
>
|
|
The <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
> is implemented with an array
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(void **)</B
|
|
> that can be resized. An array has a
|
|
size: this is the number of elements that can be added before
|
|
the table is resized. It also has a count of elements: this is
|
|
the elements that exist in the array.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-NEW"
|
|
>carray_new and carray_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>carray * carray_new(unsigned int initsize);
|
|
|
|
void carray_free(carray * array);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_new()</B
|
|
> creates a new array with an
|
|
initial size. The array is not resized until the number of
|
|
element reach the initial size. It returns
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> in case of failure.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_free()</B
|
|
> releases memory used by the
|
|
given array.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN35"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-1. carray creation</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <stdlib.h>
|
|
|
|
#define SIZE 50
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
exit(EXIT_FAILURE);
|
|
|
|
/* do things here */
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-SET-SIZE"
|
|
>carray_set_size</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_set_size(carray * array, uint32_t new_size);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_set_size()</B
|
|
> sets the size of the
|
|
array. It returns <B
|
|
CLASS="COMMAND"
|
|
>0</B
|
|
> in case of success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>-1</B
|
|
> in case of failure.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN45"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-2. preallocating carray</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <stdlib.h>
|
|
|
|
#define SIZE 50
|
|
#define NEWSIZE 200
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
unsigned int i;
|
|
char p[500];
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_set_size(NEWSIZE);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
for(i = 0 ; i < NEWSIZE ; i ++)
|
|
carray_set(a, i, &p[i]);
|
|
|
|
/* do things here */
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-COUNT"
|
|
>carray_count, carray_add, carray_get and carray_set</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_count(carray);
|
|
|
|
int carray_add(carray * array, void * data, unsigned int * index);
|
|
|
|
void * carray_get(carray * array, unsigned int indx);
|
|
|
|
void carray_set(carray * array, unsigned int indx, void * value);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_count()</B
|
|
> returns the number of
|
|
elements in the <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
>.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_add()</B
|
|
>adds an element at the end of
|
|
the array. The <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> of the element is
|
|
returns in <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> if
|
|
<B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is not <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>. It
|
|
returns <B
|
|
CLASS="COMMAND"
|
|
>0</B
|
|
> in case of success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>-1</B
|
|
> in case of failure.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_get()</B
|
|
> returns the elements contained
|
|
at the given cell of the table.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_set()</B
|
|
> replace the element at the
|
|
given index of table table with the given value.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN66"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-3. carray access</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <string.h>
|
|
|
|
#define SIZE 50
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
int r;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_add(a, "foo-bar-1", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-2", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-3", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
for(i = 0 ; i < carray_count(a) ; i ++) {
|
|
char * str;
|
|
|
|
str = carray_get(a, i);
|
|
if (strcmp("foo-bar-2", str) == 0)
|
|
carray_set(a, i, "foo-bar-2-replacement");
|
|
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-DELETE"
|
|
>carray_delete</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_delete(carray * array, uint32_t indx);
|
|
|
|
int carray_delete_slow(carray * array, uint32_t indx);
|
|
|
|
int carray_delete_fast(carray * array, uint32_t indx);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete()</B
|
|
> removes an element of the
|
|
table. Order will not be garanteed. The returned result can
|
|
be ignored.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete_slow()</B
|
|
> removes an element of
|
|
the table. Order will be garanteed. The returned result can
|
|
be ignored.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete_fast()</B
|
|
> the element will just
|
|
be replaced with <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>. Order will be kept
|
|
but the number of elements will remains the same. The
|
|
returned result can be ignored.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN79"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-4. deletion in carray</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define SIZE 50
|
|
|
|
carray * build_array(void)
|
|
{
|
|
carray * a;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_add(a, "foo-bar-1", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-2", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-3", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
return a;
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
void delete(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete(a, 0);
|
|
/* resulting size is 2, order of elements is undefined */
|
|
}
|
|
|
|
void delete_slow(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete_slow(a, 0);
|
|
/* resulting size is 2, order of elements is the same */
|
|
}
|
|
|
|
void delete_fast(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete_slow(a, 0);
|
|
/*
|
|
resulting size is 3,
|
|
order of elements is { NULL, foo-bar-2, foo-bar-3 }
|
|
*/
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-DATA"
|
|
>carray_data</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>void ** carray_data(carray);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_data</B
|
|
>returns the table used for
|
|
implementation :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(void **)</B
|
|
>.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="CLIST"
|
|
>List</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct clist_s clist;
|
|
|
|
typedef clistcell clistiter;
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist()</B
|
|
> is a list of cells.
|
|
Each cell of the list contains one element. This element is a
|
|
pointer. An iterator (<B
|
|
CLASS="COMMAND"
|
|
>clistiter</B
|
|
>) is a
|
|
pointer to an element of the list. With an iterator, we can
|
|
get the previous element of the list, the next element of the
|
|
list and the content of the element.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-NEW"
|
|
>clist_new and clist_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>clist * clist_new(void);
|
|
|
|
void clist_free(clist *);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_new()</B
|
|
> allocates a new empty list and
|
|
returns it.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_free()</B
|
|
> frees the entire list with
|
|
its cells.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN101"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-5. clist creation</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
clist * list;
|
|
|
|
list = clist_new();
|
|
if (list == NULL)
|
|
goto err;
|
|
|
|
r = clist_append(list, "foo-bar");
|
|
if (r < 0)
|
|
|
|
clist_free(list);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free:
|
|
clist_free(list);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-COUNT"
|
|
>clist_isempty and clist_count</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int clist_isempty(clist *);
|
|
|
|
int clist_count(clist *);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_isempty()</B
|
|
> returns 1 if the list is
|
|
empty, else it is 0.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_count()</B
|
|
> returns the number of
|
|
elements in the list.
|
|
Complexity is O(1).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-BEGIN"
|
|
>running through clist</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>clistiter * clist_begin(clist *);
|
|
|
|
clistiter * clist_end(clist *);
|
|
|
|
clistiter * clist_next(clistiter *);
|
|
|
|
clistiter * clist_previous(clistiter *);
|
|
|
|
void * clist_content(clistiter *);
|
|
|
|
void * clist_nth_data(clist * lst, int index);
|
|
|
|
clistiter * clist_nth(clist * lst, int index);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_begin()</B
|
|
> returns an iterator to the
|
|
first element of the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_end()</B
|
|
> returns an iterator to the last
|
|
element of the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_next()</B
|
|
> returns an iterator to the
|
|
next element of the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_previous()</B
|
|
> returns an iterator to the
|
|
previous element of the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_content()</B
|
|
> returns the element
|
|
contained in the cell pointed by the iterator in the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_nth()</B
|
|
> returns an iterator on the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
>-th element of the list.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_nth_data()</B
|
|
> returns the index-th
|
|
element of the list.
|
|
Complexity is O(n).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN129"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-6. displaying content of clist</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
clist * list;
|
|
clistiter * iter;
|
|
|
|
list = build_string_list();
|
|
if (list == NULL)
|
|
goto err;
|
|
|
|
for(iter = clist_begin(list) ; iter != NULL ; iter =
|
|
clist_next(iter)) {
|
|
char * str;
|
|
|
|
str = clist_content(iter);
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
clist_free(list);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free:
|
|
clist_free(list);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-APPEND"
|
|
>clist modification</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int clist_prepend(clist *, void *);
|
|
|
|
int clist_append(clist *, void *);
|
|
|
|
int clist_insert_before(clist *, clistiter *, void *);
|
|
|
|
int clist_insert_after(clist *, clistiter *, void *);
|
|
|
|
clistiter * clist_delete(clist *, clistiter *);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_prepend()</B
|
|
> adds an element at the
|
|
beginning of the list. Returns 0 on sucess, -1 on error.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_append()</B
|
|
> adds an element at the end
|
|
of the list. Returns 0 on sucess, -1 on error.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_insert_before()</B
|
|
> adds an element
|
|
before the element pointed by the given iterator in the
|
|
list. Returns 0 on sucess, -1 on error.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_insert_after()</B
|
|
> adds an element after
|
|
the element pointed by the given iterator in the list.
|
|
Returns 0 on sucess, -1 on error.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_delete()</B
|
|
> the elements pointed by
|
|
the given iterator in the list and returns an iterator to
|
|
the next element of the list.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN145"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-7. deleting elements in a clist</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
voir print_content(void * content, void * user_data)
|
|
{
|
|
char * str;
|
|
|
|
str = content;
|
|
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
clist * list;
|
|
clistiter * iter;
|
|
|
|
list = build_string_list();
|
|
if (list == NULL)
|
|
goto err;
|
|
|
|
iter = = clist_begin(list);
|
|
while (iter != NULL)
|
|
char * str;
|
|
|
|
str = clist_content(iter);
|
|
if (strcmp(str, "foo-bar") == 0)
|
|
iter = clist_delete(list, cur);
|
|
else
|
|
iter = clist_next(iter);
|
|
}
|
|
|
|
clist_foreach(list, print_content, NULL);
|
|
printf("\n");
|
|
|
|
clist_free(list);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free:
|
|
clist_free(list);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-FOREACH"
|
|
>clist_foreach</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>typedef void (* clist_func)(void *, void *);
|
|
|
|
void clist_foreach(clist * lst, clist_func func, void * data);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_foreach()</B
|
|
> apply a fonction to each
|
|
element of the list.
|
|
Complexity is O(n).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CLIST-CONCAT"
|
|
>clist_concat</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>void clist_concat(clist * dest, clist * src);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>clist_concat()</B
|
|
> adds all the elements of src
|
|
at the end of dest. Elements are added in the same
|
|
order. src is an empty list when the operation is finished.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN158"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-8. merging two clists</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
clist * list;
|
|
clist * list_2;
|
|
clistiter * iter;
|
|
|
|
list = build_string_list();
|
|
if (list == NULL)
|
|
goto err;
|
|
|
|
list_2 = build_string_list_2();
|
|
if (list == NULL)
|
|
goto free_list;
|
|
|
|
clist_concat(list, list_2);
|
|
clist_free(list_2);
|
|
|
|
for(iter = clist_begin(list) ; iter != NULL ; iter =
|
|
clist_next(iter)) {
|
|
char * str;
|
|
|
|
str = clist_content(iter);
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
clist_free(list);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free_list:
|
|
clist_free(list);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN161"
|
|
>Hash table</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct chash chash;
|
|
|
|
typedef struct chashcell chashiter;
|
|
|
|
typedef struct {
|
|
char * data;
|
|
int len;
|
|
} chashdatum;
|
|
</PRE
|
|
><P
|
|
>
|
|
<B
|
|
CLASS="COMMAND"
|
|
>chash</B
|
|
> is a hash table.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>chashiter</B
|
|
> is a pointer to an element of the
|
|
hash table.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>chashdatum</B
|
|
> is an element to be placed in
|
|
the hash table as a key or a value. It consists in
|
|
data and a corresponding length.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-NEW"
|
|
>chash_new and chash_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#define CHASH_COPYNONE 0
|
|
#define CHASH_COPYKEY 1
|
|
#define CHASH_COPYVALUE 2
|
|
#define CHASH_COPYALL (CHASH_COPYKEY | CHASH_COPYVALUE)
|
|
|
|
chash * chash_new(int size, int flags);
|
|
|
|
void chash_free(chash * hash);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_new()</B
|
|
> returns a new empty hash table
|
|
or <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> if this
|
|
failed. <B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> is the initial size of the
|
|
table used for implementation. <B
|
|
CLASS="COMMAND"
|
|
>flags</B
|
|
> can
|
|
be a combinaison of <B
|
|
CLASS="COMMAND"
|
|
>CHASH_COPYKEY</B
|
|
> and
|
|
<B
|
|
CLASS="COMMAND"
|
|
>CHASH_COPYVALUE</B
|
|
>.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>CHASH_COPYKEY</B
|
|
> enables copy of key, so
|
|
that the initial value used for <B
|
|
CLASS="COMMAND"
|
|
>chash_set()</B
|
|
>
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_free()</B
|
|
> releases memory used by the
|
|
hash table.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-GET"
|
|
>chash_set and chash_get</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int chash_set(chash * hash,
|
|
chashdatum * key, chashdatum * value, chashdatum * oldvalue);
|
|
|
|
int chash_get(chash * hash,
|
|
chashdatum * key, chashdatum * result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_set()</B
|
|
> adds a new element into the
|
|
hash table. If a previous element had the same key, it is
|
|
returns into oldvalue if <B
|
|
CLASS="COMMAND"
|
|
>oldvalue</B
|
|
> is
|
|
different of NULL.
|
|
Medium complexity is O(1).
|
|
</P
|
|
><P
|
|
> returns -1 if it fails, 0 on success.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_get()</B
|
|
>returns the corresponding value
|
|
of the given key. If there is no corresponding value, -1 is
|
|
returned. 0 on success.
|
|
Medium complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN191"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-9. chash insert and lookup</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(void)
|
|
{
|
|
chash * hash;
|
|
int r;
|
|
chashdatum key;
|
|
chashdatum value;
|
|
char * str1 = "my-data";
|
|
char * str2 = "my-data";
|
|
|
|
hash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYNONE);
|
|
|
|
key.data = "foo";
|
|
key.len = strlen("foo");
|
|
value.data = str1;
|
|
value.data = strlen(str1) + 1;
|
|
/* + 1 is needed to get the terminal zero in the returned string */
|
|
r = chash_set(hash, &key, &value, NULL);
|
|
if (r < 0)
|
|
goto free_hash;
|
|
|
|
key.data = "bar";
|
|
key.len = strlen("bar");
|
|
value.data = str2;
|
|
value.data = strlen(str2) + 1;
|
|
if (r < 0)
|
|
goto free_hash;
|
|
|
|
key.data = "foo";
|
|
key.len = strlen("foo");
|
|
r = chash_get(hash, &key, &value);
|
|
if (r < 0) {
|
|
printf("element not found\n");
|
|
}
|
|
else {
|
|
char * str;
|
|
|
|
str = value.data;
|
|
printf("found : %s", str);
|
|
}
|
|
|
|
chash_free(hash);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free_hash:
|
|
chash_free(hash);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-DELETE"
|
|
>chash_delete</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int chash_delete(chash * hash,
|
|
chashdatum * key, chashdatum * oldvalue);
|
|
</PRE
|
|
><P
|
|
> deletes the key/value pair given the corresponding key.
|
|
The value is returned in old_value.
|
|
If there is no corresponding value, -1 is returned. 0 on success.
|
|
Medium complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN198"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-10. key deletion in a chash</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(void)
|
|
{
|
|
chash * hash;
|
|
int r;
|
|
chashdatum key;
|
|
chashdatum value;
|
|
char * str1 = "my-data";
|
|
char * str2 = "my-data";
|
|
|
|
hash = build_hash();
|
|
|
|
key.data = "foo";
|
|
key.len = strlen("foo");
|
|
chash_delete(hash, &key, &value);
|
|
|
|
/* it will never be possible to lookup "foo" */
|
|
key.data = "foo";
|
|
key.len = strlen("foo");
|
|
r = chash_get(hash, &key, &value);
|
|
if (r < 0) {
|
|
printf("element not found\n");
|
|
}
|
|
else {
|
|
char * str;
|
|
|
|
str = value.data;
|
|
printf("found : %s", str);
|
|
}
|
|
|
|
chash_free(hash);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
free_hash:
|
|
chash_free(hash);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-RESIZE"
|
|
>chash_resize</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int chash_resize(chash * hash, int size);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_resize()</B
|
|
> changes the size of the
|
|
table used for implementation of the hash table.
|
|
returns 0 on success, -1 on failure.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-BEGIN"
|
|
>running through the chash</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>chashiter * chash_begin(chash * hash);
|
|
|
|
chashiter * chash_next(chash * hash, chashiter * iter);
|
|
|
|
void chash_key(chashiter * iter, chashdatum * result);
|
|
|
|
void chash_value(chashiter iter, chashdatum * result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_begin()</B
|
|
> returns a pointer to the
|
|
first element of the hash table. Returns
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> if there is no elements in the hash
|
|
table.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_next()</B
|
|
> returns a pointer to the next
|
|
element of the hash table. Returns <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>
|
|
if there is no next element.
|
|
Complexity is O(n) but n calls to chash_next() also has
|
|
a complexity of O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_key()</B
|
|
> returns the key of the given
|
|
element of the hash table.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_value</B
|
|
> returns the value of the
|
|
given element of the hash table.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN219"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-11. running through a chash</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(void)
|
|
{
|
|
chash * hash;
|
|
int r;
|
|
chashiter * iter;
|
|
|
|
hash = build_hash();
|
|
|
|
/* this will display all the values stored in the hash */
|
|
for(iter = chash_begin(hash) ; iter != NULL ; iter =
|
|
chash_next(hash, iter)) {
|
|
chashdatum key;
|
|
chashdatum value;
|
|
char * str;
|
|
|
|
chash_value(iter, &value);
|
|
str = value.data;
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
chash_free(hash);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CHASH-COUNT"
|
|
>chash_size and chash_count</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int chash_size(chash * hash);
|
|
|
|
int chash_count(chash * hash);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_size()</B
|
|
> returns the size of the table
|
|
used for implementation of the hash table.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>chash_count()</B
|
|
> returns the number of
|
|
elements in the hash table.
|
|
Complexity is O(1).
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN229"
|
|
>Buffered I/O</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
typedef struct _mailstream mailstream;
|
|
</PRE
|
|
><P
|
|
> streams are objects where we can read data from and write data
|
|
to. They are not seekable. That can be for example a pipe or a
|
|
network stream.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>mailstream * mailstream_new(mailstream_low * low, size_t buffer_size);
|
|
|
|
int mailstream_close(mailstream * s);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_new()</B
|
|
> creates a new stream
|
|
stream with the low-level (see <A
|
|
HREF="#MAILSTREAM-LOW"
|
|
>the Section called <I
|
|
>non-buffered I/O</I
|
|
></A
|
|
>)
|
|
stream and a given buffer size.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_close()</B
|
|
> closes the stream.
|
|
This function will be in charge to free the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailstream_low</B
|
|
> structure.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
ssize_t mailstream_write(mailstream * s, void * buf, size_t count);
|
|
|
|
int mailstream_flush(mailstream * s);
|
|
|
|
ssize_t mailstream_read(mailstream * s, void * buf, size_t count);
|
|
|
|
ssize_t mailstream_feed_read_buffer(mailstream * s);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_write()</B
|
|
> writes a buffer to the
|
|
given stream. This write operation will be buffered.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_flush()</B
|
|
> will force a write of
|
|
all buffered data for a given stream.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read()</B
|
|
> reads data from the
|
|
stream to the given buffer.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_feed_read_buffer()</B
|
|
> this function
|
|
will just fill the buffer for reading.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
mailstream_low * mailstream_get_low(mailstream * s);
|
|
|
|
void mailstream_set_low(mailstream * s, mailstream_low * low);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_get_low()</B
|
|
> returns the low-level
|
|
stream of the given stream.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_set_low()</B
|
|
> changes the low-level
|
|
of the given stream. Useful, for
|
|
example, when a stream change from clear stream to SSL
|
|
stream.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>char * mailstream_read_line(mailstream * stream, MMAPString * line);
|
|
|
|
char * mailstream_read_line_append(mailstream * stream, MMAPString * line);
|
|
|
|
char * mailstream_read_line_remove_eol(mailstream * stream, MMAPString * line);
|
|
|
|
char * mailstream_read_multiline(mailstream * s, size_t size,
|
|
MMAPString * stream_buffer,
|
|
MMAPString * multiline_buffer,
|
|
size_t progr_rate,
|
|
progress_function * progr_fun);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read_line()</B
|
|
> reads an entire line
|
|
from the buffer and store it into the
|
|
given string. returns <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> on error, the
|
|
corresponding array
|
|
of <B
|
|
CLASS="COMMAND"
|
|
>char</B
|
|
> is returned otherwise.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read_line_append()</B
|
|
> reads an entire
|
|
line from the buffer and appends it to the
|
|
given string. returns <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> on error, the
|
|
array of char corresponding to the entire buffer is returned
|
|
otherwise.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read_line_remove_eol()</B
|
|
> reads an
|
|
entire line from the buffer and store it into the
|
|
given string. All CR LF are removed.
|
|
returns <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> on error, the corresponding
|
|
array of <B
|
|
CLASS="COMMAND"
|
|
>char</B
|
|
> is returned otherwise.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read_multiline()</B
|
|
> reads a
|
|
multiline data (several lines, the data are ended with
|
|
a single period '.')
|
|
from the given stream and store it into the given
|
|
multiline buffer (multiline_buffer). progr_rate should be 0
|
|
and progr_fun <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> (deprecated things).
|
|
<B
|
|
CLASS="COMMAND"
|
|
>stream_buffer</B
|
|
> is a buffer used for internal
|
|
work of the function.
|
|
size should be 0 (deprecated things).
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
int mailstream_is_end_multiline(char * line);
|
|
</PRE
|
|
><P
|
|
> returns 1 if the line is an end of multiline data (a single
|
|
period '.', eventually with CR and/or LF). 0 is returned
|
|
otherwise.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
int mailstream_send_data(mailstream * s, char * message,
|
|
size_t size,
|
|
size_t progr_rate,
|
|
progress_function * progr_fun);
|
|
</PRE
|
|
><P
|
|
> sends multiline data to the given stream.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> is the size of the data.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>progr_rate</B
|
|
> and <B
|
|
CLASS="COMMAND"
|
|
>progr_fun</B
|
|
>
|
|
are deprecated. <B
|
|
CLASS="COMMAND"
|
|
>progr_rate</B
|
|
> must be 0,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>progr_fun</B
|
|
> must be NULL.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTREAM-SOCKET"
|
|
>socket stream</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>mailstream * mailstream_socket_open(int fd);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_socket_open()</B
|
|
> will open a
|
|
clear-text socket.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTREAM-SSL"
|
|
>TLS stream</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>mailstream * mailstream_ssl_open(int fd);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_ssl_open()</B
|
|
> will open a
|
|
TLS/SSL socket.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="MAILSTREAM-LOW"
|
|
>non-buffered I/O</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
struct mailstream_low_driver {
|
|
ssize_t (* mailstream_read)(mailstream_low *, void *, size_t);
|
|
ssize_t (* mailstream_write)(mailstream_low *, void *, size_t);
|
|
int (* mailstream_close)(mailstream_low *);
|
|
int (* mailstream_get_fd)(mailstream_low *);
|
|
void (* mailstream_free)(mailstream_low *);
|
|
};
|
|
|
|
typedef struct mailstream_low_driver mailstream_low_driver;
|
|
|
|
struct _mailstream_low {
|
|
void * data;
|
|
mailstream_low_driver * driver;
|
|
};
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_low</B
|
|
> is a non-buffered stream.
|
|
</P
|
|
><P
|
|
> The <B
|
|
CLASS="COMMAND"
|
|
>mailstream_low_driver</B
|
|
> is a set of
|
|
functions used to access the stream.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_read/write/close()</B
|
|
> is the same
|
|
interface as <B
|
|
CLASS="COMMAND"
|
|
>read/write/close()</B
|
|
>
|
|
system calls, except that the file descriptor is replaced with the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailstream_low</B
|
|
> structure.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_get_fd()</B
|
|
> returns the file
|
|
descriptor used for this non-buffered stream.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstream_free()</B
|
|
> is in charge to free
|
|
the internal structure of the mailstream_low and the
|
|
mailstream_low itself.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
mailstream_low * mailstream_low_new(void * data,
|
|
mailstream_low_driver * driver);
|
|
</PRE
|
|
><P
|
|
> mailstream_low_new() creates a low-level mailstream with the
|
|
given internal structure (data) and using the given set of
|
|
functions (driver).
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
ssize_t mailstream_low_write(mailstream_low * s, void * buf, size_t count);
|
|
|
|
ssize_t mailstream_low_read(mailstream_low * s, void * buf, size_t count);
|
|
|
|
int mailstream_low_close(mailstream_low * s);
|
|
|
|
int mailstream_low_get_fd(mailstream_low * s);
|
|
|
|
void mailstream_low_free(mailstream_low * s);
|
|
</PRE
|
|
><P
|
|
> Each of these calls will call the corresponding function defined
|
|
in the driver.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN312"
|
|
>strings</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
struct _MMAPString
|
|
{
|
|
char * str;
|
|
size_t len;
|
|
size_t allocated_len;
|
|
int fd;
|
|
size_t mmapped_size;
|
|
};
|
|
|
|
typedef struct _MMAPString MMAPString;
|
|
</PRE
|
|
><P
|
|
> MMAPString is a string which size that can increase automatically.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MMAP-STRING-NEW"
|
|
>constructor and destructor</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>MMAPString * mmap_string_new(const char * init);
|
|
|
|
MMAPString * mmap_string_new_len(const char * init, size_t len);
|
|
|
|
MMAPString * mmap_string_sized_new(size_t dfl_size);
|
|
|
|
void mmap_string_free(MMAPString * string);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_new()</B
|
|
> allocates a new
|
|
string. init is the intial value of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_new_len()</B
|
|
> allocates a new
|
|
string. init is the intial value of the
|
|
string, len is the length of the initial string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_sized_new()</B
|
|
> allocates a new
|
|
string. dfl_size is the initial allocation of
|
|
the string. <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_free()</B
|
|
> release the memory used
|
|
by the string.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MMAP-STRING-ASSIGN"
|
|
>string value modification</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>MMAPString * mmap_string_assign(MMAPString * string, const char * rval);
|
|
|
|
MMAPString * mmap_string_truncate(MMAPString *string, size_t len);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_assign()</B
|
|
> sets a new value for
|
|
the given string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_truncate()</B
|
|
> sets a length for
|
|
the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>MMAPString * mmap_string_set_size (MMAPString * string, size_t len);
|
|
</PRE
|
|
><P
|
|
> sets the allocation of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MMAP-STRING-APPEND"
|
|
>insertion in string, deletion in string</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>MMAPString * mmap_string_insert_len(MMAPString * string, size_t pos,
|
|
const char * val, size_t len);
|
|
|
|
MMAPString * mmap_string_append(MMAPString * string, const char * val);
|
|
|
|
MMAPString * mmap_string_append_len(MMAPString * string,
|
|
const char * val, size_t len);
|
|
|
|
MMAPString * mmap_string_append_c(MMAPString * string, char c);
|
|
|
|
MMAPString * mmap_string_prepend(MMAPString * string, const char * val);
|
|
|
|
MMAPString * mmap_string_prepend_c(MMAPString * string, char c);
|
|
|
|
MMAPString * mmap_string_prepend_len(MMAPString * string, const char * val,
|
|
size_t len);
|
|
|
|
MMAPString * mmap_string_insert(MMAPString * string, size_t pos,
|
|
const char * val);
|
|
|
|
MMAPString * mmap_string_insert_c(MMAPString *string, size_t pos,
|
|
char c);
|
|
|
|
MMAPString * mmap_string_erase(MMAPString * string, size_t pos,
|
|
size_t len);
|
|
</PRE
|
|
><P
|
|
> For complexity here, n is the size of the given MMAPString,
|
|
and len is the size of the string to insert.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_insert_len()</B
|
|
> inserts the given
|
|
string value of given length in the string at the given
|
|
position. <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(n + len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_append()</B
|
|
> appends the given
|
|
string value at the end of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_append_len()</B
|
|
> appends the
|
|
given string value of given length at the end of the
|
|
string. <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_append_c()</B
|
|
> appends the given
|
|
character at the end of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_prepend()</B
|
|
> insert the given
|
|
string value at the beginning of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(n + len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_prepend_c()</B
|
|
> insert the given
|
|
character at the beginning of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_prepend_len()</B
|
|
> insert the given
|
|
string value of given length at the beginning of the string.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(n + len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_insert()</B
|
|
> inserts the given
|
|
string value in the string at the given position.
|
|
NULL will be returned on error.
|
|
Complexity is O(n + len).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_insert_c()</B
|
|
> inserts the given
|
|
character in the string at the given position.
|
|
NULL will be returned on error.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_erase()</B
|
|
> removes the given
|
|
count of characters (len) at the given position of the
|
|
string. <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> will be returned on error.
|
|
Complexity is O(n).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MMAP-STRING-REF"
|
|
>referencing string</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mmap_string_ref(MMAPString * string);
|
|
|
|
int mmap_string_unref(char * str);
|
|
</PRE
|
|
><P
|
|
> MMAPString provides a mechanism that let you use MMAPString
|
|
like normal strings. You have first to use
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_ref()</B
|
|
>, so that you notify
|
|
that the string will be used as a normal string, then, you
|
|
use <B
|
|
CLASS="COMMAND"
|
|
>mmapstr->str</B
|
|
> to refer to the
|
|
string. When you have finished and you want to free a string
|
|
corresponding to a <B
|
|
CLASS="COMMAND"
|
|
>MMAPString</B
|
|
>, you will
|
|
use <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mmap_string_ref()</B
|
|
> references the string
|
|
so that the array of characters can be used as a normal
|
|
string then released with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref()</B
|
|
>.
|
|
The array of characters will be obtained with string->str.
|
|
returns -1 on error, 0 on success.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><HR><H1
|
|
><A
|
|
NAME="IMF"
|
|
></A
|
|
>Chapter 3. Internet Message Format</H1
|
|
><P
|
|
> libEtPan! implements Internet Message parser. Currently, format
|
|
is RFC 2822.
|
|
This module also allows to generate messages.
|
|
</P
|
|
><DIV
|
|
CLASS="WARNING"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="WARNING"
|
|
BORDER="1"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
ALIGN="CENTER"
|
|
><B
|
|
>Warning</B
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
><P
|
|
> All allocation functions will take as argument allocated data
|
|
and will store these data in the structure they will allocate.
|
|
Data should be persistant during all the use of the structure
|
|
and will be freed by the free function of the structure
|
|
</P
|
|
><P
|
|
> allocation functions will return <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> on failure
|
|
|
|
functions returning integer will be returning one of the
|
|
following error code:
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_PARSE</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_MEMORY</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_INVAL</B
|
|
>,
|
|
or <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_FILE</B
|
|
>.
|
|
</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN397"
|
|
>Quick start</A
|
|
></H2
|
|
><P
|
|
> You will need this module when you want to parse headers
|
|
of messages or when you want to build message headers
|
|
conformant to standards.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN400"
|
|
>Parse message headers</A
|
|
></H3
|
|
><P
|
|
> You will use one of the four following functions, depending
|
|
on your needs :
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_envelope_and_optional_fields_parse</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-ENVELOPE-AND-OPTIONAL-FIELDS-PARSE"
|
|
>the Section called <I
|
|
>mailimf_envelope_and_optional_fields_parse</I
|
|
></A
|
|
>),
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_envelope_fields_parse</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-ENVELOPE-FIELDS-PARSE"
|
|
>the Section called <I
|
|
>mailimf_envelope_fields_parse</I
|
|
></A
|
|
>),
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_optional_fields_parse</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-OPTIONAL-FIELDS-PARSE"
|
|
>the Section called <I
|
|
>mailimf_optional_fields_parse</I
|
|
></A
|
|
>),
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_parse</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-FIELDS-PARSE"
|
|
>the Section called <I
|
|
>mailimf_fields_parse</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN420"
|
|
>Render the message headers</A
|
|
></H3
|
|
><P
|
|
> Build your message headers, then use
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_write</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-FIELDS-WRITE"
|
|
>the Section called <I
|
|
>Header fields</I
|
|
></A
|
|
>)
|
|
to render the headers.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN425"
|
|
>Data types</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MAILBOX"
|
|
>mailimf_mailbox - mailbox</A
|
|
></H3
|
|
><P
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_mailbox {
|
|
char * mb_display_name; /* can be NULL */
|
|
char * mb_addr_spec; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_mailbox *
|
|
mailimf_mailbox_new(char * mb_display_name, char * mb_addr_spec);
|
|
|
|
void mailimf_mailbox_free(struct mailimf_mailbox * mailbox);
|
|
</P
|
|
><P
|
|
> This is an email mailbox with a display name.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN431"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-1. example of mailbox</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>DINH Viet Hoa <hoa@users.sourceforge.net>
|
|
</PRE
|
|
></DIV
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_new</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Strings given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_free</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN438"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-2. mailbox creation and display</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_mailbox * mb;
|
|
char * display_name;
|
|
char * address;
|
|
|
|
display_name = strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?=");
|
|
address = strdup("dinh.viet.hoa@free.fr");
|
|
mb = mailimf_mailbox_new(str, address);
|
|
/* do the things */
|
|
mailimf_mailbox_free(mb);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display mailbox information */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_mailbox(struct mailimf_mailbox * mb)
|
|
{
|
|
if (mb->mb_display_name != NULL)
|
|
printf("display name: %s\n", mb->mb_display_name);
|
|
printf("address specifier : %s\n", mb->mb_addr_spec);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ADDRESS"
|
|
>mailimf_address - address</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_address {
|
|
int ad_type;
|
|
union {
|
|
struct mailimf_mailbox * ad_mailbox; /* can be NULL */
|
|
struct mailimf_group * ad_group; /* can be NULL */
|
|
} ad_data;
|
|
};
|
|
|
|
struct mailimf_address *
|
|
mailimf_address_new(int ad_type, struct mailimf_mailbox * ad_mailbox,
|
|
struct mailimf_group * ad_group);
|
|
|
|
void mailimf_address_free(struct mailimf_address * address);
|
|
</PRE
|
|
><P
|
|
> This is a mailbox or a group of mailbox.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ad_type</B
|
|
> can be MAILIMF_ADDRESS_MAILBOX or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ADDRESS_GROUP</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ad_data.ad_mailbox</B
|
|
> is a mailbox if
|
|
<B
|
|
CLASS="COMMAND"
|
|
>ad_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ADDRESS_MAILBOX</B
|
|
>
|
|
see <A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>the Section called <I
|
|
>mailimf_mailbox - mailbox</I
|
|
></A
|
|
>)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ad_data.group</B
|
|
> is a group if type is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ADDRESS_GROUP</B
|
|
>.
|
|
see <A
|
|
HREF="#MAILIMF-GROUP"
|
|
>the Section called <I
|
|
>mailimf_group - named group of mailboxes</I
|
|
></A
|
|
>)
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_free</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN465"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-3. address creation and display</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>/* creates an address of type mailbox */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_address * a_mb;
|
|
struct mailimf_mailbox * mb;
|
|
char * display_name;
|
|
char * address;
|
|
|
|
display_name = strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?=");
|
|
address = strdup("dinh.viet.hoa@free.fr");
|
|
mb = mailimf_mailbox_new(str, address);
|
|
|
|
a_mb = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
/* do the things */
|
|
mailimf_address_free(a_mb);
|
|
}
|
|
|
|
/* creates an address of type group */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_address * a_g;
|
|
struct mailimf_group * g;
|
|
char * display_name;
|
|
|
|
display_name = strdup("undisclosed-recipient");
|
|
g = mailimf_group_new(display_name, NULL);
|
|
|
|
a_g = mailimf_address_new(MAILIMF_ADDRESS_GROUP, NULL, g);
|
|
/* do the things */
|
|
mailimf_address_free(a_g);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the content of an address */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_address(struct mailimf_address * a)
|
|
{
|
|
clistiter * cur;
|
|
|
|
switch (a->ad_type) {
|
|
case MAILIMF_ADDRESS_GROUP:
|
|
display_mailimf_group(a->ad_data.ad_group);
|
|
break;
|
|
|
|
case MAILIMF_ADDRESS_MAILBOX:
|
|
display_mailimf_mailbox(a->ad_data.ad_mailbox);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MAILBOX-LIST"
|
|
>mailimf_mailbox_list - list of mailboxes</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_mailbox_list {
|
|
clist * mb_list; /* list of (struct mailimf_mailbox *), != NULL */
|
|
};
|
|
|
|
struct mailimf_mailbox_list *
|
|
mailimf_mailbox_list_new(clist * mb_list);
|
|
|
|
void mailimf_mailbox_list_free(struct mailimf_mailbox_list * mb_list);
|
|
</PRE
|
|
><P
|
|
> This is a list of mailboxes.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mb_list</B
|
|
> is a list of mailboxes. This is a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>clist</B
|
|
> which elements are of type
|
|
mailimf_mailbox (see <A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>the Section called <I
|
|
>mailimf_mailbox - mailbox</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_free()</B
|
|
> frees memory used by the
|
|
structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN480"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-4. Creation and display of mailimf_mailbox_list</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>/* creates a list of mailboxes with two mailboxes */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_group * g;
|
|
char * display_name;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
clist * list;
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
list = clist_append(mb);
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
list = clist_append(mb);
|
|
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
/* do the things */
|
|
mailimf_mailbox_list_free(mb_list);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display a list of mailboxes */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_mailbox_list(struct mailimf_mailbox_list * mb_list)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(mb_list->mb_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailimf_mailbox * mb;
|
|
|
|
mb = clist_content(cur);
|
|
|
|
display_mailbox(mb);
|
|
printf("\n");
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ADDRESS-LIST"
|
|
>mailimf_address_list - list of addresses</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_address_list {
|
|
clist * ad_list; /* list of (struct mailimf_address *), != NULL */
|
|
};
|
|
|
|
struct mailimf_address_list *
|
|
mailimf_address_list_new(clist * ad_list);
|
|
|
|
void mailimf_address_list_free(struct mailimf_address_list * addr_list);
|
|
</PRE
|
|
><P
|
|
> This is a list of addresses.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ad_list</B
|
|
> is a list of addresses. This is a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>clist</B
|
|
> which elements are
|
|
of type mailimf_address (see <A
|
|
HREF="#MAILIMF-ADDRESS"
|
|
>the Section called <I
|
|
>mailimf_address - address</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_new()</B
|
|
> creates and
|
|
initializes a data structure with
|
|
a value. Structures given as argument are referenced by the
|
|
created object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_free()</B
|
|
> frees memory
|
|
used by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN495"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-5. creation and display of list of addresses</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>/* creates a list of addresses with two addresses */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_address_list * addr_list;
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
list = clist_append(addr);
|
|
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
list = clist_append(addr);
|
|
|
|
addr_list = mailimf_address_list_new(list);
|
|
/* do the things */
|
|
mailimf_address_list_free(mb_list);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display a list of addresses */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_address_list(struct mailimf_address_list * addr_list)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(addr_list->ad_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailimf_address * addr;
|
|
|
|
addr = clist_content(cur);
|
|
|
|
display_address(addr);
|
|
printf("\n");
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-GROUP"
|
|
>mailimf_group - named group of mailboxes</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_group {
|
|
char * grp_display_name; /* != NULL */
|
|
struct mailimf_mailbox_list * grp_mb_list; /* can be NULL */
|
|
};
|
|
|
|
struct mailimf_group *
|
|
mailimf_group_new(char * grp_display_name,
|
|
struct mailimf_mailbox_list * grp_mb_list);
|
|
|
|
void mailimf_group_free(struct mailimf_group * group);
|
|
</PRE
|
|
><P
|
|
> This is a list of mailboxes tagged with a name.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN502"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-6. example of group</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
> they play music: <steve@morse.foo>, <neal@morse.foo>,
|
|
<yngwie@malmsteen.bar>, <michael@romeo.bar>;
|
|
</PRE
|
|
></DIV
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>grp_display_name</B
|
|
> is the name that will be
|
|
displayed for this group,
|
|
for example '<B
|
|
CLASS="COMMAND"
|
|
>group_name</B
|
|
>' in
|
|
'<B
|
|
CLASS="COMMAND"
|
|
>group_name: address1@domain1,
|
|
address2@domain2;</B
|
|
>'.
|
|
This must be allocated with malloc().
|
|
<B
|
|
CLASS="COMMAND"
|
|
>grp_mb_list</B
|
|
> is a list of mailboxes
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX-LIST"
|
|
>the Section called <I
|
|
>mailimf_mailbox_list - list of mailboxes</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_group_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_group_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN515"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-7. creation and display of a group</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>/* creates an empty group */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_group * g;
|
|
char * display_name;
|
|
|
|
display_name = strdup("undisclosed-recipient");
|
|
g = mailimf_group_new(display_name, NULL);
|
|
/* do the things */
|
|
mailimf_group_free(g);
|
|
}
|
|
|
|
/* creates a group with two mailboxes */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_group * g;
|
|
char * display_name;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_mailbox * mb;
|
|
clist * list;
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
list = clist_append(mb);
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
list = clist_append(mb);
|
|
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
display_name = strdup("my_group");
|
|
g = mailimf_group_new(display_name, mb_list);
|
|
/* do the things */
|
|
mailimf_group_free(g);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display content of group */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_group(struct mailimf_group * group)
|
|
{
|
|
printf("name of the group: %s\n", a->group->display_name);
|
|
for(cur = clist_begin(a->group->mb_list->list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailimf_mailbox * mb;
|
|
|
|
mb = clist_content(cur);
|
|
display_mailbox(mb);
|
|
printf("\n");
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-DATE-TIME"
|
|
>mailimf_date_time - date of a message</A
|
|
></H3
|
|
><P
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_date_time {
|
|
int dt_day;
|
|
int dt_month;
|
|
int dt_year;
|
|
int dt_hour;
|
|
int dt_min;
|
|
int dt_sec;
|
|
int dt_zone;
|
|
};
|
|
|
|
struct mailimf_date_time *
|
|
mailimf_date_time_new(int dt_day, int dt_month, int dt_year,
|
|
int dt_hour, int dt_min, int dt_sec, int dt_zone);
|
|
|
|
void mailimf_date_time_free(struct mailimf_date_time * date_time);
|
|
</P
|
|
><P
|
|
> This is the date and time of a message.
|
|
For example :
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN522"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-8. example of date</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>Thu, 11 Dec 2003 00:15:02 +0100.
|
|
</PRE
|
|
></DIV
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_day</B
|
|
> is the day of month (1 to 31)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_month</B
|
|
> (1 to 12)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_year</B
|
|
> (4 digits)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_hour</B
|
|
> (0 to 23)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_min</B
|
|
> (0 to 59)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_sec</B
|
|
> (0 to 59)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_zone</B
|
|
> (this is the decimal value that
|
|
we can read, for example: for
|
|
'<B
|
|
CLASS="COMMAND"
|
|
>-0200</B
|
|
>', the value is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>-200</B
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_date_time_new()</B
|
|
> creates and
|
|
initializes a date structure with a value.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_date_time_free()</B
|
|
> frees memory used
|
|
by the structure.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN553"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-9. creation and display of date</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_date_time * d;
|
|
|
|
d = mailimf_date_time_new(9, 5, 2003, 3, 01, 40, -0200);
|
|
/* do the things */
|
|
mailimf_date_time_free(d);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the date */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_date(struct mailimf_date_time * d)
|
|
{
|
|
printf("%02i/%02i/%i %02i:%02i:%02i %+04i\n",
|
|
d->dt_day, d->dt_month, d->dt_year,
|
|
d->dt_hour, d->dt_min, d->dt_sec, d->dt_zone);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ORIG-DATE"
|
|
>mailimf_orig_date - parsed content of date header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_orig_date {
|
|
struct mailimf_date_time * dt_date_time; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_orig_date * mailimf_orig_date_new(struct mailimf_date_time *
|
|
dt_date_time);
|
|
|
|
void mailimf_orig_date_free(struct mailimf_orig_date * orig_date);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Date</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Date</B
|
|
>.
|
|
It encapsulates a mailimf_date_time
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_date_time</B
|
|
> is the parsed date
|
|
(see <A
|
|
HREF="#MAILIMF-DATE-TIME"
|
|
>the Section called <I
|
|
>mailimf_date_time - date of a message</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_orig_date_new()</B
|
|
> creates and
|
|
initializes a data structure with
|
|
a value. Structures given as argument are referenced by the
|
|
created object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_orig_date_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN569"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-10. creation and display of Date field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_date_time * d;
|
|
struct mailimf_orig_date * date;
|
|
|
|
d = mailimf_date_time_new(9, 5, 2003, 3, 01, 40, -0200);
|
|
date = mailimf_orig_date_new(d);
|
|
/* do the things */
|
|
mailimf_orig_date_free(date);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display date header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_orig_date(struct mailimf_orig_date * orig_date)
|
|
{
|
|
display_date_time(d->dt_date_time);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FROM"
|
|
>mailimf_from - parsed content of From header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_from {
|
|
struct mailimf_mailbox_list * frm_mb_list; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_from *
|
|
mailimf_from_new(struct mailimf_mailbox_list * frm_mb_list);
|
|
|
|
void mailimf_from_free(struct mailimf_from * from);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>From</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-From</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>frm_mb_list</B
|
|
> is the parsed mailbox list
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX-LIST"
|
|
>the Section called <I
|
|
>mailimf_mailbox_list - list of mailboxes</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_from_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_from_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN585"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-11. creation and display of a From header</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_from * from;
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
/* do the things */
|
|
mailimf_from_free(from);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display content of from header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_from(struct mailimf_from * from)
|
|
{
|
|
display_mailbox_list(from->frm_mb_list);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-SENDER"
|
|
>mailimf_sender - parsed content of Sender header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_sender {
|
|
struct mailimf_mailbox * snd_mb; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_sender * mailimf_sender_new(struct mailimf_mailbox * snd_mb);
|
|
|
|
void mailimf_sender_free(struct mailimf_sender * sender);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Sender</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Sender</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>snd_mb</B
|
|
> is the parsed mailbox
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>the Section called <I
|
|
>mailimf_mailbox - mailbox</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_sender_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_sender_free()</B
|
|
> This function frees
|
|
memory used by the structure and substructures
|
|
will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN601"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-12. creation and display of Sender field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_sender * sender;
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
|
|
sender = mailimf_sender_new(mb);
|
|
/* do the things */
|
|
mailimf_sender_free(sender);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_sender(struct mailimf_sender * sender)
|
|
{
|
|
display_mailbox(sender->snd_mb);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-REPLY-TO"
|
|
>mailimf_reply_to - parsed content of Reply-To header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_reply_to {
|
|
struct mailimf_address_list * rt_addr_list; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_reply_to *
|
|
mailimf_reply_to_new(struct mailimf_address_list * rt_addr_list);
|
|
|
|
void mailimf_reply_to_free(struct mailimf_reply_to * reply_to);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Reply-To</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>addr_list</B
|
|
> is the parsed address list
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>the Section called <I
|
|
>mailimf_address_list - list of addresses</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_reply_to_new()</B
|
|
> creates and
|
|
initializes a data structure with a value. Structures given
|
|
as argument are referenced by the created object and will be
|
|
freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_reply_to_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN616"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-13. creation and display of Reply-To field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_address_list * addr_list;
|
|
struct mailimf_reply_to * reply_to;
|
|
|
|
list = clist_new();
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
reply_to = mailimf_reply_to_new(addr_list);
|
|
/* do the things */
|
|
mailimf_reply_to_free(reply_to);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display Reply-To header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_reply_to(struct mailimf_reply_to * reply_to)
|
|
{
|
|
display_address_list(reply_to->addr_list);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-TO"
|
|
>mailimf_to - parsed content of To header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
> struct mailimf_to {
|
|
struct mailimf_address_list * to_addr_list; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_to * mailimf_to_new(struct mailimf_address_list * to_addr_list);
|
|
|
|
void mailimf_to_free(struct mailimf_to * to);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>To</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-To</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>to_addr_list</B
|
|
> is the parsed address list
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>the Section called <I
|
|
>mailimf_address_list - list of addresses</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_to_new()</B
|
|
> creates and initializes a
|
|
data structure with a value. Structures given as argument
|
|
are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_to_free()</B
|
|
> frees memory used by the
|
|
structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN632"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-14. creation and display of To field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_address_list * addr_list;
|
|
struct mailimf_to * to;
|
|
|
|
list = clist_new();
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
to = mailimf_to_new(addr_list);
|
|
/* do the things */
|
|
mailimf_to_free(to);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display To header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_to(struct mailimf_to * to)
|
|
{
|
|
display_address_list(to->to_addr_list);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-CC"
|
|
>mailimf_cc - parsed content of Cc</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_cc {
|
|
struct mailimf_address_list * cc_addr_list; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_cc *
|
|
mailimf_cc_new(struct mailimf_address_list * cc_addr_list);
|
|
|
|
void mailimf_cc_free(struct mailimf_cc * cc);</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Cc</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Cc</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>cc_addr_list</B
|
|
> is the parsed address list
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>the Section called <I
|
|
>mailimf_address_list - list of addresses</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_cc_new()</B
|
|
> creates and initializes a
|
|
data structure with a value. Structures given as argument
|
|
are referenced by the created object and will be freed if
|
|
the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_cc_free()</B
|
|
> This function frees
|
|
memory used by the structure and substructures will also be
|
|
released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN648"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-15. creation and display of Cc field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_address_list * addr_list;
|
|
struct mailimf_cc * cc;
|
|
|
|
list = clist_new();
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
cc = mailimf_cc_new(addr_list);
|
|
/* do the things */
|
|
mailimf_cc_free(cc);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display content of Cc field */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_cc(struct mailimf_cc * cc)
|
|
{
|
|
display_address_list(cc->cc_addr_list);
|
|
}
|
|
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-BCC"
|
|
>mailimf_bcc - parsed content of Bcc field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_bcc {
|
|
struct mailimf_address_list * bcc_addr_list; /* can be NULL */
|
|
};
|
|
|
|
struct mailimf_bcc *
|
|
mailimf_bcc_new(struct mailimf_address_list * bcc_addr_list);
|
|
|
|
void mailimf_bcc_free(struct mailimf_bcc * bcc);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Bcc</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Bcc</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>bcc_addr_list</B
|
|
> is the parsed address list
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>the Section called <I
|
|
>mailimf_address_list - list of addresses</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_bcc_new()</B
|
|
> creates and initializes a
|
|
data structure with a value. Structures given as argument
|
|
are referenced by the created object and will be freed if
|
|
the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_bcc_free()</B
|
|
> frees memory used by the
|
|
structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN664"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-16. creation and display of Bcc field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>/* create visible Bcc */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
clist * list;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_address_list * addr_list;
|
|
struct mailimf_bcc * bcc;
|
|
|
|
list = clist_new();
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
mb = mailimf_mailbox_new(strdup("Christophe GIAUME"),
|
|
strdup("christophe@giaume.com"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
bcc = mailimf_bcc_new(addr_list);
|
|
/* do the things */
|
|
mailimf_bcc_free(bcc);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* create unvisible Bcc */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_bcc * bcc;
|
|
|
|
bcc = mailimf_bcc_new(NULL);
|
|
/* do the things */
|
|
mailimf_bcc_free(bcc);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display content of Bcc field */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_bcc(struct mailimf_bcc * bcc)
|
|
{
|
|
if (bcc->addr_list == NULL) {
|
|
printf("hidden Bcc\n");
|
|
}
|
|
else {
|
|
display_address_list(bcc->bcc_addr_list);
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MESSAGE-ID"
|
|
>mailimf_message_id - parsed content of Message-ID header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_message_id {
|
|
char * mid_value; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_message_id * mailimf_message_id_new(char * mid_value);
|
|
|
|
void mailimf_message_id_free(struct mailimf_message_id * message_id);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Message-ID</B
|
|
>
|
|
or <B
|
|
CLASS="COMMAND"
|
|
>Resent-Message-ID</B
|
|
>. For example :
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN673"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-17. example of Message-ID</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>Message-ID: <200312100009.43592@c01n-c01n.plop.P4N>>
|
|
</PRE
|
|
></DIV
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mid_value</B
|
|
> is the message identifier.
|
|
It is not enclosed by angle bracket.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_message_id_new()</B
|
|
> This function
|
|
creates and initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> The given string is allocated with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>malloc()</B
|
|
> and is not enclosed by angle bracket.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_message_id_free()</B
|
|
> frees memory
|
|
used by the structure and substructures will also be
|
|
released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN684"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-18. creation and display of Message-ID field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_message_id * msg_id;
|
|
char * id;
|
|
|
|
id = strdup("1037197913.3dd26259752fa@imp.free.fr");
|
|
msg_id = mailimf_message_id_new(id);
|
|
/* do the things */
|
|
mailimf_message_id_free(msg_id);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display message id */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_message_id(struct mailimf_message_id * msg_id)
|
|
{
|
|
printf("%s\n", msg_id->mid_value);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-IN-REPLY-TO"
|
|
>mailimf_in_reply_to - parsed content of In-Reply-To
|
|
field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_in_reply_to {
|
|
clist * mid_list; /* list of (char *), != NULL */
|
|
};
|
|
|
|
struct mailimf_in_reply_to * mailimf_in_reply_to_new(clist * mid_list);
|
|
|
|
void mailimf_in_reply_to_free(struct mailimf_in_reply_to * in_reply_to);
|
|
</PRE
|
|
><P
|
|
> content of a header <B
|
|
CLASS="COMMAND"
|
|
>In-Reply-To</B
|
|
>.
|
|
For example :
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>In-Reply-To: <etPan.3fd5fa29.4c3901c1.6b39@homer>
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mid_list</B
|
|
> is a <B
|
|
CLASS="COMMAND"
|
|
>clist</B
|
|
>
|
|
in which elements are message identifiers.
|
|
their types are <B
|
|
CLASS="COMMAND"
|
|
>(char *)</B
|
|
> and they are
|
|
allocated with <B
|
|
CLASS="COMMAND"
|
|
>malloc()</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_in_reply_to_new()</B
|
|
> creates and
|
|
initializes a data structure with a value. Structures given
|
|
as argument are referenced by the created object and will be
|
|
freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_in_reply_to_free()</B
|
|
> frees memory
|
|
used by the structure and substructures will also be
|
|
released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN702"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-19. creation and display of In-Reply-To field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_in_reply_to * in_reply_to;
|
|
clist * msg_id_list;
|
|
|
|
msg_id_list = clist_new();
|
|
clist_append(msg_id_list,
|
|
strdup("etPan.3ebbcc18.4014197f.bc1@homer.invalid"));
|
|
|
|
in_reply_to = mailimf_in_reply_to_new(msg_id_list);
|
|
/* do the things */
|
|
mailimf_in_reply_to_free(in_reply_to);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the content of mailimf_in_reply_to */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_in_reply_to(struct mailimf_in_reply_to * in_reply_to)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(in_reply_to->mid_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
char * str;
|
|
|
|
str = clist_content(cur);
|
|
|
|
printf("%s\n", str);
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-REFERENCES"
|
|
>mailimf_references - parsed content of References field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_references {
|
|
clist * mid_list; /* list of (char *) */
|
|
/* != NULL */
|
|
};
|
|
|
|
struct mailimf_references * mailimf_references_new(clist * mid_list);
|
|
|
|
void mailimf_references_free(struct mailimf_references * references);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>References</B
|
|
>.
|
|
For example :
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>In-Reply-To: <etPan.3fd5fa29.4c3901c1.6b39@homer>
|
|
<3FD5FA78.A1D98E7@oleane.net>
|
|
<etPan.3fd5fc69.2b349482.730e@homer>
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mid_list</B
|
|
> is a <B
|
|
CLASS="COMMAND"
|
|
>clist</B
|
|
>
|
|
in which elements are message identifiers.
|
|
their types are <B
|
|
CLASS="COMMAND"
|
|
>(char *)</B
|
|
> and they are
|
|
allocated with <B
|
|
CLASS="COMMAND"
|
|
>malloc()</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_references_new()</B
|
|
> creates and
|
|
initializes a data structure with a value. Structures given
|
|
as argument are referenced by the created object and will be
|
|
freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_references_free()</B
|
|
> frees memory
|
|
used by the structure and substructures will also be
|
|
released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN720"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-20. creation and display of References field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_references * ref;
|
|
clist * msg_id_list;
|
|
|
|
msg_id_list = clist_new();
|
|
clist_append(msg_id_list,
|
|
strdup("200304280144.23633.wim.delvaux@adaptiveplanet.com"));
|
|
clist_append(msg_id_list,
|
|
strdup("200304301153.19688.wim.delvaux@adaptiveplanet.com"));
|
|
clist_append(msg_id_list,
|
|
strdup("etPan.3eb29de4.5fc4d652.3f83@homer"));
|
|
|
|
ref = mailimf_references_new(msg_id_list);
|
|
/* do the things */
|
|
mailimf_in_reply_to_free(ref);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display references */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_references(struct mailimf_references * ref)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(ref->mid_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
char * msg_id;
|
|
|
|
msg_id = clist_content(cur);
|
|
|
|
printf("%s\n", msg_id);
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-SUBJECT"
|
|
>mailimf_subject - parsed content of Subject field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_subject {
|
|
char * sbj_value; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_subject * mailimf_subject_new(char * sbj_value);
|
|
|
|
void mailimf_subject_free(struct mailimf_subject * subject);</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Subject</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sbj_value</B
|
|
> is the value of the field.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_subject_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_subject_free</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN734"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-21. creation and display of Subject field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_subject * subject;
|
|
|
|
subject = mailimf_subject_new(strdup("example of subject"));
|
|
/* do the things */
|
|
mailimf_subject_free(subject);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display subject header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_subject(struct mailimf_subject * subject)
|
|
{
|
|
printf("%s\n", subject->value);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-COMMENTS"
|
|
>mailimf_comments - parsed content of Comments field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_comments {
|
|
char * cm_value; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_comments * mailimf_comments_new(char * cm_value);
|
|
|
|
void mailimf_comments_free(struct mailimf_comments * comments);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Comments</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>cm_value</B
|
|
> is the value of the field.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_comments_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_comments_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN748"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-22. creation and display of Comment field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_comments * comments;
|
|
|
|
comments = mailimf_comments_new(strdup("example of comment"));
|
|
/* do the things */
|
|
mailimf_comments_free(comments);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the content of a comments */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_comments(struct mailimf_comments * comments)
|
|
{
|
|
printf("%s\n", comments->cm_value);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-KEYWORDS"
|
|
>mailimf_keywords - parsed content of Keywords field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_keywords {
|
|
clist * kw_list; /* list of (char *), != NULL */
|
|
};
|
|
|
|
struct mailimf_keywords * mailimf_keywords_new(clist * kw_list);
|
|
|
|
void mailimf_keywords_free(struct mailimf_keywords * keywords);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header <B
|
|
CLASS="COMMAND"
|
|
>Keywords</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>kw_list</B
|
|
> is the list of keywords. This is
|
|
a list of <B
|
|
CLASS="COMMAND"
|
|
>(char *)</B
|
|
> allocated with malloc().
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_keywords_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_keywords_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN763"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-23. creation and display of Keywords field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_keywords * keywords;
|
|
clist * list;
|
|
|
|
list = clist_new();
|
|
clist_append(list, strdup("sauerkraut"));
|
|
clist_append(list, strdup("potatoes"));
|
|
clist_append(list, strdup("cooking"));
|
|
|
|
keywords = mailimf_keywords_new(list);
|
|
/* do the things */
|
|
mailimf_keywords_free(keywords);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the content of mailimf_in_reply_to */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_keywords(struct mailimf_keywords * kw)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(kw->kw_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
char * str;
|
|
|
|
str = clist_content(cur);
|
|
|
|
printf("%s\n", str);
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-RETURN"
|
|
>mailimf_return - parsed content of Return-Path field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_return {
|
|
struct mailimf_path * ret_path; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_return *
|
|
mailimf_return_new(struct mailimf_path * ret_path);
|
|
|
|
void mailimf_return_free(struct mailimf_return * return_path);
|
|
</PRE
|
|
><P
|
|
> This is the content of a header
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Return-Path</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ret_path</B
|
|
> is the parsed value of Return-Path
|
|
(see <A
|
|
HREF="#MAILIMF-PATH"
|
|
>the Section called <I
|
|
>mailimf_path - address in Return-Path field</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_return_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_return_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN778"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-24. creation and display of Return-Path field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_path * path;
|
|
struct mailimf_return * r;
|
|
|
|
path = mailimf_path_new(strdup("dinh.viet.hoa@free.fr"));
|
|
r = mailimf_return_new(path);
|
|
/* do the things */
|
|
mailimf_return_free(r);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display return path */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
void display_return(struct mailimf_return * r)
|
|
{
|
|
display_path(r->ret_path);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-PATH"
|
|
>mailimf_path - address in Return-Path field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_path {
|
|
char * pt_addr_spec; /* can be NULL */
|
|
};
|
|
|
|
struct mailimf_path * mailimf_path_new(char * pt_addr_spec);
|
|
|
|
void mailimf_path_free(struct mailimf_path * path);
|
|
</PRE
|
|
><P
|
|
> This is the encapsulation of address specifier for
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Return-Path</B
|
|
> content.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pt_addr_spec</B
|
|
> is a mailbox destination.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_path_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> The given string is allocated with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>malloc()</B
|
|
>. This is a address
|
|
specifier.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_path_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN794"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-25. Creation and display of return path</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_path * path;
|
|
|
|
path = mailimf_path_new(strdup("dinh.viet.hoa@free.fr"));
|
|
/* do the things */
|
|
mailimf_path_free(r);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display return path */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_path(struct mailimf_path * path)
|
|
{
|
|
printf("%s\n", path->pt_addr_spec);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-OPTIONAL-FIELD"
|
|
>mailimf_optional_field - non-standard header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_optional_field {
|
|
char * fld_name; /* != NULL */
|
|
char * fld_value; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_optional_field *
|
|
mailimf_optional_field_new(char * fld_name, char * fld_value);
|
|
|
|
void mailimf_optional_field_free(struct mailimf_optional_field * opt_field);
|
|
</PRE
|
|
><P
|
|
> This is a non-standard header or unparsed header.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_name</B
|
|
> is the name of the header
|
|
field.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_value</B
|
|
> is the value of the header
|
|
field.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_optional_field_new()</B
|
|
> This
|
|
function creates and initializes a data structure with a
|
|
value. Structures given as argument are referenced by the
|
|
created object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> field name and field value have to be allocated with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>malloc()</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_optional_field_free()</B
|
|
> This
|
|
function frees memory used by the structure and
|
|
substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN814"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-26. creation and display of non-standard fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_optional_field * opt;
|
|
|
|
opt = mailimf_optional_field_new(strdup("X-My-Field"), strdup("my value"));
|
|
/* do the things */
|
|
mailimf_optional_field_free(opt);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the optional field */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_optional_field(struct mailimf_optional_field * opt)
|
|
{
|
|
printf("%s: %s\n", opt->fld_name, opt->fld_value);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FIELD"
|
|
>mailimf_field - header field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILIMF_FIELD_NONE, /* on parse error */
|
|
MAILIMF_FIELD_RETURN_PATH, /* Return-Path */
|
|
MAILIMF_FIELD_RESENT_DATE, /* Resent-Date */
|
|
MAILIMF_FIELD_RESENT_FROM, /* Resent-From */
|
|
MAILIMF_FIELD_RESENT_SENDER, /* Resent-Sender */
|
|
MAILIMF_FIELD_RESENT_TO, /* Resent-To */
|
|
MAILIMF_FIELD_RESENT_CC, /* Resent-Cc */
|
|
MAILIMF_FIELD_RESENT_BCC, /* Resent-Bcc */
|
|
MAILIMF_FIELD_RESENT_MSG_ID, /* Resent-Message-ID */
|
|
MAILIMF_FIELD_ORIG_DATE, /* Date */
|
|
MAILIMF_FIELD_FROM, /* From */
|
|
MAILIMF_FIELD_SENDER, /* Sender */
|
|
MAILIMF_FIELD_REPLY_TO, /* Reply-To */
|
|
MAILIMF_FIELD_TO, /* To */
|
|
MAILIMF_FIELD_CC, /* Cc */
|
|
MAILIMF_FIELD_BCC, /* Bcc */
|
|
MAILIMF_FIELD_MESSAGE_ID, /* Message-ID */
|
|
MAILIMF_FIELD_IN_REPLY_TO, /* In-Reply-To */
|
|
MAILIMF_FIELD_REFERENCES, /* References */
|
|
MAILIMF_FIELD_SUBJECT, /* Subject */
|
|
MAILIMF_FIELD_COMMENTS, /* Comments */
|
|
MAILIMF_FIELD_KEYWORDS, /* Keywords */
|
|
MAILIMF_FIELD_OPTIONAL_FIELD, /* other field */
|
|
};
|
|
|
|
struct mailimf_field {
|
|
int fld_type;
|
|
union {
|
|
struct mailimf_return * fld_return_path; /* can be NULL */
|
|
struct mailimf_orig_date * fld_resent_date; /* can be NULL */
|
|
struct mailimf_from * fld_resent_from; /* can be NULL */
|
|
struct mailimf_sender * fld_resent_sender; /* can be NULL */
|
|
struct mailimf_to * fld_resent_to; /* can be NULL */
|
|
struct mailimf_cc * fld_resent_cc; /* can be NULL */
|
|
struct mailimf_bcc * fld_resent_bcc; /* can be NULL */
|
|
struct mailimf_message_id * fld_resent_msg_id; /* can be NULL */
|
|
struct mailimf_orig_date * fld_orig_date; /* can be NULL */
|
|
struct mailimf_from * fld_from; /* can be NULL */
|
|
struct mailimf_sender * fld_sender; /* can be NULL */
|
|
struct mailimf_reply_to * fld_reply_to; /* can be NULL */
|
|
struct mailimf_to * fld_to; /* can be NULL */
|
|
struct mailimf_cc * fld_cc; /* can be NULL */
|
|
struct mailimf_bcc * fld_bcc; /* can be NULL */
|
|
struct mailimf_message_id * fld_message_id; /* can be NULL */
|
|
struct mailimf_in_reply_to * fld_in_reply_to; /* can be NULL */
|
|
struct mailimf_references * fld_references; /* can be NULL */
|
|
struct mailimf_subject * fld_subject; /* can be NULL */
|
|
struct mailimf_comments * fld_comments; /* can be NULL */
|
|
struct mailimf_keywords * fld_keywords; /* can be NULL */
|
|
struct mailimf_optional_field * fld_optional_field; /* can be NULL */
|
|
} fld_data;
|
|
};
|
|
|
|
struct mailimf_field *
|
|
mailimf_field_new(int fld_type,
|
|
struct mailimf_return * fld_return_path,
|
|
struct mailimf_orig_date * fld_resent_date,
|
|
struct mailimf_from * fld_resent_from,
|
|
struct mailimf_sender * fld_resent_sender,
|
|
struct mailimf_to * fld_resent_to,
|
|
struct mailimf_cc * fld_resent_cc,
|
|
struct mailimf_bcc * fld_resent_bcc,
|
|
struct mailimf_message_id * fld_resent_msg_id,
|
|
struct mailimf_orig_date * fld_orig_date,
|
|
struct mailimf_from * fld_from,
|
|
struct mailimf_sender * fld_sender,
|
|
struct mailimf_reply_to * fld_reply_to,
|
|
struct mailimf_to * fld_to,
|
|
struct mailimf_cc * fld_cc,
|
|
struct mailimf_bcc * fld_bcc,
|
|
struct mailimf_message_id * fld_message_id,
|
|
struct mailimf_in_reply_to * fld_in_reply_to,
|
|
struct mailimf_references * fld_references,
|
|
struct mailimf_subject * fld_subject,
|
|
struct mailimf_comments * fld_comments,
|
|
struct mailimf_keywords * fld_keywords,
|
|
struct mailimf_optional_field * fld_optional_field);
|
|
|
|
void mailimf_field_free(struct mailimf_field * field);
|
|
</PRE
|
|
><P
|
|
> This is one header field of a message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>type</B
|
|
> is the type of the field. This define the
|
|
type of the field.
|
|
Only the corresponding field should be, then,
|
|
filled. The value of this field can be one of :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RETURN_PATH</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_DATE</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_FROM</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_SENDER</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_TO</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_CC</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_BCC</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_MSG_ID</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_ORIG_DATE</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_FROM</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_SENDER</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_REPLY_TO</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_TO</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_CC</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_BCC</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_MESSAGE_ID</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_IN_REPLY_TO</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_REFERENCES</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_SUBJECT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_COMMENTS</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_KEYWORDS</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_OPTIONAL_FIELD</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_return_path</B
|
|
> is the
|
|
parsed content of the Return-Path field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RETURN_PATH</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-RETURN"
|
|
>the Section called <I
|
|
>mailimf_return - parsed content of Return-Path field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_date</B
|
|
> is the
|
|
parsed content of the Resent-Date field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_DATE</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-ORIG-DATE"
|
|
>the Section called <I
|
|
>mailimf_orig_date - parsed content of date header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_from</B
|
|
> is the
|
|
parsed content of the Resent-From field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_FROM</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FROM"
|
|
>the Section called <I
|
|
>mailimf_from - parsed content of From header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_sender</B
|
|
> is the
|
|
parsed content of the Resent-Sender field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_SENDER</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-SENDER"
|
|
>the Section called <I
|
|
>mailimf_sender - parsed content of Sender header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_to</B
|
|
> is the parsed
|
|
content of the Resent-To field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_TO</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-TO"
|
|
>the Section called <I
|
|
>mailimf_to - parsed content of To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_cc</B
|
|
> is the parsed
|
|
content of the Resent-Cc field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_CC</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-CC"
|
|
>the Section called <I
|
|
>mailimf_cc - parsed content of Cc</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_bcc</B
|
|
> is the parsed
|
|
content of the Resent-Bcc field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_BCC</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-BCC"
|
|
>the Section called <I
|
|
>mailimf_bcc - parsed content of Bcc field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_resent_msg_id</B
|
|
> is the
|
|
parsed content of the Resent-Message-ID field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_RESENT_MSG_ID</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>the Section called <I
|
|
>mailimf_message_id - parsed content of Message-ID header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_orig_date</B
|
|
> is the parsed
|
|
content of the Date field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_ORIG_DATE</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-ORIG-DATE"
|
|
>the Section called <I
|
|
>mailimf_orig_date - parsed content of date header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_from</B
|
|
> is the parsed
|
|
content of the From field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_FROM</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FROM"
|
|
>the Section called <I
|
|
>mailimf_from - parsed content of From header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_sender</B
|
|
> is the parsed
|
|
content of the Sender field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_SENDER</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-SENDER"
|
|
>the Section called <I
|
|
>mailimf_sender - parsed content of Sender header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_reply_to</B
|
|
> is the parsed
|
|
content of the Reply-To field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_REPLY_TO</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_reply_to - parsed content of Reply-To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_to</B
|
|
> is the parsed content
|
|
of the To field if type is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_TO</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-TO"
|
|
>the Section called <I
|
|
>mailimf_to - parsed content of To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_cc</B
|
|
> is the parsed content
|
|
of the Cc field if type is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_CC</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-CC"
|
|
>the Section called <I
|
|
>mailimf_cc - parsed content of Cc</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_bcc</B
|
|
> is the parsed
|
|
content of the Bcc field if type is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_BCC</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-BCC"
|
|
>the Section called <I
|
|
>mailimf_bcc - parsed content of Bcc field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_message_id</B
|
|
> is the parsed
|
|
content of the Message-ID field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_MESSAGE_ID</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>the Section called <I
|
|
>mailimf_message_id - parsed content of Message-ID header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_in_reply_to</B
|
|
> is the
|
|
parsed content of the In-Reply-To field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_IN_REPLY_TO</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-IN-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_in_reply_to - parsed content of In-Reply-To
|
|
field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_references</B
|
|
> is the parsed
|
|
content of the References field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_REFERENCES</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-REFERENCES"
|
|
>the Section called <I
|
|
>mailimf_references - parsed content of References field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_subject</B
|
|
> is the content
|
|
of the Subject field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_SUBJECT</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-SUBJECT"
|
|
>the Section called <I
|
|
>mailimf_subject - parsed content of Subject field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_comments</B
|
|
> is the content of the
|
|
Comments field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_COMMENTS</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-COMMENTS"
|
|
>the Section called <I
|
|
>mailimf_comments - parsed content of Comments field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_keywords</B
|
|
> is the parsed
|
|
content of the Keywords field
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_KEYWORDS</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-KEYWORDS"
|
|
>the Section called <I
|
|
>mailimf_keywords - parsed content of Keywords field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_optional_field</B
|
|
> is an
|
|
other field and is not parsed
|
|
if type is <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_FIELD_OPTIONAL_FIELD</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-OPTIONAL-FIELD"
|
|
>the Section called <I
|
|
>mailimf_optional_field - non-standard header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_field_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_field_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN961"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-27. creation and display of field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_field * f;
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_from * from;
|
|
|
|
/* build header 'From' */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_FROM,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
/* do the things */
|
|
mailimf_field_free(f);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display content of the header */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_field(struct mailimf_field * field)
|
|
{
|
|
switch (field->type) {
|
|
case MAILIMF_FIELD_RETURN_PATH:
|
|
printf("Return-Path:\n");
|
|
display_return(field->fld_data.fld_return_path);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_DATE:
|
|
printf("Resent-Date:\n");
|
|
display_orig_date(field->fld_data.fld_orig_date);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_FROM:
|
|
printf("Resent-From:\n");
|
|
display_from(field->fld_data.fld_orig_date);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_SENDER:
|
|
printf("Resent-Sender:\n");
|
|
display_sender(field->fld_data.fld_resent_sender);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_TO:
|
|
printf("Resent-To:\n");
|
|
display_to(field->fld_data.fld_resent_to);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_CC:
|
|
printf("Resent-Cc:\n");
|
|
display_from(field->fld_data.fld_resent_cc);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_BCC:
|
|
printf("Resent-Bcc:\n");
|
|
display_from(field->fld_data.fld_resent_bcc);
|
|
break;
|
|
case MAILIMF_FIELD_RESENT_MSG_ID:
|
|
printf("Resent-Message-ID:\n");
|
|
display_message_id(field->fld_data.fld_resent_msg_id);
|
|
break;
|
|
case MAILIMF_FIELD_ORIG_DATE:
|
|
printf("Date:\n");
|
|
display_orig_date(field->fld_data.fld_orig_date);
|
|
break;
|
|
case MAILIMF_FIELD_FROM:
|
|
printf("From:\n");
|
|
display_from(field->fld_data.fld_from);
|
|
break;
|
|
case MAILIMF_FIELD_SENDER:
|
|
printf("Sender:\n");
|
|
display_sender(field->fld_data.fld_sender);
|
|
break;
|
|
case MAILIMF_FIELD_REPLY_TO:
|
|
printf("Reply-To:\n");
|
|
display_reply_to(field->fld_data.fld_reply_to);
|
|
break;
|
|
case MAILIMF_FIELD_TO:
|
|
printf("To:\n");
|
|
display_to(field->fld_data.fld_to);
|
|
break;
|
|
case MAILIMF_FIELD_CC:
|
|
printf("Cc:\n");
|
|
display_cc(field->fld_data.fld_cc);
|
|
break;
|
|
case MAILIMF_FIELD_BCC:
|
|
printf("Bcc:\n");
|
|
display_bcc(field->fld_data.fld_bcc);
|
|
break;
|
|
case MAILIMF_FIELD_MESSAGE_ID:
|
|
printf("Message-ID:\n");
|
|
display_message_id(field->fld_data.fld_message_id);
|
|
break;
|
|
case MAILIMF_FIELD_IN_REPLY_TO:
|
|
printf("In-Reply-To:\n");
|
|
display_in_reply_to(field->fld_data.fld_in_reply_to);
|
|
break;
|
|
case MAILIMF_FIELD_REFERENCES:
|
|
printf("References:\n");
|
|
display_references(field->fld_data.fld_references_to);
|
|
break;
|
|
case MAILIMF_FIELD_SUBJECT:
|
|
printf("Subject:\n");
|
|
display_subject(field->fld_data.fld_subject);
|
|
break;
|
|
case MAILIMF_FIELD_COMMENTS:
|
|
printf("Comments:\n");
|
|
display_comments(field->fld_data.fld_comments);
|
|
break;
|
|
case MAILIMF_FIELD_KEYWORDS:
|
|
printf("Keywords:\n");
|
|
display_keywords(field->fld_data.fld_keywords);
|
|
break;
|
|
case MAILIMF_FIELD_OPTIONAL_FIELD:
|
|
printf("[optional field]:\n");
|
|
display_optional_field(field->fld_data.fld_optional_field);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FIELDS"
|
|
>mailimf_fields - list of header fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_fields {
|
|
clist * fld_list; /* list of (struct mailimf_field *), != NULL */
|
|
};
|
|
|
|
struct mailimf_fields * mailimf_fields_new(clist * fld_list);
|
|
|
|
void mailimf_fields_free(struct mailimf_fields * fields);
|
|
</PRE
|
|
><P
|
|
> This is the list of header fields of a message.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_list</B
|
|
> is a list of header fields. This
|
|
is a <B
|
|
CLASS="COMMAND"
|
|
>clist</B
|
|
> which elements are
|
|
of type <B
|
|
CLASS="COMMAND"
|
|
>mailimf_field</B
|
|
> (see <A
|
|
HREF="#MAILIMF-FIELD"
|
|
>the Section called <I
|
|
>mailimf_field - header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN977"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-28. creation and display of header fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_field * f;
|
|
clist * list;
|
|
struct mailimf_from * from;
|
|
struct mailimf_to * to
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_address_list * addr_list;
|
|
clist * fields_list;
|
|
|
|
/* build headers */
|
|
|
|
fields_list = clist_new();
|
|
|
|
/* build header 'From' */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_FROM,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
/* build header To */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
to = mailimf_to_new(addr_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_TO,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, to, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
fields = mailimf_fields_new(fields_list);
|
|
/* do the things */
|
|
mailimf_fields_free(fields);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display list of headers */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_fields(struct mailimf_fields * fields)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(field->fld_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailimf_field * f;
|
|
|
|
f = clist_content(cur);
|
|
|
|
display_field(f);
|
|
printf("\n");
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-BODY"
|
|
>mailimf_body - message body without headers</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_body {
|
|
const char * bd_text; /* != NULL */
|
|
size_t bd_size;
|
|
};
|
|
|
|
struct mailimf_body * mailimf_body_new(const char * bd_text, size_t bd_size);
|
|
|
|
void mailimf_body_free(struct mailimf_body * body);
|
|
</PRE
|
|
><P
|
|
> This is the text content of a message (without headers).
|
|
</P
|
|
><P
|
|
> <P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>bd_text</B
|
|
> is the beginning of the
|
|
text part, it is a substring of an other string.
|
|
It is not necessarily zero terminated.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>bd_size</B
|
|
> is the size of the text part
|
|
</P
|
|
></LI
|
|
></UL
|
|
>
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_body_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Text given as argument will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_body_free()</B
|
|
> frees memory used by
|
|
the structure.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN997"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-29. creation and display of message body</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_body * b;
|
|
|
|
b = mailimf_body_new("this is the content of the message", 34);
|
|
/* do the things */
|
|
mailimf_body_free(b);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_body(struct mailimf_body * b)
|
|
{
|
|
char * text;
|
|
|
|
text = malloc(b->size + 1);
|
|
strncpy(text, b->bd_text, b->bd_size);
|
|
text[b->size] = 0;
|
|
|
|
puts(text);
|
|
printf("\n");
|
|
|
|
free(text);
|
|
|
|
return 0;
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MESSAGE"
|
|
>mailimf_message - parsed message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_message {
|
|
struct mailimf_fields * msg_fields; /* != NULL */
|
|
struct mailimf_body * msg_body; /* != NULL */
|
|
};
|
|
|
|
struct mailimf_message *
|
|
mailimf_message_new(struct mailimf_fields * msg_fields,
|
|
struct mailimf_body * msg_body);
|
|
|
|
void mailimf_message_free(struct mailimf_message * message);
|
|
</PRE
|
|
><P
|
|
> This is the message content (text and headers).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fields</B
|
|
> is the header fields of
|
|
the message
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_body</B
|
|
> is the text part of the message
|
|
(see <A
|
|
HREF="#MAILIMF-BODY"
|
|
>the Section called <I
|
|
>mailimf_body - message body without headers</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_message_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_message_free()</B
|
|
> frees memory used
|
|
by the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1017"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-30. creation and display of message</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_body * b;
|
|
struct mailimf_message * m;
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_fields * f;
|
|
clist * list;
|
|
struct mailimf_from * from;
|
|
struct mailimf_to * to
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_address_list * addr_list;
|
|
clist * fields_list;
|
|
|
|
/* build text content */
|
|
|
|
b = mailimf_body_new("this is the content of the message", 34);
|
|
|
|
/* build headers */
|
|
|
|
fields_list = clist_new();
|
|
|
|
/* build header 'From' */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_FROM,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
/* build header To */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
to = mailimf_to_new(addr_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_TO,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, to, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
fields = mailimf_fields_new(fields_list);
|
|
|
|
/* build message */
|
|
|
|
m = mailimf_message_new(fields, b);
|
|
/* do the things */
|
|
mailimf_message_free(m);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* display the message */
|
|
|
|
#include <libetpan/libetpan.h>
|
|
#include <stdio.h>
|
|
|
|
void display_message(struct mailimf_message * msg)
|
|
{
|
|
display_fields(msg->msg_fields);
|
|
printf("\n");
|
|
display_body(msg->msg_body);
|
|
printf("\n");
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-SINGLE-FIELDS"
|
|
>mailimf_single_fields - simplified fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_single_fields {
|
|
struct mailimf_orig_date * fld_orig_date; /* can be NULL */
|
|
struct mailimf_from * fld_from; /* can be NULL */
|
|
struct mailimf_sender * fld_sender; /* can be NULL */
|
|
struct mailimf_reply_to * fld_reply_to; /* can be NULL */
|
|
struct mailimf_to * fld_to; /* can be NULL */
|
|
struct mailimf_cc * fld_cc; /* can be NULL */
|
|
struct mailimf_bcc * fld_bcc; /* can be NULL */
|
|
struct mailimf_message_id * fld_message_id; /* can be NULL */
|
|
struct mailimf_in_reply_to * fld_in_reply_to; /* can be NULL */
|
|
struct mailimf_references * fld_references; /* can be NULL */
|
|
struct mailimf_subject * fld_subject; /* can be NULL */
|
|
struct mailimf_comments * fld_comments; /* can be NULL */
|
|
struct mailimf_keywords * fld_keywords; /* can be NULL */
|
|
};
|
|
|
|
struct mailimf_single_fields *
|
|
mailimf_single_fields_new(struct mailimf_fields * fields);
|
|
|
|
void mailimf_single_fields_free(struct mailimf_single_fields *
|
|
single_fields);
|
|
|
|
void mailimf_single_fields_init(struct mailimf_single_fields * single_fields,
|
|
struct mailimf_fields * fields);</PRE
|
|
><P
|
|
> Structure that contains some standard fields and allows access
|
|
to a given header without running through the list.
|
|
</P
|
|
><P
|
|
> mailimf_fields is the native structure that IMF module will use,
|
|
this module will provide an easier structure to use when
|
|
parsing fields.
|
|
mailimf_single_fields is an easier structure to get parsed fields,
|
|
rather than iteration over the list of fields
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_orig_date</B
|
|
> is the parsed "Date"
|
|
field
|
|
(see <A
|
|
HREF="#MAILIMF-ORIG-DATE"
|
|
>the Section called <I
|
|
>mailimf_orig_date - parsed content of date header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_from</B
|
|
> is the parsed "From" field
|
|
(see <A
|
|
HREF="#MAILIMF-FROM"
|
|
>the Section called <I
|
|
>mailimf_from - parsed content of From header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_sender</B
|
|
> is the parsed "Sender "field
|
|
(see <A
|
|
HREF="#MAILIMF-SENDER"
|
|
>the Section called <I
|
|
>mailimf_sender - parsed content of Sender header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>reply_to</B
|
|
> is the parsed "Reply-To" field
|
|
(see <A
|
|
HREF="#MAILIMF-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_reply_to - parsed content of Reply-To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_to</B
|
|
> is the parsed "To" field
|
|
(see <A
|
|
HREF="#MAILIMF-TO"
|
|
>the Section called <I
|
|
>mailimf_to - parsed content of To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_cc</B
|
|
> is the parsed "Cc" field
|
|
(see <A
|
|
HREF="#MAILIMF-CC"
|
|
>the Section called <I
|
|
>mailimf_cc - parsed content of Cc</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_bcc</B
|
|
> is the parsed "Bcc" field
|
|
(see <A
|
|
HREF="#MAILIMF-BCC"
|
|
>the Section called <I
|
|
>mailimf_bcc - parsed content of Bcc field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_message_id</B
|
|
> is the parsed
|
|
"Message-ID" field.
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>the Section called <I
|
|
>mailimf_message_id - parsed content of Message-ID header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_in_reply_to</B
|
|
> is the parsed
|
|
"In-Reply-To" field.
|
|
(see <A
|
|
HREF="#MAILIMF-IN-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_in_reply_to - parsed content of In-Reply-To
|
|
field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_references</B
|
|
> is the parsed
|
|
"References" field.
|
|
(see <A
|
|
HREF="#MAILIMF-REFERENCES"
|
|
>the Section called <I
|
|
>mailimf_references - parsed content of References field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_subject</B
|
|
> is the parsed "Subject" field
|
|
(see <A
|
|
HREF="#MAILIMF-SUBJECT"
|
|
>the Section called <I
|
|
>mailimf_subject - parsed content of Subject field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_comments</B
|
|
> is the parsed "Comments" field
|
|
(see <A
|
|
HREF="#MAILIMF-COMMENTS"
|
|
>the Section called <I
|
|
>mailimf_comments - parsed content of Comments field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_keywords</B
|
|
> is the parsed "Keywords" field
|
|
(see <A
|
|
HREF="#MAILIMF-KEYWORDS"
|
|
>the Section called <I
|
|
>mailimf_keywords - parsed content of Keywords field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_single_fields_new()</B
|
|
> creates and
|
|
initializes a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be freed if the
|
|
object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_single_fields_free()</B
|
|
> frees memory
|
|
used by the structure and
|
|
substructures will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be
|
|
released. They should be released by the application.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_single_fields_init()</B
|
|
> will
|
|
initialize fill the data structure, using
|
|
the given argument (<B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
>). The
|
|
interesting fields will be filled into
|
|
<B
|
|
CLASS="COMMAND"
|
|
>single_fields</B
|
|
>.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1088"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-31. using mailimf_single_fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_single_fields * single_fields;
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_field * f;
|
|
clist * list;
|
|
struct mailimf_from * from;
|
|
struct mailimf_to * to
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_address_list * addr_list;
|
|
clist * fields_list;
|
|
|
|
/* build headers */
|
|
|
|
fields_list = clist_new();
|
|
|
|
/* build header 'From' */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_FROM,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
/* build header To */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
to = mailimf_to_new(addr_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_TO,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, to, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
fields = mailimf_fields_new(fields_list);
|
|
|
|
/* create the single fields */
|
|
single_fields = mailimf_single_fields_new(fields);
|
|
/* do the things */
|
|
mailimf_single_fields_free(single_fields);
|
|
mailimf_fields_free(fields);
|
|
|
|
return 0;
|
|
}
|
|
</PRE
|
|
></DIV
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1091"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-32. using mailimf_single_fields without memory allocation</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_single_fields single_fields;
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_field * f;
|
|
clist * list;
|
|
struct mailimf_from * from;
|
|
struct mailimf_to * to
|
|
struct mailimf_mailbox * mb;
|
|
struct mailimf_address * addr;
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_address_list * addr_list;
|
|
clist * fields_list;
|
|
|
|
/* build headers */
|
|
|
|
fields_list = clist_new();
|
|
|
|
/* build header 'From' */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
clist_append(list, mb);
|
|
mb_list = mailimf_mailbox_list_new(list);
|
|
|
|
from = mailimf_from_new(mb_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_FROM,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
/* build header To */
|
|
|
|
list = clist_new();
|
|
mb = mailimf_mailbox_new(strdup("DINH =?iso-8859-1?Q?Vi=EAt_Ho=E0?="),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
addr = mailimf_address_new(MAILIMF_ADDRESS_MAILBOX, mb, NULL);
|
|
clist_append(list, addr);
|
|
addr_list = mailimf_address_list_new(list);
|
|
|
|
to = mailimf_to_new(addr_list);
|
|
|
|
f = mailimf_field_new(MAILIMF_FIELD_TO,
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, to, NULL, NULL, NULL, NULL, NULL,
|
|
NULL, NULL, NULL, NULL);
|
|
|
|
clist_append(fields_list, f);
|
|
|
|
fields = mailimf_fields_new(fields_list);
|
|
|
|
/* fill the single fields */
|
|
mailimf_fields_fields_init(&single_fields, fields);
|
|
/* do the things */
|
|
mailimf_fields_free(fields);
|
|
|
|
return 0;
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN1094"
|
|
>Parser functions</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ADDRESS-LIST-PARSE"
|
|
>mailimf_address_list_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int
|
|
mailimf_address_list_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_address_list ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_parse()</B
|
|
> parse a list
|
|
of addresses in RFC 2822 form.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing
|
|
the list of addresses.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> this is a pointer to the
|
|
start of the list of
|
|
addresses in the given string,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is modified to point
|
|
at the end of the parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS-LIST"
|
|
>the Section called <I
|
|
>mailimf_address_list - list of addresses</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1120"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-33. parsing a list of addresses</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_address_list * addr_list;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_address_list_parse(mem, stat_info.st_size,
|
|
&current_index, &addr_list);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_address_list(addr_list);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_address_list_free(addr_list);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ADDRESS-PARSE"
|
|
>mailimf_address_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailimf_address_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_address ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_parse()</B
|
|
> parse an address
|
|
in RFC 2822 form.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the
|
|
address.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse operation
|
|
is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS"
|
|
>the Section called <I
|
|
>mailimf_address - address</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1147"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-34. parsing an address</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_address * addr;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_address_parse(mem, stat_info.st_size,
|
|
&current_index, &addr);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_address(addr);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_address_free(addr);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-BODY-PARSE"
|
|
>mailimf_body_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_body_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_body ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_body_parse()</B
|
|
> parse text body of a
|
|
message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing
|
|
the message body part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> this is a pointer to the start
|
|
of the message text part in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-BODY"
|
|
>the Section called <I
|
|
>mailimf_body - message body without headers</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1174"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-35. parsing a message body</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_body * b;
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
size_t size;
|
|
|
|
size = stat_info.st_size;
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, size, &current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
r = mailimf_crlf_parse(mem, size, &current_index);
|
|
/* ignore parse error of crlf */
|
|
|
|
r = mailimf_body_parse(mem, size, &current_index, &b);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
|
|
display_body(b);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_body_free(b);
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ENVELOPE-AND-OPTIONAL-FIELDS-PARSE"
|
|
>mailimf_envelope_and_optional_fields_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailimf_envelope_and_optional_fields_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_fields ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_envelope_and_optional_fields_parse()</B
|
|
>
|
|
returns a list of most useful headers (parsed). The other
|
|
headers will be placed in the list in a non-parsed form.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the header.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the header in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end
|
|
of the parsed data
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1201"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-36. parsing commonly used fields and return other fields
|
|
in a non-parsed form</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_envelope_and_optional_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_fields(m);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ENVELOPE-FIELDS-PARSE"
|
|
>mailimf_envelope_fields_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_envelope_fields_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_fields ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_envelope_fields_parse()</B
|
|
> return a
|
|
list of most useful headers (parsed).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the header
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the header in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1228"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-37. parsing commonly used fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_envelope_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_fields(m);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-OPTIONAL-FIELDS-PARSE"
|
|
>mailimf_optional_fields_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailimf_optional_fields_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_fields ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_optional_fields_parse</B
|
|
> return a
|
|
list of non-parsed headers.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the header
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the header in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1255"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-38. parsing optional fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_optional_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_fields(m);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FIELDS-PARSE"
|
|
>mailimf_fields_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_fields_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_fields ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_parse()</B
|
|
> parse headers of a
|
|
message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the header
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the header in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1282"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-39. parsing header fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_fields(f);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-IGNORE-FIELD-PARSE"
|
|
>mailimf_ignore_field_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_ignore_field_parse(char * message, size_t length,
|
|
size_t * index);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_ignore_field_parse()</B
|
|
> skip the
|
|
next header.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the header
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given string
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the field to skip in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
> on success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_XXX</B
|
|
> on error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1304"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-40. skipping fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_ignore_field_parse(mem, stat_info.st_size,
|
|
&current_index);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MAILBOX-LIST-PARSE"
|
|
>mailimf_mailbox_list_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailimf_mailbox_list_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_mailbox_list ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_parse()</B
|
|
> parse a list
|
|
of mailboxes in RFC 2822 form.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the
|
|
list of mailboxes.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the list of
|
|
mailboxes in the given string,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is modified to point
|
|
at the end of the parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX-LIST"
|
|
>the Section called <I
|
|
>mailimf_mailbox_list - list of mailboxes</I
|
|
></A
|
|
>)
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on
|
|
error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1329"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-41. parsing a list of mailboxes</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_mailbox_list * mb_list;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_mailbox_list_parse(mem, stat_info.st_size,
|
|
&current_index, &mb_list);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mailbox_list(mb_list);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_mailbox_list_free(mb_list);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MAILBOX-PARSE"
|
|
>mailimf_mailbox_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_mailbox_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_mailbox ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_parse</B
|
|
> parse a mailbox in
|
|
RFC 2822 form.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing the
|
|
mailbox.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> this is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> index this is a pointer to the
|
|
start of the mailbox in the given string,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is modified to point
|
|
at the end of the parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
> the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>the Section called <I
|
|
>mailimf_mailbox - mailbox</I
|
|
></A
|
|
>)
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on
|
|
error.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1354"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-42. parsing a mailbox</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_mailbox_list * mb_list;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_mailbox_parse(mem, stat_info.st_size,
|
|
&current_index, &mb_list);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mailbox_list(mb_list);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_mailbox_free(mb_list);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MESSAGE-PARSE"
|
|
>mailimf_message_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_message_parse(char * message, size_t length,
|
|
size_t * index,
|
|
struct mailimf_message ** result);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_message_parse</B
|
|
> parse message
|
|
(headers and body).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> this is a string containing
|
|
the message content.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>param</B
|
|
> length this is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>param</B
|
|
> index this is a pointer to the
|
|
start of the message in
|
|
the given string, <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> is
|
|
modified to point at the end
|
|
of the parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>param</B
|
|
> result the result of the parse
|
|
operation is stored in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE"
|
|
>the Section called <I
|
|
>mailimf_message - parsed message</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1378"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-43. parsing a message</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_message * m;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_message_parse(mem, stat_info.st_size,
|
|
&current_index, &m);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_message(m);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailimf_message_free(m);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN1381"
|
|
>Creation functions</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-MAILBOX-LIST-ADD"
|
|
>mailimf_mailbox_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_mailbox_list *
|
|
mailimf_mailbox_list_new_empty();
|
|
|
|
int mailimf_mailbox_list_add(struct mailimf_mailbox_list * mailbox_list,
|
|
struct mailimf_mailbox * mb);
|
|
|
|
int mailimf_mailbox_list_add_parse(struct mailimf_mailbox_list * mailbox_list,
|
|
char * mb_str);
|
|
|
|
int mailimf_mailbox_list_add_mb(struct mailimf_mailbox_list * mailbox_list,
|
|
char * display_name, char * address);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_new_empty()</B
|
|
> creates a
|
|
new empty list of mailboxes.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_add</B
|
|
> adds a mailbox
|
|
to the list of mailboxes.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_add_parse</B
|
|
> adds a
|
|
mailbox given in form of a string to the list of mailboxes.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_mailbox_list_add_mb</B
|
|
> adds a
|
|
mailbox given in form of a couple : display name, mailbox
|
|
address.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailbox_list</B
|
|
> is the list of mailboxes.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mb</B
|
|
> is a mailbox
|
|
(see <A
|
|
HREF="#MAILIMF-MAILBOX"
|
|
>the Section called <I
|
|
>mailimf_mailbox - mailbox</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mb_str</B
|
|
> is a mailbox given in the form
|
|
of a string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>display_name</B
|
|
> is the display name.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>address</B
|
|
> is the mailbox address.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1411"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-44. creating a list of mailboxes</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_mailbox_list * mb_list;
|
|
struct mailimf_mailbox * mb;
|
|
|
|
mb_list = mailimf_mailbox_list_new_empty();
|
|
|
|
mb = mailimf_mailbox_new(strdup("DINH Viet Hoa"),
|
|
strdup("dinh.viet.hoa@free.fr"));
|
|
mailimf_mailbox_list_add(mb_list, mb);
|
|
|
|
mailimf_mailbox_list_add_parse(mb_list, "foo bar <foo@bar.org>");
|
|
|
|
mailimf_mailbox_list_add_mb(mb_list, strdup("bar foo"), strdup("bar@foo.com"));
|
|
|
|
mailimf_mailbox_list_free(mb_list);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-ADDRESS-LIST-ADD"
|
|
>mailimf_address_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_address_list * mailimf_address_list_new_empty();
|
|
|
|
int mailimf_address_list_add(struct mailimf_address_list * address_list,
|
|
struct mailimf_address * addr);
|
|
|
|
int mailimf_address_list_add_parse(struct mailimf_address_list * address_list,
|
|
char * addr_str);
|
|
|
|
int mailimf_address_list_add_mb(struct mailimf_address_list * address_list,
|
|
char * display_name, char * address);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_new_empty()</B
|
|
> creates a
|
|
new empty list of addresses.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_add</B
|
|
> adds an address
|
|
to the list of addresses.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_add_parse</B
|
|
> adds an
|
|
address given in form of a string to the list of addresses.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_address_list_add_mb</B
|
|
> adds a
|
|
mailbox given in form of a couple : display name, mailbox
|
|
address.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>address_list</B
|
|
> is the list of mailboxes.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>addr</B
|
|
> is an address.
|
|
(see <A
|
|
HREF="#MAILIMF-ADDRESS"
|
|
>the Section called <I
|
|
>mailimf_address - address</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>addr_str</B
|
|
> is an address given in the form of a
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>display_name</B
|
|
> is the display name.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>address</B
|
|
> is the mailbox address.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FIELDS-ADD"
|
|
>mailimf_fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailimf_fields *
|
|
mailimf_fields_new_empty(void);
|
|
|
|
struct mailimf_field * mailimf_field_new_custom(char * name, char * value);
|
|
|
|
int mailimf_fields_add(struct mailimf_fields * fields,
|
|
struct mailimf_field * field);
|
|
|
|
int mailimf_fields_add_data(struct mailimf_fields * fields,
|
|
struct mailimf_date_time * date,
|
|
struct mailimf_mailbox_list * from,
|
|
struct mailimf_mailbox * sender,
|
|
struct mailimf_address_list * reply_to,
|
|
struct mailimf_address_list * to,
|
|
struct mailimf_address_list * cc,
|
|
struct mailimf_address_list * bcc,
|
|
char * msg_id,
|
|
clist * in_reply_to,
|
|
clist * references,
|
|
char * subject);
|
|
|
|
struct mailimf_fields *
|
|
mailimf_fields_new_with_data_all(struct mailimf_date_time * date,
|
|
struct mailimf_mailbox_list * from,
|
|
struct mailimf_mailbox * sender,
|
|
struct mailimf_address_list * reply_to,
|
|
struct mailimf_address_list * to,
|
|
struct mailimf_address_list * cc,
|
|
struct mailimf_address_list * bcc,
|
|
char * message_id,
|
|
clist * in_reply_to,
|
|
clist * references,
|
|
char * subject);
|
|
|
|
struct mailimf_fields *
|
|
mailimf_fields_new_with_data(struct mailimf_mailbox_list * from,
|
|
struct mailimf_mailbox * sender,
|
|
struct mailimf_address_list * reply_to,
|
|
struct mailimf_address_list * to,
|
|
struct mailimf_address_list * cc,
|
|
struct mailimf_address_list * bcc,
|
|
clist * in_reply_to,
|
|
clist * references,
|
|
char * subject);
|
|
|
|
char * mailimf_get_message_id(void);
|
|
|
|
struct mailimf_date_time * mailimf_get_current_date(void);
|
|
|
|
int
|
|
mailimf_resent_fields_add_data(struct mailimf_fields * fields,
|
|
struct mailimf_date_time * resent_date,
|
|
struct mailimf_mailbox_list * resent_from,
|
|
struct mailimf_mailbox * resent_sender,
|
|
struct mailimf_address_list * resent_to,
|
|
struct mailimf_address_list * resent_cc,
|
|
struct mailimf_address_list * resent_bcc,
|
|
char * resent_msg_id);
|
|
|
|
struct mailimf_fields *
|
|
mailimf_resent_fields_new_with_data_all(struct mailimf_date_time *
|
|
resent_date, struct mailimf_mailbox_list * resent_from,
|
|
struct mailimf_mailbox * resent_sender,
|
|
struct mailimf_address_list * resent_to,
|
|
struct mailimf_address_list * resent_cc,
|
|
struct mailimf_address_list * resent_bcc,
|
|
char * resent_msg_id);
|
|
|
|
struct mailimf_fields *
|
|
mailimf_resent_fields_new_with_data(struct mailimf_mailbox_list * from,
|
|
struct mailimf_mailbox * resent_sender,
|
|
struct mailimf_address_list * resent_to,
|
|
struct mailimf_address_list * resent_cc,
|
|
struct mailimf_address_list * resent_bcc);
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>from</B
|
|
> is the parsed content of the
|
|
From field
|
|
(see <A
|
|
HREF="#MAILIMF-FROM"
|
|
>the Section called <I
|
|
>mailimf_from - parsed content of From header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sender</B
|
|
> is the parsed content of the
|
|
Sender field
|
|
(see <A
|
|
HREF="#MAILIMF-SENDER"
|
|
>the Section called <I
|
|
>mailimf_sender - parsed content of Sender header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>reply_to</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Reply-To</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_reply_to - parsed content of Reply-To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>to</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>To</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-TO"
|
|
>the Section called <I
|
|
>mailimf_to - parsed content of To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>cc</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Cc</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-CC"
|
|
>the Section called <I
|
|
>mailimf_cc - parsed content of Cc</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>bcc</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Bcc</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-BCC"
|
|
>the Section called <I
|
|
>mailimf_bcc - parsed content of Bcc field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message_id</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>Message-ID</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>the Section called <I
|
|
>mailimf_message_id - parsed content of Message-ID header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>in_reply_to</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>In-Reply-To</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-IN-REPLY-TO"
|
|
>the Section called <I
|
|
>mailimf_in_reply_to - parsed content of In-Reply-To
|
|
field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>references</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>References</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-REFERENCES"
|
|
>the Section called <I
|
|
>mailimf_references - parsed content of References field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>subject</B
|
|
> is the content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Subject</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-SUBJECT"
|
|
>the Section called <I
|
|
>mailimf_subject - parsed content of Subject field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_date</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>Resent-Date</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-ORIG-DATE"
|
|
>the Section called <I
|
|
>mailimf_orig_date - parsed content of date header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_from</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>Resent-From</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-FROM"
|
|
>the Section called <I
|
|
>mailimf_from - parsed content of From header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_sender</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Sender</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-SENDER"
|
|
>the Section called <I
|
|
>mailimf_sender - parsed content of Sender header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_to</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>Resent-To</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-TO"
|
|
>the Section called <I
|
|
>mailimf_to - parsed content of To header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_cc</B
|
|
> is the parsed content of
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>Resent-Cc</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-CC"
|
|
>the Section called <I
|
|
>mailimf_cc - parsed content of Cc</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_bcc</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Bcc</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-BCC"
|
|
>the Section called <I
|
|
>mailimf_bcc - parsed content of Bcc field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>resent_msg_id</B
|
|
> is the parsed content of the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Resent-Message-ID</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILIMF-MESSAGE-ID"
|
|
>the Section called <I
|
|
>mailimf_message_id - parsed content of Message-ID header</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_new_empty()</B
|
|
> creates a new
|
|
empty set of headers.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_field_new_custom()</B
|
|
> creates a new
|
|
custom header.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_add()</B
|
|
> adds a header to the
|
|
set of headers.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_add_data()</B
|
|
> adds some headers
|
|
to the set of headers.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_new_with_data_all()</B
|
|
> creates
|
|
a set of headers with some headers (including Date and
|
|
Message-ID).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_new_with_data()</B
|
|
> creates a
|
|
set of headers with some headers (Date and Message-ID will
|
|
be generated).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_get_message_id()</B
|
|
> generates a
|
|
Message-ID. The result must be freed using
|
|
<B
|
|
CLASS="COMMAND"
|
|
>free()</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_get_current_date()</B
|
|
> generates a
|
|
Date. The result must be freed using
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailimf_date_time_free</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_resent_fields_add_data()</B
|
|
> adds some
|
|
resent headers to the set of headers.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_resent_fields_new_with_data_all()</B
|
|
>
|
|
creates a set of headers with some resent headers (including
|
|
Resent-Date and Resent-Message-ID).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_resent_fields_new_with_data()</B
|
|
>
|
|
creates a set of headers with some resent headers
|
|
(Resent-Date and Resent-Message-ID will be generated)
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1553"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-45. creation of header fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_field * field;
|
|
struct mailimf_date_time * date;
|
|
char * msg_id;
|
|
struct mailimf_mailbox_list * from;
|
|
struct mailimf_address_list * to;
|
|
|
|
fields = mailimf_fields_new_empty();
|
|
field = mailimf_field_new_custom(strdup("X-Mailer"), strdup("my-mailer"));
|
|
mailimf_fields_add(fields, field);
|
|
|
|
from = mailimf_mailbox_list_new_empty();
|
|
mailimf_mailbox_list_add_mb(from, strdup("DINH Viet Hoa"), strdup("dinh.viet.hoa@free.fr");
|
|
date = mailimf_get_current_date();
|
|
msg_id = mailimf_get_message_id();
|
|
to = mailimf_address_list_new_empty();
|
|
mailimf_address_list_add_mb(to, strdup("FOO Bar"), strdup("foo@bar.org");
|
|
|
|
mailimf_fields_add_data(fields, date, from, NULL, NULL, to, NULL, NULL,
|
|
msg_id, NULL, NULL, strdup("hello"));
|
|
|
|
/* do the things */
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_mailbox_list * from;
|
|
struct mailimf_address_list * to;
|
|
struct mailimf_date_time * date;
|
|
char * msg_id;
|
|
|
|
from = mailimf_mailbox_list_new_empty();
|
|
mailimf_mailbox_list_add_mb(from, strdup("DINH Viet Hoa"), strdup("dinh.viet.hoa@free.fr");
|
|
to = mailimf_address_list_new_empty();
|
|
mailimf_address_list_add_mb(to, strdup("FOO Bar"), strdup("foo@bar.org");
|
|
date = mailimf_get_current_date();
|
|
msg_id = mailimf_get_message_id();
|
|
|
|
fields = mailimf_fields_new_with_all_data(date, from, NULL, NULL, to, NULL, NULL,
|
|
msg_id, NULL, NULL, strdup("hello"));
|
|
|
|
/* do the things */
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
struct mailimf_mailbox_list * from;
|
|
struct mailimf_address_list * to;
|
|
|
|
from = mailimf_mailbox_list_new_empty();
|
|
mailimf_mailbox_list_add_mb(from, strdup("DINH Viet Hoa"), strdup("dinh.viet.hoa@free.fr");
|
|
to = mailimf_address_list_new_empty();
|
|
mailimf_address_list_add_mb(to, strdup("FOO Bar"), strdup("foo@bar.org");
|
|
|
|
fields = mailimf_fields_new_with_data(from, NULL, NULL, to, NULL, NULL,
|
|
NULL, NULL, strdup("hello"));
|
|
|
|
/* do the things */
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN1556"
|
|
>Rendering of messages</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILIMF-FIELDS-WRITE"
|
|
>Header fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailimf_fields_write(FILE * f, int * col,
|
|
struct mailimf_fields * fields);
|
|
|
|
int mailimf_envelope_fields_write(FILE * f, int * col,
|
|
struct mailimf_fields * fields);
|
|
|
|
int mailimf_field_write(FILE * f, int * col,
|
|
struct mailimf_field * field);
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>col</B
|
|
> current column is given for wrapping
|
|
purpose in <B
|
|
CLASS="COMMAND"
|
|
>(* col)</B
|
|
>,
|
|
the resulting columns will be returned..
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>f</B
|
|
> is the file descriptor. It can be
|
|
stdout for example.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
> is the header fields
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>field</B
|
|
> is a field
|
|
(see <A
|
|
HREF="#MAILIMF-FIELD"
|
|
>the Section called <I
|
|
>mailimf_field - header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_fields_write</B
|
|
> outputs the set of
|
|
header fields.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_envelope_fields_write</B
|
|
> outputs the
|
|
set of header fields except the optional fields.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_field_write</B
|
|
> outputs a header.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1583"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 3-46. rendering of fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
int col;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_imf_fields();
|
|
|
|
col = 0;
|
|
mailimf_fields_write(stdout, &col, fields);
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_fields * fields;
|
|
int col;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_imf_fields();
|
|
|
|
col = 0;
|
|
mailimf_envelope_fields_write(stdout, &col, fields);
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailimf_field * field;
|
|
int col;
|
|
|
|
field = mailimf_field_new_custom(strdup("X-Mailer"), strdup("my mailer"));
|
|
|
|
col = 0;
|
|
mailimf_field_write(stdout, &col, field);
|
|
|
|
mailimf_field_free(field);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><HR><H1
|
|
><A
|
|
NAME="AEN1586"
|
|
></A
|
|
>Chapter 4. MIME</H1
|
|
><P
|
|
> libEtPan! implements a MIME message parser (also known as
|
|
messages with attachments or
|
|
multipart messages). This also allows to generate MIME messages.
|
|
</P
|
|
><DIV
|
|
CLASS="WARNING"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="WARNING"
|
|
BORDER="1"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
ALIGN="CENTER"
|
|
><B
|
|
>Warning</B
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
><P
|
|
> All allocation functions will take as argument allocated data
|
|
and will store these data in the structure they will allocate.
|
|
Data should be persistant during all the use of the structure
|
|
and will be freed by the free function of the structure
|
|
</P
|
|
><P
|
|
> allocation functions will return <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> on failure
|
|
|
|
functions returning integer will be returning one of the
|
|
following error code:
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_NO_ERROR</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_PARSE</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_MEMORY</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_INVAL</B
|
|
>,
|
|
or <B
|
|
CLASS="COMMAND"
|
|
>MAILIMF_ERROR_FILE</B
|
|
>.
|
|
</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN1598"
|
|
>Quick start</A
|
|
></H2
|
|
><P
|
|
> You will need this module when you want to parse a MIME
|
|
message.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN1601"
|
|
>Parse MIME message</A
|
|
></H3
|
|
><P
|
|
> You will use the following function :
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_parse</B
|
|
>
|
|
(<A
|
|
HREF="#MAILIMF-ENVELOPE-AND-OPTIONAL-FIELDS-PARSE"
|
|
>the Section called <I
|
|
>mailimf_envelope_and_optional_fields_parse</I
|
|
> in Chapter 3</A
|
|
>)
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN1609"
|
|
>Render the MIME message</A
|
|
></H3
|
|
><P
|
|
> Build your MIME message, then use
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmime_write</B
|
|
>
|
|
(<A
|
|
HREF="#MAILMIME-WRITE"
|
|
>the Section called <I
|
|
>mailmime_write</I
|
|
></A
|
|
>)
|
|
to render a MIME message.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN1614"
|
|
>Data types</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-COMPOSITE-TYPE"
|
|
>mailmime_composite_type - Composite MIME type</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_COMPOSITE_TYPE_ERROR,
|
|
MAILMIME_COMPOSITE_TYPE_MESSAGE,
|
|
MAILMIME_COMPOSITE_TYPE_MULTIPART,
|
|
MAILMIME_COMPOSITE_TYPE_EXTENSION
|
|
};
|
|
|
|
struct mailmime_composite_type {
|
|
int ct_type;
|
|
char * ct_token;
|
|
};
|
|
|
|
struct mailmime_composite_type *
|
|
mailmime_composite_type_new(int ct_type, char * ct_token);
|
|
|
|
void mailmime_composite_type_free(struct mailmime_composite_type * ct);
|
|
</PRE
|
|
><P
|
|
> This is a MIME composite type such as <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>multipart</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ct_type</B
|
|
> can have one of the 3 following values :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_COMPOSITE_TYPE_MESSAGE</B
|
|
> when the
|
|
composite MIME type
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_COMPOSITE_TYPE_MULTIPART</B
|
|
> when
|
|
the composite MIME type
|
|
is <B
|
|
CLASS="COMMAND"
|
|
> multipart</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_COMPOSITE_TYPE_EXTENSION</B
|
|
> for
|
|
other and <B
|
|
CLASS="COMMAND"
|
|
>ct_token</B
|
|
> is set
|
|
in this case.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_COMPOSITE_TYPE_ERROR</B
|
|
> is used
|
|
internally on parse error.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_composite_type_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_composite_type_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1635"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-1. create and display MIME composite type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
struct mailmime_composite_type * ct;
|
|
|
|
ct = mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MULTIPART, NULL);
|
|
|
|
/* do your things ... */
|
|
|
|
mailmime_composite_type_free(ct);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
void display_composite_type()
|
|
{
|
|
switch (ct->type) {
|
|
case MAILMIME_COMPOSITE_TYPE_MESSAGE:
|
|
printf("composite type is message\n");
|
|
break;
|
|
case MAILMIME_COMPOSITE_TYPE_MULTIPART:
|
|
printf("composite type is multipart\n");
|
|
break;
|
|
case MAILMIME_COMPOSITE_TYPE_EXTENSION:
|
|
printf("composite type: %s\n", ct->ct_token);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-CONTENT"
|
|
>mailmime_content - MIME content type (Content-Type)</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_content {
|
|
struct mailmime_type * ct_type;
|
|
char * ct_subtype;
|
|
clist * ct_parameters; /* elements are (struct mailmime_parameter *) */
|
|
};
|
|
|
|
struct mailmime_content *
|
|
mailmime_content_new(struct mailmime_type * ct_type,
|
|
char * ct_subtype,
|
|
clist * ct_parameters);
|
|
|
|
void mailmime_content_free(struct mailmime_content * content);
|
|
</PRE
|
|
><P
|
|
> This is a MIME content type such as <B
|
|
CLASS="COMMAND"
|
|
>message/rfc822</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>text/plain</B
|
|
>.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ct_type</B
|
|
> is the main MIME type,
|
|
for example <B
|
|
CLASS="COMMAND"
|
|
>text</B
|
|
> in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>plain/text</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-TYPE"
|
|
>the Section called <I
|
|
>mailmime_type - MIME main type</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ct_subtype</B
|
|
> is the MIME subtype,
|
|
for example <B
|
|
CLASS="COMMAND"
|
|
>plain</B
|
|
> in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>plain/text</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>ct_parameters</B
|
|
> is the list of parameters for
|
|
the given MIME type. For example, for <B
|
|
CLASS="COMMAND"
|
|
>plain/text</B
|
|
>,
|
|
we can find <B
|
|
CLASS="COMMAND"
|
|
>charset=iso-8859-1</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>format=flowed</B
|
|
>. Each element of the list
|
|
if of type <B
|
|
CLASS="COMMAND"
|
|
>struct mailmime_parameter *</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-PARAMETER"
|
|
>the Section called <I
|
|
>mailmime_parameter - MIME type parameter</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1667"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-2. Creation and display of MIME content type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
struct mailmime_content * content;
|
|
struct mailmime_type * type;
|
|
struct mailmime_discrete_type * dt;
|
|
struct mailmime_parameter * param;
|
|
clist * param_list;
|
|
|
|
dt = mailmime_discrete_type_new(MAILMIME_DISCRETE_TYPE_TEXT, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_DISCRETE_TYPE, dt, NUL);
|
|
param_list = clist_new();
|
|
param = mailmime_parameter_new(strdup("charset"), strdup("iso-8859-1"));
|
|
clist_append(param_list, param);
|
|
|
|
content = mailmime_content_new(type, strdup("plain"), param_list);
|
|
|
|
/* do your things */
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
void display_mime_content(struct mailmime_content * content_type)
|
|
{
|
|
clistiter * cur;
|
|
|
|
printf("type:\n");
|
|
display_type(content_type->ct_type);
|
|
printf("\n");
|
|
printf("subtype: %s\n", content_type->ct_subtype);
|
|
printf("\n");
|
|
|
|
for(cur = clist_begin(content_type->ct_parameters) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailmime_parameter * param;
|
|
|
|
param = clist_content(cur);
|
|
display_mime_parameter(param);
|
|
printf("\n");
|
|
}
|
|
printf("\n");
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISCRETE-TYPE"
|
|
>mailmime_discrete_type - MIME discrete type</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_DISCRETE_TYPE_ERROR,
|
|
MAILMIME_DISCRETE_TYPE_TEXT,
|
|
MAILMIME_DISCRETE_TYPE_IMAGE,
|
|
MAILMIME_DISCRETE_TYPE_AUDIO,
|
|
MAILMIME_DISCRETE_TYPE_VIDEO,
|
|
MAILMIME_DISCRETE_TYPE_APPLICATION,
|
|
MAILMIME_DISCRETE_TYPE_EXTENSION
|
|
};
|
|
|
|
struct mailmime_discrete_type {
|
|
int dt_type;
|
|
char * dt_extension;
|
|
};
|
|
|
|
struct mailmime_discrete_type *
|
|
mailmime_discrete_type_new(int dt_type, char * dt_extension);
|
|
|
|
void mailmime_discrete_type_free(struct mailmime_discrete_type *
|
|
discrete_type);
|
|
</PRE
|
|
><P
|
|
> This is a MIME discrete type such as <B
|
|
CLASS="COMMAND"
|
|
>text</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>image</B
|
|
>. This is also known as single part. This kind
|
|
of part does not have any child.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_type</B
|
|
> is one of the given values :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_TEXT</B
|
|
> if part is text,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_IMAGE</B
|
|
> if part is an image,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_AUDIO</B
|
|
> if part is
|
|
audio data,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_VIDEO</B
|
|
> if part is video,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_APPLICATION</B
|
|
> if
|
|
part is application data or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_EXTENSION</B
|
|
> for other.
|
|
In the case of <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_EXTENSION</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>dt_extension</B
|
|
> is filled in.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISCRETE_TYPE_ERROR</B
|
|
> is used internally.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_discrete_type_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_discrete_type_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1691"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-3. Creation and display of MIME discrete type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
/* standard type */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_discrete_type * discrete_type;
|
|
|
|
discrete_type = mailmime_discrete_type_new(MAILMIME_DISCRETE_TYPE_TEXT,
|
|
NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_discrete_type_free(discrete_type);
|
|
}
|
|
|
|
/* extension */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_discrete_type * discrete_type;
|
|
|
|
discrete_type = mailmime_discrete_type_new(MAILMIME_DISCRETE_TYPE_EXTENSION,
|
|
strdup("my-type"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_discrete_type_free(discrete_type);
|
|
}
|
|
|
|
void display_mime_discrete_type(struct mailmime_discrete_type * discrete_type)
|
|
{
|
|
switch (discrete_type->dt_type) {
|
|
case MAILMIME_DISCRETE_TYPE_TEXT:
|
|
printf("text\n");
|
|
break;
|
|
case MAILMIME_DISCRETE_TYPE_IMAGE:
|
|
printf("image\n");
|
|
break;
|
|
case MAILMIME_DISCRETE_TYPE_AUDIO:
|
|
printf("audio\n");
|
|
break;
|
|
case MAILMIME_DISCRETE_TYPE_VIDEO:
|
|
printf("video\n");
|
|
break;
|
|
case MAILMIME_DISCRETE_TYPE_APPLICATION:
|
|
printf("application\n");
|
|
break;
|
|
case MAILMIME_DISCRETE_TYPE_EXTENSION:
|
|
printf("extension : %s\n", discrete_type->dt_extension);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELD"
|
|
>mailmime_field - MIME header field</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_FIELD_NONE,
|
|
MAILMIME_FIELD_TYPE,
|
|
MAILMIME_FIELD_TRANSFER_ENCODING,
|
|
MAILMIME_FIELD_ID,
|
|
MAILMIME_FIELD_DESCRIPTION,
|
|
MAILMIME_FIELD_VERSION,
|
|
MAILMIME_FIELD_DISPOSITION,
|
|
MAILMIME_FIELD_LANGUAGE,
|
|
};
|
|
|
|
struct mailmime_field {
|
|
int fld_type;
|
|
union {
|
|
struct mailmime_content * fld_content;
|
|
struct mailmime_mechanism * fld_encoding;
|
|
char * fld_id;
|
|
char * fld_description;
|
|
uint32_t fld_version;
|
|
struct mailmime_disposition * fld_disposition;
|
|
struct mailmime_language * fld_language;
|
|
} fld_data;
|
|
};
|
|
|
|
struct mailmime_field *
|
|
mailmime_field_new(int fld_type,
|
|
struct mailmime_content * fld_content,
|
|
struct mailmime_mechanism * fld_encoding,
|
|
char * fld_id,
|
|
char * fld_description,
|
|
uint32_t fld_version,
|
|
struct mailmime_disposition * fld_disposition,
|
|
struct mailmime_language * fld_language);
|
|
|
|
void mailmime_field_free(struct mailmime_field * field);
|
|
</PRE
|
|
><P
|
|
> This is a parsed MIME header field;
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_type</B
|
|
> is the type of MIME header field. The value can
|
|
be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_TYPE</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_TRANSFER_ENCODING</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-Transfer-Encoding</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_ID</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-ID</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_DESCRIPTION</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-Description</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_VERSION</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>MIME-Version</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_DISPOSITION</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_LANGUAGE</B
|
|
>
|
|
if field is <B
|
|
CLASS="COMMAND"
|
|
>Content-Language</B
|
|
>.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_FIELD_NONE</B
|
|
> is used internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_content</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_encoding</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Transfer-Encoding</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_id</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-ID</B
|
|
>. This is a string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_description</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Description</B
|
|
>. This is a string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_version</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MIME-Version</B
|
|
>. This is an integer built
|
|
using the following formula :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>fld_version = major * 2^16 + minor</B
|
|
>.
|
|
Currenly MIME-Version is always <B
|
|
CLASS="COMMAND"
|
|
>1.0</B
|
|
>, this means that
|
|
fld_version will always be <B
|
|
CLASS="COMMAND"
|
|
>2^16</B
|
|
> (in C language,
|
|
this is <B
|
|
CLASS="COMMAND"
|
|
>1 << 16</B
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_disposition</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION"
|
|
>the Section called <I
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_data.fld_language</B
|
|
> is set in case of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Language</B
|
|
>.
|
|
(see <A
|
|
HREF="#MAILMIME-LANGUAGE"
|
|
>the Section called <I
|
|
>mailmime_language - Language of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_field_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_field_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1757"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-4. Creation and display of MIME header field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_field * field;
|
|
struct mailmime_mechanism * encoding;
|
|
|
|
encoding = mailmime_mechanism_new(MAILMIME_MECHANISM_BASE64, NULL);
|
|
|
|
field = mailmime_field_new(MAILMIME_FIELD_TRANSFER_ENCODING,
|
|
NULL, encoding, NULL, NULL, 0, NULL, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_field_free(field);
|
|
}
|
|
|
|
void display_mime_field(struct mailmime_field * field)
|
|
{
|
|
switch (field->fld_type) {
|
|
case MAILMIME_FIELD_TYPE:
|
|
printf("content-type:");
|
|
display_mime_content(field->fld_data.fld_content);
|
|
break;
|
|
case MAILMIME_FIELD_TRANSFER_ENCODING:
|
|
printf("content-transfer-encoding:");
|
|
display_mime_mechanism(field->fld_data.fld_encoding);
|
|
break;
|
|
case MAILMIME_FIELD_ID:
|
|
printf("content-id: %s\n", field->fld_data.fld_id);
|
|
break;
|
|
case MAILMIME_FIELD_DESCRIPTION:
|
|
printf("content-description: %s\n", field->fld_data.fld_description);
|
|
break;
|
|
case MAILMIME_FIELD_VERSION:
|
|
printf("mime-version: %i.%i\n",
|
|
field->version>> 16, field->fld_data.fld_version & 0xFFFF);
|
|
break;
|
|
case MAILMIME_FIELD_DISPOSITION:
|
|
printf("content-disposition:");
|
|
display_mime_disposition(field->fld_data.fld_disposition);
|
|
break;
|
|
case MAILMIME_FIELD_LANGUAGE:
|
|
printf("content-language:");
|
|
display_mime_language(field->fld_data.fld_language);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-MECHANISM"
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_MECHANISM_ERROR,
|
|
MAILMIME_MECHANISM_7BIT,
|
|
MAILMIME_MECHANISM_8BIT,
|
|
MAILMIME_MECHANISM_BINARY,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE,
|
|
MAILMIME_MECHANISM_BASE64,
|
|
MAILMIME_MECHANISM_TOKEN
|
|
};
|
|
|
|
struct mailmime_mechanism {
|
|
int enc_type;
|
|
char * enc_token;
|
|
};
|
|
|
|
struct mailmime_mechanism * mailmime_mechanism_new(int enc_type, char * enc_token);
|
|
|
|
void mailmime_mechanism_free(struct mailmime_mechanism * mechanism);
|
|
</PRE
|
|
><P
|
|
> This is a MIME transfer encoding mechanism description.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>enc_type</B
|
|
> is an encoding type. The value of this field
|
|
can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_7BIT</B
|
|
>
|
|
if mechanism is <B
|
|
CLASS="COMMAND"
|
|
>7bit</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_8BIT</B
|
|
>
|
|
if mechanism is <B
|
|
CLASS="COMMAND"
|
|
>8bit</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BINARY</B
|
|
>
|
|
if mechanism is <B
|
|
CLASS="COMMAND"
|
|
>binary</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_QUOTED_PRINTABLE</B
|
|
>
|
|
if mechanism is <B
|
|
CLASS="COMMAND"
|
|
>quoted-printable</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BASE64</B
|
|
>
|
|
if mechanism is <B
|
|
CLASS="COMMAND"
|
|
>base64</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_TOKEN</B
|
|
> for other.
|
|
In case of <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_TOKEN</B
|
|
>,
|
|
field <B
|
|
CLASS="COMMAND"
|
|
>enc_token</B
|
|
> is filled in.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_ERROR</B
|
|
> is used internally.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_mechanism_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_mechanism_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1784"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-5. Creation and display of MIME transfer encoding mechanism</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_mechanism * encoding;
|
|
|
|
encoding = mailmime_mechanism_new(MAILMIME_MECHANISM_QUOTED_PRINTABLE, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_mechanism_free(encoding);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_mechanism * encoding;
|
|
|
|
encoding = mailmime_mechanism_new(MAILMIME_MECHANISM_TOKEN,
|
|
strdup("uuencoding"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_mechanism_free(encoding);
|
|
}
|
|
|
|
void display_mime_mechanism(struct mailmime_mechanism * encoding)
|
|
{
|
|
switch (encoding->enc_type) {
|
|
case MAILMIME_MECHANISM_7BIT:
|
|
printf("7bit\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_8BIT:
|
|
printf("8bit\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_BINARY:
|
|
printf("binary\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
|
|
printf("quoted-printable\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_BASE64:
|
|
printf("base64\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_TOKEN:
|
|
printf("extension : %s\n", encoding->enc_token);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS"
|
|
>mailmime_fields - header fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_fields {
|
|
clist * fld_list; /* list of (struct mailmime_field *) */
|
|
};
|
|
|
|
struct mailmime_fields * mailmime_fields_new(clist * fld_list);
|
|
|
|
void mailmime_fields_free(struct mailmime_fields * fields);
|
|
</PRE
|
|
><P
|
|
> This is the header fields of a MIME part.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_list</B
|
|
> is the list of the header fields.
|
|
Each element of the list is a <B
|
|
CLASS="COMMAND"
|
|
>mailmime_field</B
|
|
>
|
|
(See <A
|
|
HREF="#MAILMIME-FIELD"
|
|
>the Section called <I
|
|
>mailmime_field - MIME header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1799"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-6. Creation and display of MIME fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_field * field;
|
|
struct mailmime_fields * fields;
|
|
clist * list;
|
|
struct mailmime_mechanism * encoding;
|
|
struct mailmime_disposition * disposition;
|
|
|
|
list = clist_new();
|
|
|
|
encoding = mailmime_mechanism_new(MAILMIME_MECHANISM_BASE64, NULL);
|
|
field = mailmime_field_new(MAILMIME_FIELD_TRANSFER_ENCODING,
|
|
NULL, encoding, NULL, NULL, 0, NULL, NULL);
|
|
clist_append(list, field);
|
|
|
|
field = mailmime_field_new(MAILMIME_FIELD_VERSION,
|
|
NULL, NULL, NULL, NULL, 1 << 16, NULL, NULL);
|
|
clist_append(list, field);
|
|
|
|
/* look at the example in mailmime_disposition to see how to
|
|
build a mailmime_disposition */
|
|
disposition = build_mime_disposition();
|
|
field = mailmime_field_new(MAILMIME_FIELD_DISPOSITION,
|
|
NULL, NULL, NULL, NULL, 0, disposition, NULL);
|
|
clist_append(list, field);
|
|
|
|
fields = mailmime_fields_new(list);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_free(fields);
|
|
}
|
|
|
|
void display_mime_fields(struct mailmime_fields * fields)
|
|
{
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(fields->fld_list ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
struct mailmime_field * field;
|
|
|
|
field = clist_content(cur);
|
|
display_field(field);
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-PARAMETER"
|
|
>mailmime_parameter - MIME type parameter</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>struct mailmime_parameter {
|
|
char * pa_name;
|
|
char * pa_value;
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is the MIME type parameter in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
> MIME header
|
|
field. For example, this can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>charset="iso-8859-1"</B
|
|
>.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_name</B
|
|
> is the name of the parameter,
|
|
for example : <B
|
|
CLASS="COMMAND"
|
|
>charset</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_value</B
|
|
> is the value of the parameter,
|
|
for example : <B
|
|
CLASS="COMMAND"
|
|
>iso-8859-1</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_parameter_new()</B
|
|
> creates and initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_parameter_free()</B
|
|
> frees memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1821"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-7. Creation and display of MIME type parameter</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_parameter * param;
|
|
|
|
param = mailmime_parameter_new(strdup("charset"), strdup("iso-8859-1"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_parameter_free(param);
|
|
}
|
|
|
|
void display_mime_parameter(struct mailmime_parameter * param)
|
|
{
|
|
printf("%s = %s\n", param->pa_name, param->pa_value);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-TYPE"
|
|
>mailmime_type - MIME main type</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_TYPE_ERROR,
|
|
MAILMIME_TYPE_DISCRETE_TYPE,
|
|
MAILMIME_TYPE_COMPOSITE_TYPE
|
|
};
|
|
|
|
struct mailmime_type {
|
|
int tp_type;
|
|
union {
|
|
struct mailmime_discrete_type * tp_discrete_type;
|
|
struct mailmime_composite_type * tp_composite_type;
|
|
} tp_data;
|
|
};
|
|
|
|
struct mailmime_type *
|
|
mailmime_type_new(int tp_type,
|
|
struct mailmime_discrete_type * tp_discrete_type,
|
|
struct mailmime_composite_type * tp_composite_type);
|
|
|
|
void mailmime_type_free(struct mailmime_type * type);
|
|
</PRE
|
|
><P
|
|
> This is the MIME main type (no subtype, no parameter).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>tp_type</B
|
|
>. The value of this field
|
|
is either <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_TYPE_DISCRETE_TYPE</B
|
|
> for MIME discrete type,
|
|
or <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_TYPE_COMPOSITE_TYPE</B
|
|
> for MIME composite type.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_TYPE_ERROR</B
|
|
> is used internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>tp_data.tp_discrete_type</B
|
|
> is set when <B
|
|
CLASS="COMMAND"
|
|
>tp_type</B
|
|
>
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_TYPE_DISCRETE_TYPE</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-DISCRETE-TYPE"
|
|
>the Section called <I
|
|
>mailmime_discrete_type - MIME discrete type</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>tp_data.tp_composite_type</B
|
|
> is set when <B
|
|
CLASS="COMMAND"
|
|
>tp_type</B
|
|
>
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_TYPE_COMPOSITE_TYPE</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-COMPOSITE-TYPE"
|
|
>the Section called <I
|
|
>mailmime_composite_type - Composite MIME type</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_discrete_type_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_discrete_type_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1851"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-8. Creation and display of MIME main type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_type * type;
|
|
struct mailmime_discrete_type * discrete_type;
|
|
|
|
discrete_type =
|
|
mailmime_discrete_type_new(MAILMIME_DISCRETE_TYPE_TEXT, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_DISCRETE_TYPE, discrete_type, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_type_free(type);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_type * type;
|
|
struct mailmime_composite_type * composite_type;
|
|
|
|
composite_type =
|
|
mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MULTIPART, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_COMPOSITE_TYPE, NULL, composite_type);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_type_free(type);
|
|
}
|
|
|
|
void display_mime_type(struct mailmime_type * type)
|
|
{
|
|
printf("mime type:\n");
|
|
switch (type->tp_type) {
|
|
case MAILMIME_TYPE_DISCRETE_TYPE:
|
|
printf("discrete type:\n");
|
|
display_mime_discrete_type(type->tp_data.tp_discrete_type);
|
|
break;
|
|
case MAILMIME_TYPE_COMPOSITE_TYPE:
|
|
printf("composite type:\n");
|
|
display_mime_composite_type(type->tp_data.tp_composite_type);
|
|
break;
|
|
}
|
|
printf("\n");
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-LANGUAGE"
|
|
>mailmime_language - Language of MIME part</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_language {
|
|
clist * lg_list; /* atom (char *) */
|
|
};
|
|
|
|
struct mailmime_language * mailmime_language_new(clist * lg_list);
|
|
|
|
void mailmime_language_free(struct mailmime_language * lang);
|
|
</PRE
|
|
><P
|
|
> This is the language used in the MIME part.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>lg_list</B
|
|
> is the list of codes of languages used
|
|
in the MIME part. This is a list of strings.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_language_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_language_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1864"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-9. Creation and display of language of MIME part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_language * language;
|
|
clist * list;
|
|
|
|
list = clist_new();
|
|
|
|
clist_append(list, strdup("fr"));
|
|
clist_append(list, strdup("en"));
|
|
|
|
language = mailmime_language_new(list);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_language_free(language);
|
|
}
|
|
|
|
void display_mime_language(struct mailmime_language * language)
|
|
{
|
|
clistiter * cur;
|
|
|
|
printf("languages: ");
|
|
for(cur = clist_begin(language->lg_list) ; cur != NULL ;
|
|
cur = clist_next(cur)) {
|
|
char * name;
|
|
|
|
name = clist_content(cur);
|
|
printf("%s ", name);
|
|
}
|
|
printf("\n");
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DATA"
|
|
>mailmime_data - Content of MIME part</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_DATA_TEXT,
|
|
MAILMIME_DATA_FILE,
|
|
};
|
|
|
|
enum {
|
|
MAILMIME_MECHANISM_ERROR,
|
|
MAILMIME_MECHANISM_7BIT,
|
|
MAILMIME_MECHANISM_8BIT,
|
|
MAILMIME_MECHANISM_BINARY,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE,
|
|
MAILMIME_MECHANISM_BASE64,
|
|
MAILMIME_MECHANISM_TOKEN
|
|
};
|
|
|
|
struct mailmime_data {
|
|
int dt_type;
|
|
int dt_encoding;
|
|
int dt_encoded;
|
|
union {
|
|
struct {
|
|
const char * dt_data;
|
|
size_t dt_length;
|
|
} dt_text;
|
|
char * dt_filename;
|
|
} dt_data;
|
|
};
|
|
|
|
struct mailmime_data * mailmime_data_new(int dt_type, int dt_encoding,
|
|
int dt_encoded, const char * dt_data, size_t dt_length,
|
|
char * dt_filename);
|
|
|
|
void mailmime_data_free(struct mailmime_data * mime_ </PRE
|
|
><P
|
|
> This is the content of MIME part, content of
|
|
preamble or content of epilogue.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_type</B
|
|
> can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DATA_TEXT</B
|
|
> if
|
|
the content is a string in memory,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DATA_FILE</B
|
|
> if the
|
|
content is in a file,
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_encoding</B
|
|
> is the encoding mechanism
|
|
of the part. The value of this field can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_7BIT</B
|
|
> if mechanism is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>7bit</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_8BIT</B
|
|
> if mechanism is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>8bit</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BINARY</B
|
|
> if mechanism is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>binary</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_QUOTED_PRINTABLE</B
|
|
> if
|
|
mechanism is <B
|
|
CLASS="COMMAND"
|
|
>quoted-printable</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BASE64</B
|
|
> if mechanism is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>base64</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_TOKEN</B
|
|
> for other. If
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_TOKEN</B
|
|
>, the part will
|
|
be considered as binary.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_ERROR</B
|
|
> is used internally.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_encoded</B
|
|
> is set to 1 if the part is
|
|
already encoded with the mechanism given in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>dt_encoding</B
|
|
>. It is set to 0 if the part
|
|
is already decoded or if it is necessary to encode that part
|
|
before rendering it.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_data.dt_text.dt_data</B
|
|
> is a pointer to the
|
|
content of the part and <B
|
|
CLASS="COMMAND"
|
|
>dt_data.dt_text.dt_length</B
|
|
>
|
|
is the length of the data if <B
|
|
CLASS="COMMAND"
|
|
>dt_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DATA_TEXT</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dt_data.dt_filename</B
|
|
> is the name of the file if
|
|
<B
|
|
CLASS="COMMAND"
|
|
>dt_type</B
|
|
> is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DATA_FILE</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_data_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_data_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN1906"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-10. Creation and display of MIME part content</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
/* build data with a string */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_data * data;
|
|
|
|
data = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_BASE64,
|
|
0, "foo bar", 7, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_data_free(data);
|
|
}
|
|
|
|
/* build data with a file */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_data * data;
|
|
|
|
data = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_BASE64,
|
|
0, NULL, 0, strdup("foo.txt"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_data_free(data);
|
|
}
|
|
|
|
void display_mime_data(struct mailmime_data * data)
|
|
{
|
|
switch (data->dt_encoding) {
|
|
case MAILMIME_MECHANISM_7BIT:
|
|
printf("7bit\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_8BIT:
|
|
printf("8bit\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_BINARY:
|
|
printf("binary\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
|
|
printf("quoted-printable\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_BASE64:
|
|
printf("base64\n");
|
|
break;
|
|
case MAILMIME_MECHANISM_TOKEN:
|
|
printf("other\n");
|
|
break;
|
|
}
|
|
|
|
if (data->dt_encoded)
|
|
printf("already encoded\n");
|
|
else
|
|
printf("not encoded\n");
|
|
|
|
switch (data->dt_type) {
|
|
MAILMIME_DATA_TEXT:
|
|
printf("data : %p %i\n", data->dt_data.dt_text.dt_data,
|
|
data->dt_data.dt_text.dt_length);
|
|
break;
|
|
MAILMIME_DATA_FILE,
|
|
printf("data (file) : %s\n", data->dt_data.dt_filename);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME"
|
|
>mailmime - MIME part</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_NONE,
|
|
MAILMIME_SINGLE,
|
|
MAILMIME_MULTIPLE,
|
|
MAILMIME_MESSAGE,
|
|
};
|
|
|
|
struct mailmime {
|
|
/* parent information */
|
|
int mm_parent_type;
|
|
struct mailmime * mm_parent;
|
|
clistiter * mm_multipart_pos;
|
|
|
|
int mm_type;
|
|
const char * mm_mime_start;
|
|
size_t mm_length;
|
|
|
|
struct mailmime_fields * mm_mime_fields;
|
|
struct mailmime_content * mm_content_type;
|
|
|
|
struct mailmime_data * mm_body;
|
|
union {
|
|
/* single part */
|
|
struct mailmime_data * mm_single; /* XXX - was body */
|
|
|
|
/* multi-part */
|
|
struct {
|
|
struct mailmime_data * mm_preamble;
|
|
struct mailmime_data * mm_epilogue;
|
|
clist * mm_mp_list;
|
|
} mm_multipart;
|
|
|
|
/* message */
|
|
struct {
|
|
struct mailimf_fields * mm_fields;
|
|
struct mailmime * mm_msg_mime;
|
|
} mm_message;
|
|
|
|
} mm_data;
|
|
};
|
|
|
|
struct mailmime * mailmime_new(int mm_type,
|
|
const char * mm_mime_start, size_t mm_length,
|
|
struct mailmime_fields * mm_mime_fields,
|
|
struct mailmime_content * mm_content_type,
|
|
struct mailmime_data * mm_body,
|
|
struct mailmime_data * mm_preamble,
|
|
struct mailmime_data * mm_epilogue,
|
|
clist * mm_mp_list,
|
|
struct mailimf_fields * mm_fields,
|
|
struct mailmime * mm_msg_mime);
|
|
|
|
void mailmime_free(struct mailmime * mime);
|
|
</PRE
|
|
><P
|
|
> This describes the MIME structure of a message or a subpart
|
|
of a message.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT3"
|
|
><HR><H4
|
|
CLASS="SECT3"
|
|
><A
|
|
NAME="AEN1913"
|
|
>common</A
|
|
></H4
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_parent_type</B
|
|
>. MIME part type can be
|
|
single part, multipart or message part. This describes the MIME part
|
|
type of the parent. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_NONE</B
|
|
> if there is no parent part,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_SINGLE</B
|
|
> if parent is a single part,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MULTIPLE</B
|
|
> if parent is a multipart,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MESSAGE</B
|
|
> if parent is a mesage part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_parent</B
|
|
> is the parent MIME structure.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_multipart_pos</B
|
|
>. In the case the parent
|
|
is a multipart. This is the position in the list of children
|
|
of the parent. This position is given by a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>clisiter *</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_type</B
|
|
>. This describes the MIME part type
|
|
of this part. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_SINGLE</B
|
|
> if this is a single part,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MULTIPLE</B
|
|
> if this is a multipart,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MESSAGE</B
|
|
> if this is a mesage part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_mime_start</B
|
|
>. This is used mostly internally.
|
|
This gives the beginning of the header of the MIME part, when this
|
|
is parsed from a string in memory.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_length</B
|
|
>. This gives the length of the MIME part,
|
|
including the MIME header fields.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_mime_fields</B
|
|
> is the list of parsed MIME headers
|
|
of this part. <B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
> must be excluded and stored
|
|
in <B
|
|
CLASS="COMMAND"
|
|
>mm_content_type</B
|
|
> instead
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_content_type</B
|
|
> is the parsed
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
> field
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_body</B
|
|
> is the content of the MIME part
|
|
(excluding MIME header), when it is parsed from a string
|
|
in memory
|
|
(see <A
|
|
HREF="#MAILMIME-DATA"
|
|
>the Section called <I
|
|
>mailmime_data - Content of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT3"
|
|
><HR><H4
|
|
CLASS="SECT3"
|
|
><A
|
|
NAME="AEN1957"
|
|
>single part</A
|
|
></H4
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> When the part is a single part (<B
|
|
CLASS="COMMAND"
|
|
>mm_type</B
|
|
>
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_SINGLE</B
|
|
>). The following fields
|
|
are valid.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_single</B
|
|
> is the content of the
|
|
MIME part (excluding MIME header), when it is parsed from a string
|
|
in memory. This must have the same
|
|
value as <B
|
|
CLASS="COMMAND"
|
|
>mm_body</B
|
|
> when it is set
|
|
(see <A
|
|
HREF="#MAILMIME-DATA"
|
|
>the Section called <I
|
|
>mailmime_data - Content of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT3"
|
|
><HR><H4
|
|
CLASS="SECT3"
|
|
><A
|
|
NAME="AEN1969"
|
|
>multipart</A
|
|
></H4
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> When the part is a multipart (<B
|
|
CLASS="COMMAND"
|
|
>mm_type</B
|
|
>
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MULTIPLE</B
|
|
>). The following fields
|
|
are valid.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_multipart.mm_preamble</B
|
|
>
|
|
is the content of the preamble of the multipart
|
|
(see <A
|
|
HREF="#MAILMIME-DATA"
|
|
>the Section called <I
|
|
>mailmime_data - Content of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_multipart.mm_epilogue</B
|
|
>
|
|
is the content of the epilogue of the multipart
|
|
(see <A
|
|
HREF="#MAILMIME-DATA"
|
|
>the Section called <I
|
|
>mailmime_data - Content of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_multipart.mm_mp_list</B
|
|
>
|
|
is the list of sub parts
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT3"
|
|
><HR><H4
|
|
CLASS="SECT3"
|
|
><A
|
|
NAME="AEN1987"
|
|
>message part</A
|
|
></H4
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> When the part is a message (<B
|
|
CLASS="COMMAND"
|
|
>mm_type</B
|
|
>
|
|
is <B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MESSAGE</B
|
|
>). The following fields
|
|
are valid.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_message.mm_fields</B
|
|
> is the list of
|
|
the header fields of the message
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mm_data.mm_message.mm_msg_mime</B
|
|
> is
|
|
the subpart
|
|
of the message part.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT3"
|
|
><HR><H4
|
|
CLASS="SECT3"
|
|
><A
|
|
NAME="AEN2001"
|
|
>constructor and destructor</A
|
|
></H4
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_new()</B
|
|
> creates and
|
|
initializes
|
|
a data structure with a value.
|
|
Structures given as argument are referenced by the created
|
|
object and will be freed if the object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_free()</B
|
|
> frees
|
|
memory used by
|
|
the structure and substructures will also be released.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2007"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-11. Creation and display of MIME part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
/* build one single MIME part */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailimf_fields * fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
struct mailmime_data * body;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_fields();
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
/* look at the example in mailmime_content to see how to
|
|
build a mailmime_content */
|
|
content_type = build_mime_content();
|
|
|
|
body = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_8BIT, 0,
|
|
"foo", 3, NULL);
|
|
|
|
mime = mailmime_new(MAILMIME_SINGLE,
|
|
NULL, 0, fields, mime_fields, content_type,
|
|
body, NULL, NULL, NULL, NULL, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
|
|
/* build one single MIME part */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailimf_fields * fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
char * str;
|
|
struct mailmime_data * body;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_fields();
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
/* look at the example in mailmime_content to see how to
|
|
build a mailmime_content */
|
|
content_type = build_mime_content();
|
|
|
|
str = malloc(4);
|
|
strcpy(str, "foo");
|
|
|
|
body = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_8BIT, 0,
|
|
str, 3, NULL);
|
|
|
|
mime = mailmime_new(MAILMIME_SINGLE,
|
|
NULL, 0, fields, mime_fields, content_type,
|
|
body, NULL, NULL, NULL, NULL, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
free(str);
|
|
}
|
|
|
|
/* build a MIME part with a sub-message */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailimf_fields * fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
char * str;
|
|
struct mailmime_type * type;
|
|
struct mailmime_composite_type * composite_type;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_fields();
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
composite_type =
|
|
mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MESSAGE, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_COMPOSITE_TYPE, NULL,
|
|
composite_type);
|
|
content_type = mailmime_content_new(type, strdup("rfc2822"), NULL);
|
|
|
|
/* build_mime_message() is a function that will build a mime message part */
|
|
sub_mime = build_mime_message();
|
|
|
|
mime = mailmime_new(MAILMIME_MESSAGE,
|
|
NULL, 0, fields, mime_fields, content_type,
|
|
NULL, NULL, NULL, NULL, sub_mime, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
|
|
/* build a MIME part with a sub-message (given by a string) */
|
|
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailimf_fields * fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
char * str;
|
|
struct mailmime_data * msg_content;
|
|
struct mailmime_type * type;
|
|
struct mailmime_composite_type * composite_type;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_fields();
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
composite_type =
|
|
mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MESSAGE, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_COMPOSITE_TYPE, NULL,
|
|
composite_type);
|
|
content_type = mailmime_content_new(type, strdup("rfc2822"), NULL);
|
|
|
|
str = malloc(sizeof(SUB_MESSAGE));
|
|
strcpy(str, SUB_MESSAGE);
|
|
|
|
msg_content = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_8BIT, 0,
|
|
str, sizeof(SUB_MESSAGE), NULL);
|
|
|
|
mime = mailmime_new(MAILMIME_MESSAGE,
|
|
NULL, 0, fields, mime_fields, content_type,
|
|
NULL, NULL, NULL, NULL, NULL, msg_content);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
free(str);
|
|
}
|
|
|
|
/* build a multipart message */
|
|
|
|
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailimf_fields * fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
struct mailmime_type * type;
|
|
struct mailmime_composite_type * composite_type;
|
|
struct mailmime_data * body;
|
|
struct mailmime_data * preamble;
|
|
struct mailmime_data * epilogue;
|
|
clist * list;
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
fields = build_fields();
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
composite_type =
|
|
mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MULTIPART, NULL);
|
|
type = mailmime_type_new(MAILMIME_TYPE_COMPOSITE_TYPE, NULL,
|
|
composite_type);
|
|
content_type = mailmime_content_new(type, strdup("mixed"), NULL);
|
|
|
|
list = clist_new();
|
|
/* build_mime_message() is a function that will build a mime message part */
|
|
sub_mime = build_mime_message();
|
|
clist_append(list, sub_mime);
|
|
sub_mime = build_mime_message();
|
|
clist_append(list, sub_mime);
|
|
|
|
preamble = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_8BIT, 0,
|
|
PREAMBLE, sizeof(PREAMBLE), NULL);
|
|
|
|
epilogue = mailmime_data_new(MAILMIME_DATA_TEXT, MAILMIME_MECHANISM_8BIT, 0,
|
|
EPILOGUE, sizeof(EPILOGUE), NULL);
|
|
|
|
mime = mailmime_new(MAILMIME_SINGLE,
|
|
NULL, 0, fields, mime_fields, content_type,
|
|
NULL, preamble, epilogue, list, NULL, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
|
|
/* display mime part info */
|
|
|
|
void display_mime(struct mailmime * mime)
|
|
{
|
|
clistiter * cur;
|
|
|
|
switch (mime->mm_type) {
|
|
case MAILMIME_SINGLE:
|
|
printf("single part\n");
|
|
break;
|
|
case MAILMIME_MULTIPLE:
|
|
printf("multipart\n");
|
|
break;
|
|
case MAILMIME_MESSAGE:
|
|
printf("message\n");
|
|
break;
|
|
}
|
|
|
|
printf("part : %p, length : %i\n",
|
|
mime->mm_mime_start, mime->mm_length);
|
|
printf("\n");
|
|
|
|
if (mime->mm_mime_fields != NULL) {
|
|
printf("MIME headers :\n");
|
|
display_mime_fields(mime->mm_mime_fields);
|
|
printf("\n");
|
|
}
|
|
|
|
printf("content type :\n");
|
|
display_content(mime->mm_content_type);
|
|
printf("\n");
|
|
|
|
switch (mime->mm_type) {
|
|
case MAILMIME_SINGLE:
|
|
display_mime_data(mime->mm_data.mm_single);
|
|
break;
|
|
|
|
case MAILMIME_MULTIPLE:
|
|
if (mime->mm_data.mm_multipart.mm_preamble) {
|
|
printf("preamble :\n");
|
|
display_mime_data(mime->mm_data.mm_multipart.mm_preamble);
|
|
printf("\n");
|
|
}
|
|
|
|
for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ;
|
|
cur != NULL ; cur = clist_next(cur)) {
|
|
display_mime(clist_content(cur));
|
|
}
|
|
|
|
if (mime->mm_data.mm_multipart.mm_epilogue) {
|
|
printf("epilogue :\n");
|
|
display_mime_data(mime->mm_data.mm_multipart.mm_epilogue);
|
|
printf("\n");
|
|
}
|
|
break;
|
|
|
|
case MAILMIME_MESSAGE:
|
|
if (mime->mm_data.mm_message.mm_fields) {
|
|
printf("headers :\n");
|
|
display_field(mime->mm_data.mm_message.mm_msg_fields);
|
|
printf("\n");
|
|
|
|
if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
|
|
printf("sub message %p :\n",
|
|
mime->mm_data.mm_message.mm_msg_mime);
|
|
display_mime(mime->mm_data.mm_message.mm_msg_mime);
|
|
printf("end of sub message %p\n",
|
|
mime->mm_data.mm_message.mm_msg_mime);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION"
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_disposition {
|
|
struct mailmime_disposition_type * dsp_type;
|
|
clist * dsp_parms; /* struct mailmime_disposition_parm */
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is the parsed <B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
>
|
|
header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dsp_type</B
|
|
> is the type of disposition
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION-TYPE"
|
|
>the Section called <I
|
|
>mailmime_disposition_type - Type of MIME disposition</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dsp_parms</B
|
|
> is the list of parameters
|
|
of <B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
> header field.
|
|
Each element is of type <B
|
|
CLASS="COMMAND"
|
|
>mailmime_disposition_parm</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION-PARM"
|
|
>the Section called <I
|
|
>mailmime_disposition_parm - MIME disposition parameter</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2026"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-12. Creation and display of MIME disposition information</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition * disposition;
|
|
struct mailmime_disposition_type * disposition_type;
|
|
clist * disposition_parms;
|
|
struct mailmime_disposition_parm * param;
|
|
|
|
disposition_type =
|
|
mailmime_disposition_type_new(MAILMIME_DISPOSITION_TYPE_ATTACHMENT, NULL);
|
|
|
|
disposition_parms = clist_new();
|
|
param = mailmime_disposition_parm_new(MAILMIME_DISPOSITION_PARM_FILENAME,
|
|
strdup("foo.txt"), NULL,
|
|
NULL, NULL, -1, NULL);
|
|
clist_append(disposition_parms, param);
|
|
|
|
disposition = mailmime_disposition_new(disposition_type, disposition_parms);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_disposition_free(disposition);
|
|
}
|
|
|
|
void display_mime_disposition(struct mailmime_disposition * disposition)
|
|
{
|
|
clistiter * cur;
|
|
|
|
printf("disposition type:\n");
|
|
display_mailmime_disposition_type(disposition->dsp_type);
|
|
printf("\n");
|
|
printf("disposition parameters:\n");
|
|
for(cur = clist_begin(disposition->dsp_parms) ;
|
|
cur != NULL ; cur = clist_next(cur)) {
|
|
struct mailmime_parm * param;
|
|
|
|
param = clist_content(cur);
|
|
display_mime_disposition_parm(param);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION-TYPE"
|
|
>mailmime_disposition_type - Type of MIME disposition</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_DISPOSITION_TYPE_ERROR,
|
|
MAILMIME_DISPOSITION_TYPE_INLINE,
|
|
MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
MAILMIME_DISPOSITION_TYPE_EXTENSION
|
|
};
|
|
|
|
struct mailmime_disposition_type {
|
|
int dsp_type;
|
|
char * dsp_extension;
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is the type of MIME disposition.
|
|
Parsed <B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
> field without
|
|
parameters.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dsp_type</B
|
|
> is the type of disposition.
|
|
The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_INLINE</B
|
|
>
|
|
if MIME disposition is inline,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_ATTACHMENT</B
|
|
>
|
|
if MIME disposition is attachment,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_EXTENSION</B
|
|
>
|
|
for other. In this case, <B
|
|
CLASS="COMMAND"
|
|
>dsp_extension</B
|
|
> must be
|
|
set.
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_ERROR</B
|
|
> is used internally.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2041"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-13. Creation and display of MIME disposition type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
/* standard disposition type */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition_type * disposition_type;
|
|
|
|
disposition_type =
|
|
mailmime_disposition_type_new(MAILMIME_DISPOSITION_TYPE_ATTACHMENT, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_disposition_type_free(disposition_type);
|
|
}
|
|
|
|
/* disposition type extension */
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition_type * disposition_type;
|
|
|
|
disposition_type =
|
|
mailmime_disposition_type_new(MAILMIME_DISPOSITION_TYPE_EXTENSION,
|
|
strdup("mydisposition"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_disposition_type_free(disposition_type);
|
|
}
|
|
|
|
void display_mime_disposition_type(struct mailmime_disposition_type * disposition_type)
|
|
{
|
|
switch (disposition->dsp_type) {
|
|
case MAILMIME_DISPOSITION_TYPE_INLINE:
|
|
printf("inline\n");
|
|
break;
|
|
case MAILMIME_DISPOSITION_TYPE_ATTACHMENT:
|
|
printf("attachment\n");
|
|
break;
|
|
case MAILMIME_DISPOSITION_TYPE_EXTENSION:
|
|
printf("extension : %s\n", disposition_type->dsp_extension);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION-PARM"
|
|
>mailmime_disposition_parm - MIME disposition parameter</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_DISPOSITION_PARM_FILENAME,
|
|
MAILMIME_DISPOSITION_PARM_CREATION_DATE,
|
|
MAILMIME_DISPOSITION_PARM_MODIFICATION_DATE,
|
|
MAILMIME_DISPOSITION_PARM_READ_DATE,
|
|
MAILMIME_DISPOSITION_PARM_SIZE,
|
|
MAILMIME_DISPOSITION_PARM_PARAMETER
|
|
};
|
|
|
|
struct mailmime_disposition_parm {
|
|
int pa_type;
|
|
union {
|
|
char * pa_filename;
|
|
char * pa_creation_date;
|
|
char * pa_modification_date;
|
|
char * pa_read_date;
|
|
size_t pa_size;
|
|
struct mailmime_parameter * pa_parameter;
|
|
} pa_data;
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is a parameter of MIME disposition information. For
|
|
example, this can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>filename="foo.jpg"</B
|
|
>.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is the type of
|
|
disposition. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_FILENAME</B
|
|
>
|
|
for a filename parameter,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_CREATION_DATE</B
|
|
>
|
|
for a creation date parameter,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_MODIFICATION_DATE</B
|
|
>
|
|
for a modification date parameter,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_READ_DATE</B
|
|
>
|
|
for a last read date parameter,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_SIZE</B
|
|
>
|
|
for a file size parameter or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_PARAMETER</B
|
|
>
|
|
for other parameters.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_filename</B
|
|
> is the filename
|
|
parameter when <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_FILENAME</B
|
|
>
|
|
This is a string containing the name of the
|
|
file.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_creation_date</B
|
|
> is the
|
|
creation date parameter when <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_CREATION_DATE</B
|
|
>.
|
|
This is a string containing the formatted creation date.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_modification_date</B
|
|
> is the
|
|
modification date parameter when <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_MODIFICATION_DATE</B
|
|
>.
|
|
This is a string containing the formatted modification date.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_read_date</B
|
|
> is the
|
|
last read date parameter when <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_READ_DATE</B
|
|
>.
|
|
This is a string containing the formatted last read date.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_size</B
|
|
> is the size
|
|
parameter when <B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_SIZE</B
|
|
>.
|
|
This gives the size of the file.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>pa_data.pa_parameter</B
|
|
> is the
|
|
name and the value of the parameter when
|
|
<B
|
|
CLASS="COMMAND"
|
|
>pa_type</B
|
|
> is
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_PARM_PARAMETER</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-PARAMETER"
|
|
>the Section called <I
|
|
>mailmime_parameter - MIME type parameter</I
|
|
></A
|
|
>)
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2090"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-14. Creation and display of MIME disposition
|
|
parameter</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition_parm * param;
|
|
|
|
disposition_parms = clist_new();
|
|
param = mailmime_disposition_parm_new(MAILMIME_DISPOSITION_PARM_FILENAME,
|
|
strdup("foo.txt"), NULL,
|
|
NULL, NULL, -1, NULL);
|
|
/* do the things */
|
|
|
|
mailmime_disposition_parm_free(param);
|
|
}
|
|
|
|
void display_mime_dsp_parm(struct mailmime_disposition_parm * param)
|
|
{
|
|
switch (param->pa_type) {
|
|
case MAILMIME_DISPOSITION_PARM_FILENAME:
|
|
printf("filename: %s\n", param->pa_data.pa_filename);
|
|
break;
|
|
case MAILMIME_DISPOSITION_PARM_CREATION_DATE:
|
|
printf("creation date: %s\n", param->pa_data.pa_creation_date);
|
|
break;
|
|
case MAILMIME_DISPOSITION_PARM_MODIFICATION_DATE:
|
|
printf("modification date: %s\n", param->pa_data.pa_modification_date);
|
|
break;
|
|
case MAILMIME_DISPOSITION_PARM_READ_DATE:
|
|
printf("read date: %s\n", param->pa_data.pa_read_date);
|
|
break;
|
|
case MAILMIME_DISPOSITION_PARM_SIZE:
|
|
printf("size: %lu\n", (unsigned long) param->pa_data.pa_size);
|
|
break;
|
|
case MAILMIME_DISPOSITION_PARM_PARAMETER:
|
|
printf("MIME disposition param:\n");
|
|
display_mime_parameter(param->pa_data.pa_parameter);
|
|
break;
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-SINGLE-FIELDS"
|
|
>mailmime_single_fields - MIME headers</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_single_fields {
|
|
struct mailmime_content * fld_content;
|
|
char * fld_content_charset;
|
|
char * fld_content_boundary;
|
|
char * fld_content_name;
|
|
struct mailmime_mechanism * fld_encoding;
|
|
char * fld_id;
|
|
char * fld_description;
|
|
uint32_t fld_version;
|
|
struct mailmime_disposition * fld_disposition;
|
|
char * fld_disposition_filename;
|
|
char * fld_disposition_creation_date;
|
|
char * fld_disposition_modification_date;
|
|
char * fld_disposition_read_date;
|
|
size_t fld_disposition_size;
|
|
struct mailmime_language * fld_language;
|
|
};
|
|
|
|
struct mailmime_single_fields *
|
|
mailmime_single_fields_new(struct mailmime_fields * fld_fields,
|
|
struct mailmime_content * fld_content);
|
|
|
|
void mailmime_single_fields_free(struct mailmime_single_fields *
|
|
single_fields);
|
|
|
|
void mailmime_single_fields_init(struct mailmime_single_fields * single_fields,
|
|
struct mailmime_fields * fld_fields,
|
|
struct mailmime_content * fld_content);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields</B
|
|
> (see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>) is the native structure
|
|
that MIME module will use, this module will provide an easier
|
|
structure to use when
|
|
parsing fields. <B
|
|
CLASS="COMMAND"
|
|
>mailmime_single_fields</B
|
|
> is
|
|
an easier structure to get parsed fields, rather than
|
|
iteration over the list of fields.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_content</B
|
|
> is the MIME content type
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_content_charset</B
|
|
> is the value
|
|
of the MIME type parameter <B
|
|
CLASS="COMMAND"
|
|
>charset</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_content_boundary</B
|
|
> is the value
|
|
of the MIME type parameter <B
|
|
CLASS="COMMAND"
|
|
>boundary</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_content_name</B
|
|
> is the value
|
|
of the MIME type parameter <B
|
|
CLASS="COMMAND"
|
|
>name</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_encoding</B
|
|
> is the MIME encoding
|
|
mechanism used
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_id</B
|
|
> is the content of the field
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-ID</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_description</B
|
|
> is the content of the field
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Description</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_version</B
|
|
> is the version of MIME
|
|
in use.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition</B
|
|
> is the MIME
|
|
disposition information
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION"
|
|
>the Section called <I
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition_filename</B
|
|
> is
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> parameter of the
|
|
MIME disposition information.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition_creation_date</B
|
|
> is
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>creation-date</B
|
|
> parameter of the
|
|
MIME disposition information.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition_modification_date</B
|
|
> is
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>modification-date</B
|
|
> parameter of the
|
|
MIME disposition information.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition_read_date</B
|
|
> is
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>read-date</B
|
|
> parameter of the
|
|
MIME disposition information.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_disposition_size</B
|
|
> is
|
|
the <B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> parameter of the
|
|
MIME disposition information.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_language</B
|
|
> is the language
|
|
of the MIME part
|
|
(see <A
|
|
HREF="#MAILMIME-LANGUAGE"
|
|
>the Section called <I
|
|
>mailmime_language - Language of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>single_fields</B
|
|
> is the structure to fill.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_fields</B
|
|
> is the MIME fields list to
|
|
use to fill the <B
|
|
CLASS="COMMAND"
|
|
>single_fields</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_single_fields_new()</B
|
|
> creates and
|
|
initializes a data structure with a
|
|
value. Structures given as argument are referenced by the created
|
|
object and will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be freed if the
|
|
object is released.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_single_fields_free()</B
|
|
> frees
|
|
memory used by the structure and
|
|
substructures will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be
|
|
released. They should be released by
|
|
the application.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailimf_single_fields_init()</B
|
|
> will
|
|
initialize fill the data structure, using
|
|
the given argument (<B
|
|
CLASS="COMMAND"
|
|
>fld_fields</B
|
|
> and
|
|
<B
|
|
CLASS="COMMAND"
|
|
>fld_content</B
|
|
>). The interesting fields will
|
|
be filled into single_fields.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2177"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-15. Creation and display of single fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_single_fields * single_fields;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content_type;
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
/* look at the example in mailmime_content to see how to
|
|
build a mailmime_content */
|
|
content_type = build_mime_content();
|
|
|
|
single_fields = mailmime_single_fields_new(mime_fields, content_type);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_single_fields_free(single_fields);
|
|
mailmime_fields_free(mime_fields);
|
|
}
|
|
|
|
void display_mime_single_fields(struct mailmime_single_fields * single_fields)
|
|
{
|
|
if (single_fields->fld_content != NULL) {
|
|
printf("content type:\n");
|
|
display_mime_content(single_fields->fld_content);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_content_charset != NULL) {
|
|
printf("content type charset: %s\n",
|
|
single_fields->fld_content_charset);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_content_boundary != NULL) {
|
|
printf("content type boundary: %s\n",
|
|
single_fields->fld_content_boundary);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->content_name != NULL) {
|
|
printf("content type name: %s\n", single_fields->content_name);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_encoding != NULL) {
|
|
printf("content transfer encoding:\n");
|
|
display_mime_mechanism(single_fields->fld_encoding);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_id != NULL) {
|
|
printf("content id: %s\n", single_fields->fld_id);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_description != NULL) {
|
|
printf("content description: %s\n", single_fields->fld_description);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_version != 0) {
|
|
printf("mime version: %i.%i\n",
|
|
single_fields->fld_version>> 16,
|
|
single_fields->fld_version & 0xFFFF);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition != NULL) {
|
|
printf("content disposition:\n");
|
|
display_mime_disposition(single_fields->fld_disposition);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition_filename != NULL) {
|
|
printf("content disposition filename: %s\n",
|
|
single_fields->fld_disposition_filename);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition_creation_date != NULL) {
|
|
printf("content disposition creation date: %s\n",
|
|
single_fields->fld_disposition_creation_date);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition_modification_date != NULL) {
|
|
printf("content disposition modification date: %s\n",
|
|
single_fields->fld_disposition_modification_date);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition_read_date != NULL) {
|
|
printf("content disposition read date: %s\n",
|
|
single_fields->fld_disposition_read_date;
|
|
printf("\n");
|
|
}
|
|
if (single_fields->fld_disposition_size != (size_t) -1) {
|
|
printf("content disposition size : %i\n",
|
|
single_fields->fld_disposition_size);
|
|
printf("\n");
|
|
}
|
|
if (single_fields->language != NULL) {
|
|
printf("content language:\n");
|
|
display_mime_language(single_fields->fld_language);
|
|
printf("\n");
|
|
}
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN2180"
|
|
>Parser functions</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-CONTENT-PARSE"
|
|
>mailmime_content_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_content_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_content ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse the content of a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
> header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content type.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2203"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-16. Parsing MIME content type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Type") == 0) {
|
|
struct mailmime_content * content_type;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_content_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &content_type);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_content(content_type);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailmime_content_free(content_type);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DESCRIPTION-PARSE"
|
|
>mailmime_description_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include >libetpan/libetpan.h<
|
|
|
|
int mailmime_description_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
char ** result);
|
|
</PRE
|
|
><P
|
|
> This will parse the content of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Description</B
|
|
> MIME header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content description.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>.
|
|
The result string must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>free()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2227"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-17. Parsing MIME description</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Description") == 0) {
|
|
char * description;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_description_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &description);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
printf("%s\n", description);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
free(description);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-ENCODING-PARSE"
|
|
>mailmime_encoding_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include >libetpan/libetpan.h<
|
|
|
|
int mailmime_encoding_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_mechanism ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse the content of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Transfer-Encoding</B
|
|
> header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME encoding mechanism.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2251"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-18. parsing MIME encoding mechanism</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Transfer-Encoding") == 0) {
|
|
struct mailmime_content * encoding;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_encoding_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &encoding);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_mechanism(encoding);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailmime_mechanism_free(encoding);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELD-PARSE"
|
|
>mailmime_field_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailmime_field_parse(struct mailimf_optional_field * field,
|
|
struct mailmime_field ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse a MIME header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>field</B
|
|
> is a non-parsed field
|
|
(see <A
|
|
HREF="#MAILIMF-OPTIONAL-FIELD"
|
|
>the Section called <I
|
|
>mailimf_optional_field - non-standard header</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-FIELD"
|
|
>the Section called <I
|
|
>mailmime_field - MIME header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2267"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-19. parsing MIME header field</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
r = mailmime_field_parse(field->fld_data.fld_optional_field,
|
|
&mime_fields);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_field(mime_field);
|
|
mailmime_field_free(mime_field);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
}
|
|
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-ID-PARSE"
|
|
>mailmime_id_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include >libetpan/libetpan.h<
|
|
|
|
int mailmime_id_parse(const char * message, size_t length,
|
|
size_t * index, char ** result);
|
|
</PRE
|
|
><P
|
|
> This will parse the content of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-ID</B
|
|
> MIME header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content identifier.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>.
|
|
The result string must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>free()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2291"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-20. Parsing MIME content identifier</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-ID") == 0) {
|
|
char * id;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_id_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &id);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
printf("%s\n", id);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
free(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS-PARSE"
|
|
>mailmime_fields_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailmime_fields_parse(struct mailimf_fields * fields,
|
|
struct mailmime_fields ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse a MIME header fields.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
> is a list of RFC 2822 fields
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2307"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-21. parsing MIME header fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
struct mailmime_fields * mime_fields;
|
|
|
|
r = mailmime_fields_parse(f, &mime_fields);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_fields(mime_fields);
|
|
mailmime_fields_free(mime_fields);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-VERSION-PARSE"
|
|
>mailmime_version_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_version_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
uint32_t * result);
|
|
</PRE
|
|
><P
|
|
> This will parse the content of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MIME-Version</B
|
|
> MIME header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME version.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-FIELD"
|
|
>the Section called <I
|
|
>mailmime_field - MIME header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2331"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-22. parsing MIME version</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"MIME-Version") == 0) {
|
|
uint32_t version;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_version_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &version);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
printf("%i.%i\n", version >> 16, version & 0xFFFF);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
free(description);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-PARAMETER-PARSE"
|
|
>mailmime_parameter_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_parameter_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_parameter ** result);
|
|
</PRE
|
|
><P
|
|
> This will parse a MIME parameter (parameter of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Type</B
|
|
> or parameter of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
>).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME parameter.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-PARAMETER"
|
|
>the Section called <I
|
|
>mailmime_parameter - MIME type parameter</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2356"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-23. parsing a MIME parameter</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define PARAM_STR "foo=bar"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
size_t current_index;
|
|
struct mailmime_parameter * param;
|
|
int status;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
current_index = 0;
|
|
r = mailmime_parameter_parse(PARAM_STR, sizeof(PARAM_STR) - 1,
|
|
&current_index, &param);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_parameter(param);
|
|
/* do the things */
|
|
mailmime_parameter_free(param);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-LANGUAGE-PARSE"
|
|
>mailmime_language_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_language_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_language ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse the content of a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Language</B
|
|
> header.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content language.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-LANGUAGE"
|
|
>the Section called <I
|
|
>mailmime_language - Language of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2380"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-24. Parsing the MIME content langage</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Language") == 0) {
|
|
struct mailmime_language * lang;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_id_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &lang);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_language(lang);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
free(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION-PARSE"
|
|
>mailmime_disposition_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_disposition_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_disposition ** result);
|
|
</PRE
|
|
><P
|
|
> This function will parse the content of a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
> MIME header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content disposition.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION"
|
|
>the Section called <I
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2404"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-25. Parsing the MIME content disposition</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Disposition") == 0) {
|
|
struct mailmime_disposition * dsp;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_id_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &dsp);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_disposition(dsp);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
free(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION-TYPE-PARSE"
|
|
>mailmime_disposition_type_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int
|
|
mailmime_disposition_type_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
struct mailmime_disposition_type **
|
|
result);
|
|
</PRE
|
|
><P
|
|
> This function will parse the type of MIME content
|
|
disposition.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME content disposition type.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION-TYPE"
|
|
>the Section called <I
|
|
>mailmime_disposition_type - Type of MIME disposition</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2427"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-26. parsing a MIME content disposition type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DSP_TYPE_STR "attachment"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
size_t current_index;
|
|
struct mailmime_disposition_type * dsp_type;
|
|
int status;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
current_index = 0;
|
|
r = mailmime_disposition_type_parse(DSP_TYPE_STR, sizeof(DSP_TYPE_STR) - 1,
|
|
&current_index, &dsp_type);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime_disposition_type(dsp_type);
|
|
/* do the things */
|
|
mailmime_disposition_type_free(dsp_type);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-ENCODED-PHRASE-PARSE"
|
|
>mailmime_encoded_phrase_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_encoded_phrase_parse(const char * default_fromcode,
|
|
const char * message, size_t length,
|
|
size_t * index, const char * tocode,
|
|
char ** result);
|
|
</PRE
|
|
><P
|
|
> This function will decode a MIME encoded header string,
|
|
encoded with RFC 2047.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>default_fromcode</B
|
|
> is the default
|
|
code to use for parts of string that are not marked
|
|
with charset.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is the string to decode.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>tocode</B
|
|
> is the destination charset
|
|
for decoding.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2455"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-27. decoding a MIME encoded header string</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define TEST_STRING "=?iso-8859-1?ab?= =?iso-8859-15?cd?="
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
size_t cur_token;
|
|
char * decoded_subject;
|
|
|
|
cur_token = 0;
|
|
mailmime_encoded_phrase_parse("iso-8859-1",
|
|
TEST_STRING, sizeof(TEST_STRING),
|
|
&cur_token, "iso-8859-1", &decoded_subject);
|
|
|
|
printf("%s\n", decoded_subject);
|
|
|
|
/* do the things */
|
|
|
|
free(decoded_subject);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-PARSE"
|
|
>mailmime_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_parse(const char * message, size_t length,
|
|
size_t * index, struct mailmime ** result);
|
|
</PRE
|
|
><P
|
|
> This will parse a MIME message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string containing
|
|
the MIME message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2478"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-28. parsing a MIME message</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailmime * mime;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_parse(mem, stat_info.st_size,
|
|
&current_index, &mime);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
display_mime(mime);
|
|
/* do the things */
|
|
status = EXIT_SUCCESS;
|
|
mailmime_free(mime);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-BASE64-BODY-PARSE"
|
|
>mailmime_base64_body_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_base64_body_parse(const char * message, size_t length,
|
|
size_t * index, char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function will parse a body part encoded using base64.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string encoded using
|
|
base64.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
The result must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2501"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-29. Parsing a base64 encoded part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
char * result;
|
|
size_t result_len;
|
|
|
|
current_index = 0;
|
|
r = mailmime_base64_body_parse(mem, stat_info.st_size,
|
|
&current_index, &result, &result_len);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
|
|
/* do the things */
|
|
|
|
mailmime_decoded_part_free(mem);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-QUOTED-PRINTABLE-BODY-PARSE"
|
|
>mailmime_quoted_printable_body_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_quoted_printable_body_parse(const char * message, size_t length,
|
|
size_t * index, char ** result,
|
|
size_t * result_len, int in_header);
|
|
</PRE
|
|
><P
|
|
> This function will parse a body part encoded using quoted
|
|
printable.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string encoded using
|
|
quoted printable.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
The result must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2524"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-30. Parsing a quoted printable encoded part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
char * result;
|
|
size_t result_len;
|
|
|
|
current_index = 0;
|
|
r = mailmime_quoted_printable_body_parse(mem, stat_info.st_size,
|
|
&current_index, &result, &result_len);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
|
|
/* do the things */
|
|
|
|
mailmime_decoded_part_free(mem);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-BINARY-BODY-PARSE"
|
|
>mailmime_binary_body_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_binary_body_parse(const char * message, size_t length,
|
|
size_t * index, char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function will parse a body part encoded using binary
|
|
(no encoding).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string encoded using
|
|
binary.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
The result must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2547"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-31. Parsing a binary encoded part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
char * result;
|
|
size_t result_len;
|
|
|
|
current_index = 0;
|
|
r = mailmime_binary_body_parse(mem, stat_info.st_size,
|
|
&current_index, &result, &result_len);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
|
|
/* do the things */
|
|
|
|
mailmime_decoded_part_free(mem);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-PART-PARSE"
|
|
>mailmime_part_parse</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_MECHANISM_ERROR,
|
|
MAILMIME_MECHANISM_7BIT,
|
|
MAILMIME_MECHANISM_8BIT,
|
|
MAILMIME_MECHANISM_BINARY,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE,
|
|
MAILMIME_MECHANISM_BASE64,
|
|
MAILMIME_MECHANISM_TOKEN
|
|
};
|
|
|
|
int mailmime_part_parse(const char * message, size_t length,
|
|
size_t * index,
|
|
int encoding, char ** result, size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function will parse a body part encoded using a
|
|
given MIME encoding mechanism.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
> is a string encoded using
|
|
binary.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the size of the given
|
|
string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is a pointer to the start of
|
|
the address in the given string, <B
|
|
CLASS="COMMAND"
|
|
>(*
|
|
index)</B
|
|
> is modified to point at the end of the
|
|
parsed data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>encoding</B
|
|
> is a MIME encoding
|
|
mechanism. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_7BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_8BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BINARY</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_QUOTED_PRINTABLE</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BASE64</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_TOKEN</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>. The result of the parse
|
|
operation is stored in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
>
|
|
The result must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mmap_string_unref()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2580"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-32. Parsing a MIME encoded part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
char * result;
|
|
size_t result_len;
|
|
|
|
current_index = 0;
|
|
r = mailmime_part_parse(mem, stat_info.st_size, &current_index,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE, &result, &result_len);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
|
|
/* do the things */
|
|
|
|
mailmime_decoded_part_free(mem);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN2583"
|
|
>Rendering of MIME parts</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS-WRITE"
|
|
>mailmime_fields_write, mailmime_content_write and
|
|
mailmime_content_type_write</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_fields_write(FILE * f, int * col,
|
|
struct mailmime_fields * fields);
|
|
|
|
int mailmime_content_write(FILE * f, int * col,
|
|
struct mailmime_content * content);
|
|
|
|
int mailmime_content_type_write(FILE * f, int * col,
|
|
struct mailmime_content * content);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_write</B
|
|
> render the MIME
|
|
header fields.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_write</B
|
|
> render the MIME
|
|
content type header field.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_write</B
|
|
> render the
|
|
content of the MIME content type header field.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>col</B
|
|
> current column is given for wrapping
|
|
purpose in <B
|
|
CLASS="COMMAND"
|
|
>(* col)</B
|
|
>,
|
|
the resulting columns will be returned..
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>f</B
|
|
> is the file descriptor. It can be
|
|
stdout for example.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
> is the header fields
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>content</B
|
|
> is the header fields
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2610"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-33. rendering MIME header fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_mime * mime_fields;
|
|
int col;
|
|
|
|
/* look at the example in mailmime_fields to see how to
|
|
build a mailmime_fields */
|
|
mime_fields = build_mime_fields();
|
|
|
|
col = 0;
|
|
mailmime_fields_write(stdout, &col, mime_fields);
|
|
|
|
mailmime_fields_free(mime_fields);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_content * content;
|
|
int col;
|
|
|
|
/* look at the example in mailmime_content to see how to
|
|
build a mailmime_fields */
|
|
content = build_mime_content();
|
|
|
|
col = 0;
|
|
mailmime_content_write(stdout, &col, mime_fields);
|
|
|
|
mailmime_content_free(content);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_content * content;
|
|
int col;
|
|
|
|
/* look at the example in mailmime_content to see how to
|
|
build a mailmime_fields */
|
|
content = build_mime_content();
|
|
|
|
col = 0;
|
|
mailmime_content_type_write(stdout, &col, mime_fields);
|
|
|
|
mailmime_content_free(content);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-WRITE"
|
|
>mailmime_write</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_write(FILE * f, int * col,
|
|
struct mailmime * build_info);
|
|
</PRE
|
|
><P
|
|
> This function will render a MIME message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>col</B
|
|
> current column is given for wrapping
|
|
purpose in <B
|
|
CLASS="COMMAND"
|
|
>(* col)</B
|
|
>,
|
|
the resulting columns will be returned..
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>f</B
|
|
> is the file descriptor. It can be
|
|
stdout for example.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>build_info</B
|
|
> is the MIME message to
|
|
render.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-QUOTED-PRINTABLE-WRITE"
|
|
>mailmime_quoted_printable_write
|
|
and mailmime_base64_write</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_quoted_printable_write(FILE * f, int * col, int istext,
|
|
const char * text, size_t size);
|
|
|
|
int mailmime_base64_write(FILE * f, int * col,
|
|
const char * text, size_t size);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_quoted_printable_write()</B
|
|
> will
|
|
render a string to quoted printable.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_base64_write()</B
|
|
> will
|
|
render a string to base64.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>col</B
|
|
> current column is given for wrapping
|
|
purpose in <B
|
|
CLASS="COMMAND"
|
|
>(* col)</B
|
|
>,
|
|
the resulting columns will be returned..
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>f</B
|
|
> is the file descriptor. It can be
|
|
stdout for example.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>text</B
|
|
> is the string to render.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> is the size of the string to
|
|
render.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2649"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-34. render base64 or quoted printable</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int col;
|
|
|
|
col = 0;
|
|
mailmime_quoted_printable_write(stdout, &col,
|
|
"this is a test", 14);
|
|
}
|
|
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int col;
|
|
|
|
col = 0;
|
|
mailmime_base64_write(stdout, &col, "this is a test", 14);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DATA-WRITE"
|
|
>mailmime_data_write</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_data_write(FILE * f, int * col,
|
|
struct mailmime_data * data,
|
|
int istext);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_data_write</B
|
|
> will
|
|
render MIME data.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>col</B
|
|
> current column is given for wrapping
|
|
purpose in <B
|
|
CLASS="COMMAND"
|
|
>(* col)</B
|
|
>,
|
|
the resulting columns will be returned..
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>f</B
|
|
> is the file descriptor. It can be
|
|
stdout for example.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>data</B
|
|
> is the data to render
|
|
(see <A
|
|
HREF="#MAILMIME-DATA"
|
|
>the Section called <I
|
|
>mailmime_data - Content of MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN2669"
|
|
>Creation functions</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DISPOSITION-NEW-FILENAME"
|
|
>mailmime_disposition_new_filename and
|
|
mailmime_disposition_new_with_data</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_DISPOSITION_TYPE_ERROR,
|
|
MAILMIME_DISPOSITION_TYPE_INLINE,
|
|
MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
MAILMIME_DISPOSITION_TYPE_EXTENSION
|
|
};
|
|
|
|
struct mailmime_disposition *
|
|
mailmime_disposition_new_filename(int type, char * filename);
|
|
|
|
struct mailmime_disposition *
|
|
mailmime_disposition_new_with_data(int type,
|
|
char * filename, char * creation_date, char * modification_date,
|
|
char * read_date, size_t size);
|
|
</PRE
|
|
><P
|
|
> These functions will create a MIME content disposition
|
|
information.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>type</B
|
|
> a standard MIME disposition :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_INLINE</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_ATTACHMENT</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> is the filename.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>creation_date</B
|
|
> is the creation date.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>modification_date</B
|
|
> is the modification
|
|
date.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>read_date</B
|
|
> is the last read date.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> is the size of the file.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> This will return a MIME content disposition
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION"
|
|
>the Section called <I
|
|
>mailmime_disposition - MIME disposition information (Content-Disposition)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2694"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-35. creating a MIME content disposition</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>
|
|
#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition * disposition;
|
|
|
|
disposition =
|
|
mailmime_disposition_new_filename(MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
strdup("foo-bar.txt"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_disposition_free(disposition);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS-NEW-EMPTY"
|
|
>mailmime_fields_new_empty and mailmime_fields_add</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_fields * mailmime_fields_new_empty(void);
|
|
|
|
int mailmime_fields_add(struct mailmime_fields * fields,
|
|
struct mailmime_field * field);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new_empty()</B
|
|
> will
|
|
create a new empty MIME header fields list.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_add()</B
|
|
> will add
|
|
MIME header fields to the MIME header fields list.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
>. The MIME header field will
|
|
be added to this MIME header fields list
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>field</B
|
|
> is the MIME header field to add
|
|
(see <A
|
|
HREF="#MAILMIME-FIELD"
|
|
>the Section called <I
|
|
>mailmime_field - MIME header field</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2713"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-36. creating a MIME header fields list</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_fields * fields;
|
|
struct mailmime_field * field;
|
|
|
|
fields = mailmime_fields_new_empty();
|
|
field = build_mime_field();
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_add(fields, field);
|
|
|
|
mailmime_fields_free(fields);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS-NEW-WITH-DATA"
|
|
>mailmime_fields_new_with_data and
|
|
mailmime_fields_new_with_version</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_fields *
|
|
mailmime_fields_new_with_data(struct mailmime_mechanism * encoding,
|
|
char * id,
|
|
char * description,
|
|
struct mailmime_disposition * disposition,
|
|
struct mailmime_language * language);
|
|
|
|
struct mailmime_fields *
|
|
mailmime_fields_new_with_version(struct mailmime_mechanism * encoding,
|
|
char * id,
|
|
char * description,
|
|
struct mailmime_disposition * disposition,
|
|
struct mailmime_language * language);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new_with_data()</B
|
|
> will
|
|
create a MIME header fields list with all the given fields
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> can be used for the value if the
|
|
field must not be present).
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MIME-Version</B
|
|
> header field will
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>not</I
|
|
></SPAN
|
|
> be added.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new_with_version()</B
|
|
> will
|
|
create a MIME header fields list with all the given fields
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> can be used for the value if the
|
|
field must not be present).
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MIME-Version</B
|
|
> header field will be added.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2728"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-37. creating new fields</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_disposition * disposition;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_mechanism * encoding;
|
|
|
|
encoding = mailmime_mechanism_new(MAILMIME_MECHANISM_BASE64, NULL);
|
|
|
|
disposition =
|
|
mailmime_disposition_new_filename(MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
strdup("foo-bar.txt"));
|
|
|
|
mime_fields = mailmime_fields_new_with_version(encoding, NULL,
|
|
NULL, disposition, NULL);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_free(mime_fields);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-GET-CONTENT-MESSAGE"
|
|
>mailmime_get_content_message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime_content * mailmime_get_content_message(void);
|
|
|
|
struct mailmime_content * mailmime_get_content_text(void);
|
|
|
|
struct mailmime_content * mailmime_content_new_with_str(const char * str);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_get_content_message()</B
|
|
> will
|
|
create a MIME content type
|
|
<B
|
|
CLASS="COMMAND"
|
|
>message/rfc822</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_get_content_text()</B
|
|
> will
|
|
create a MIME content type
|
|
<B
|
|
CLASS="COMMAND"
|
|
>plain/text</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_get_content_new_with_str()</B
|
|
> will
|
|
create a MIME content type given by the string
|
|
<B
|
|
CLASS="COMMAND"
|
|
>plain/text</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>str</B
|
|
>. This string will
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NOT</B
|
|
> be referenced by any structure.
|
|
This string will only be parsed to create the structure.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2746"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-38. Creating a MIME content type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_message();
|
|
|
|
/* do the things */
|
|
|
|
mailmime_content_free(content);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_text();
|
|
|
|
/* do the things */
|
|
|
|
mailmime_content_free(content);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_new_with_str("multipart/mixed");
|
|
|
|
/* do the things */
|
|
|
|
mailmime_content_free(content);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-DATA-NEW-DATA"
|
|
>mailmime_data_new_data and mailmime_data_new_file</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_MECHANISM_ERROR,
|
|
MAILMIME_MECHANISM_7BIT,
|
|
MAILMIME_MECHANISM_8BIT,
|
|
MAILMIME_MECHANISM_BINARY,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE,
|
|
MAILMIME_MECHANISM_BASE64,
|
|
MAILMIME_MECHANISM_TOKEN
|
|
};
|
|
|
|
struct mailmime_data *
|
|
mailmime_data_new_data(int encoding, int encoded,
|
|
const char * data, size_t length);
|
|
|
|
struct mailmime_data *
|
|
mailmime_data_new_file(int encoding, int encoded,
|
|
char * filename);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_data_new_data()</B
|
|
> will create a
|
|
new MIME content, using a string in memory.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_data_new_file()</B
|
|
> will create a
|
|
new MIME content, using a file.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>encoding</B
|
|
> is the MIME encoding
|
|
mechanism used to encode this part. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_7BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_8BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BINARY</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_QUOTED_PRINTABLE</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BASE64</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>encoded</B
|
|
> is set to 1 if the part is
|
|
already encoded with the mechanism given in
|
|
<B
|
|
CLASS="COMMAND"
|
|
>encoding</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>data</B
|
|
> is a pointer to the
|
|
content of the part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the length of the data.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> is the name of the file.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2779"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-39. creating MIME content</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DATA_STR "my data"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_data * data;
|
|
|
|
data = mailmime_data_new_data(MAILMIME_MECHANISM_BASE64, 0,
|
|
DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_data_free(data);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime_data * data;
|
|
|
|
data = mailmime_data_new_file(MAILMIME_MECHANISM_BASE64, 0,
|
|
strdup("foo-bar.txt"));
|
|
|
|
/* do the things */
|
|
|
|
mailmime_data_free(data);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-NEW-MESSAGE-DATA"
|
|
>mailmime_new_message_data, mailmime_new_empty and
|
|
mailmime_new_with_content</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmime *
|
|
mailmime_new_message_data(struct mailmime * msg_mime);
|
|
|
|
struct mailmime *
|
|
mailmime_new_empty(struct mailmime_content * content,
|
|
struct mailmime_fields * mime_fields);
|
|
|
|
int
|
|
mailmime_new_with_content(const char * content_type,
|
|
struct mailmime_fields * mime_fields,
|
|
struct mailmime ** result);
|
|
|
|
struct mailmime * mailmime_multiple_new(const char * type);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_new_message_data()</B
|
|
> will create a
|
|
new MIME message with the given subpart.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_new_empty()</B
|
|
> will create a
|
|
new MIME part with the given content type and MIME fields
|
|
but with no content.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_new_with_content()</B
|
|
> will create a
|
|
new MIME part with a content type given by a string and a
|
|
given MIME fields list.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_multiple_new()</B
|
|
> will create a
|
|
new MIME multipart with a content type given by a string.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_mime</B
|
|
> is the sub part to add to the
|
|
MIME message when creating it
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>content</B
|
|
> is the content type of the part
|
|
to create
|
|
(see <A
|
|
HREF="#MAILMIME-CONTENT"
|
|
>the Section called <I
|
|
>mailmime_content - MIME content type (Content-Type)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>content_type</B
|
|
> is the content type of
|
|
the part to create given by a string.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mime_fields</B
|
|
> is the list of MIME
|
|
header fields
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2809"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-40. creating a MIME part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DATA_STR "my data"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailmime * single_part;
|
|
|
|
mime_fields =
|
|
mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
|
|
mailmime_new_with_content("plain/text", mime_fields, &single_part);
|
|
|
|
mailmime_set_body_text(single_part, DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
mime = mailmime_new_message_data(single_part);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailmime * single_part;
|
|
struct mailmime_content * content;
|
|
|
|
mime_fields =
|
|
mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
|
|
content = mailmime_get_content_text();
|
|
single_part = mailmime_new_empty(content, mime_fields);
|
|
|
|
mailmime_set_body_text(single_part, DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
mime = mailmime_new_message_data(single_part);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
|
|
mime = mailmime_multiple_new("multipart/mixed");
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-SET-PREAMBLE-FILE"
|
|
>mailmime_set_preamble_file, mailmime_set_epilogue_file,
|
|
mailmime_set_preamble_text and mailmime_set_epilogue_text</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_set_preamble_file(struct mailmime * build_info,
|
|
char * filename);
|
|
|
|
int mailmime_set_epilogue_file(struct mailmime * build_info,
|
|
char * filename);
|
|
|
|
int mailmime_set_preamble_text(struct mailmime * build_info,
|
|
char * data_str, size_t length);
|
|
|
|
int mailmime_set_epilogue_text(struct mailmime * build_info,
|
|
char * data_str, size_t length);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_preamble_file()</B
|
|
> will define
|
|
the preamble of a multipart.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_preamble_text()</B
|
|
> will define
|
|
the preamble of a multipart.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_epilogue_file()</B
|
|
> will define
|
|
the epilogue of a multipart.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_preamble_text()</B
|
|
> will define
|
|
the preamble of a multipart.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>build_info</B
|
|
> is the MIME part to modify
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>data_str</B
|
|
> is the string to define
|
|
as epilogue or prologue.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the length of the string to
|
|
define as epilogue or prologue.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> is the name of the file
|
|
which content will be defined as epilogue or prologue.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2837"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-41. setting preamble and epilogue</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DATA_STR "test foo bar"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
|
|
mime = mailmime_multiple_new("multipart/mixed");
|
|
|
|
mailmime_set_preamble_file(mime, strdup("foo-bar.txt"));
|
|
|
|
mailmime_set_epilogue_data(mime, DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-SET-BODY-FILE"
|
|
>mailmime_set_body_file and mailmime_set_body_text</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_set_body_file(struct mailmime * build_info,
|
|
char * filename);
|
|
|
|
int mailmime_set_body_text(struct mailmime * build_info,
|
|
char * data_str, size_t length);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_body_file()</B
|
|
> will define
|
|
the body of a single part.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_body_text()</B
|
|
> will define
|
|
the body of a single part.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>build_info</B
|
|
> is the MIME part to modify
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>data_str</B
|
|
> is the string to define
|
|
as the body of the part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>length</B
|
|
> is the length of the string to
|
|
define as the body of the part.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> is the name of the file
|
|
which content will be defined as the body of the part.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2861"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-42. creating a MIME part</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DATA_STR "my data"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
|
|
mime_fields =
|
|
mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
|
|
mailmime_new_with_content("plain/text", mime_fields, &mime);
|
|
|
|
mailmime_set_body_text(mime, DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-ADD-PART"
|
|
>mailmime_add_part, mailmime_remove_part,
|
|
mailmime_smart_add_part and mailmime_smart_remove_part</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_add_part(struct mailmime * build_info,
|
|
struct mailmime * part);
|
|
|
|
void mailmime_remove_part(struct mailmime * mime);
|
|
|
|
int mailmime_smart_add_part(struct mailmime * mime,
|
|
struct mailmime * mime_sub);
|
|
|
|
int mailmime_smart_remove_part(struct mailmime * mime);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_add_part()</B
|
|
> will add a sub MIME
|
|
part.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_remove_part()</B
|
|
> will detach the
|
|
given sub part from its parent.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_smart_add_part()</B
|
|
> will add a sub
|
|
MIME part. If the parent part is a message and no child
|
|
exist, the part is set as the child. If the parent part is a
|
|
message and a child already exists, if the child is
|
|
multipart, the part to add is added as child of this
|
|
multipart, else a multipart is added and the part is added
|
|
as child of the multipart.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_smart_remove_part()</B
|
|
> will detach
|
|
the given sub part from its parent. The sub part will be
|
|
freed.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>build_info</B
|
|
> is the parent MIME part
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>part</B
|
|
> is the part to add
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mime</B
|
|
> is the parent MIME part
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mime_sub</B
|
|
> is the part to add or to
|
|
detach
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2892"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-43. modifying MIME structure</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * sub_mime;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_text();
|
|
|
|
mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_BASE64);
|
|
|
|
sub_mime = mailmime_new_empty(content, mime_fields);
|
|
|
|
mime = mailmime_new_message_data(NULL);
|
|
|
|
mailmime_add_part(mime, sub_mime);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * sub_mime;
|
|
struct mailmime * other_sub_mime;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_text();
|
|
mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_BASE64);
|
|
sub_mime = mailmime_new_empty(content, mime_fields);
|
|
|
|
content = mailmime_get_content_text();
|
|
mime_fields =
|
|
mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
|
|
other_sub_mime = mailmime_new_empty(content, mime_fields);
|
|
|
|
mime = mailmime_new_message_data(NULL);
|
|
|
|
mailmime_smart_add_part(mime, sub_mime);
|
|
mailmime_smart_add_part(mime, other_sub_mime);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * sub_mime;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_text();
|
|
|
|
mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_BASE64);
|
|
|
|
sub_mime = mailmime_new_empty(content, mime_fields);
|
|
|
|
mime = mailmime_new_message_data(NULL);
|
|
|
|
mailmime_add_part(mime, sub_mime);
|
|
|
|
mailmime_remove_part(sub_mime);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(sub_mime);
|
|
mailmime_free(mime);
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * sub_mime;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailmime_content * content;
|
|
|
|
content = mailmime_get_content_text();
|
|
|
|
mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_BASE64);
|
|
|
|
sub_mime = mailmime_new_empty(content, mime_fields);
|
|
|
|
mime = mailmime_new_message_data(NULL);
|
|
|
|
mailmime_add_part(mime, sub_mime);
|
|
|
|
mailmime_smart_remove_part(sub_mime);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-SET-IMF-FIELDS"
|
|
>mailmime_set_imf_fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
void mailmime_set_imf_fields(struct mailmime * build_info,
|
|
struct mailimf_fields * fields);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_set_imf_fields()</B
|
|
> will set the
|
|
fields of the given MIME message.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>build_info</B
|
|
> is the MIME message to
|
|
modify
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
> is the header fields to set
|
|
for the message
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2909"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-44. modifying MIME structure</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DATA_STR "test foo bar"
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
struct mailmime * mime;
|
|
struct mailmime_fields * mime_fields;
|
|
struct mailimf_fields * imf_fields;
|
|
|
|
mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
|
|
|
|
mailmime_new_with_content("text/plain", mime_fields, &mime);
|
|
|
|
mailmime_set_body_text(mime, DATA_STR, sizeof(DATA_STR) - 1);
|
|
|
|
/* look at the example in mailimf_fields to see how to
|
|
build a mailimf_fields */
|
|
imf_fields = build_fields();
|
|
|
|
mailmime_set_imf_fields(mime, imf_fields);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_free(mime);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-FIELDS-NEW-ENCODING"
|
|
>mailmime_fields_new_encoding and
|
|
mailmime_fields_new_filename</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAILMIME_MECHANISM_ERROR,
|
|
MAILMIME_MECHANISM_7BIT,
|
|
MAILMIME_MECHANISM_8BIT,
|
|
MAILMIME_MECHANISM_BINARY,
|
|
MAILMIME_MECHANISM_QUOTED_PRINTABLE,
|
|
MAILMIME_MECHANISM_BASE64,
|
|
MAILMIME_MECHANISM_TOKEN
|
|
};
|
|
|
|
enum {
|
|
MAILMIME_DISPOSITION_TYPE_ERROR,
|
|
MAILMIME_DISPOSITION_TYPE_INLINE,
|
|
MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
MAILMIME_DISPOSITION_TYPE_EXTENSION
|
|
};
|
|
|
|
struct mailmime_fields * mailmime_fields_new_encoding(int encoding_type);
|
|
|
|
struct mailmime_fields * mailmime_fields_new_filename(int dsp_type,
|
|
char * filename, int encoding_type);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new_encoding()</B
|
|
> will
|
|
create a list of MIME header fields with only
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Transfer-Encoding</B
|
|
>.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_fields_new_filename()</B
|
|
> will
|
|
create a list of MIME header fields with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Transfer-Encoding</B
|
|
> and
|
|
<B
|
|
CLASS="COMMAND"
|
|
>Content-Disposition</B
|
|
>.
|
|
</P
|
|
><P
|
|
> The result will be a list of MIME header fields
|
|
(see <A
|
|
HREF="#MAILMIME-FIELDS"
|
|
>the Section called <I
|
|
>mailmime_fields - header fields</I
|
|
></A
|
|
>).
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>encoding_type</B
|
|
> is the MIME encoding
|
|
mechanism. The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_7BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_8BIT</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BINARY</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_QUOTED_PRINTABLE</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_MECHANISM_BASE64</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>dsp_type</B
|
|
> is the disposition type.
|
|
The value can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_INLINE</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>MAILMIME_DISPOSITION_TYPE_ATTACHMENT</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME-DISPOSITION-TYPE"
|
|
>the Section called <I
|
|
>mailmime_disposition_type - Type of MIME disposition</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>filename</B
|
|
> is the filename for MIME
|
|
content disposition.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2943"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-45. creating MIME fields with only Content-Transfer-Encoding</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int main(void)
|
|
{
|
|
struct mailmime_fields * fields;
|
|
|
|
fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_BASE64);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_free(fields);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
struct mailmime_fields * fields;
|
|
|
|
fields =
|
|
mailmime_fields_new_filename(MAILMIME_DISPOSITION_TYPE_ATTACHMENT,
|
|
strdup("foo-bar.txt"), MAILMIME_MECHANISM_BASE64);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_free(fields);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN2946"
|
|
>Helper functions</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-TRANSFER-ENCODING-GET"
|
|
>mailmime_transfer_encoding_get</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmime_transfer_encoding_get(struct mailmime_fields * fields);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_transfer_encoding_get()</B
|
|
> will
|
|
return the standard MIME encoding mechanism.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fields</B
|
|
> is the list of MIME header
|
|
fields.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> An integer representing the MIME encoding mechanism will
|
|
be returned
|
|
(see <A
|
|
HREF="#MAILMIME-MECHANISM"
|
|
>the Section called <I
|
|
>mailmime_mechanism - MIME transfer encoding mechanism (Content-Transfer-Encoding)</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2960"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-46. extracting MIME encoding mechanism</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
struct mailmime_fields * mime_fields;
|
|
|
|
r = mailmime_fields_parse(f, &mime_fields);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
int encoding;
|
|
|
|
encoding = mailmime_transfer_encoding_get(mime_fields);
|
|
|
|
/* do the things */
|
|
|
|
mailmime_fields_free(mime_fields);
|
|
status = EXIT_SUCCESS;
|
|
}
|
|
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMIME-CONTENT-CHARSET-GET"
|
|
>mailmime_content_charset_get and
|
|
mailmime_content_param_get</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
char * mailmime_content_charset_get(struct mailmime_content * content);
|
|
|
|
char * mailmime_content_param_get(struct mailmime_content * content,
|
|
char * name);
|
|
|
|
char * mailmime_extract_boundary(struct mailmime_content * content_type);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_charset_get()</B
|
|
> will
|
|
return the <B
|
|
CLASS="COMMAND"
|
|
>charset</B
|
|
> parameter of
|
|
MIME content type.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_content_param_get()</B
|
|
> will
|
|
return the value of a given parameter of
|
|
MIME content type.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmime_extract_boundary()</B
|
|
> will
|
|
return the <B
|
|
CLASS="COMMAND"
|
|
>charset</B
|
|
> parameter of
|
|
MIME content type.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
>
|
|
<B
|
|
CLASS="COMMAND"
|
|
>content</B
|
|
> is the MIME content type.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>name</B
|
|
> is the name of the parameter to
|
|
extract.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> With <B
|
|
CLASS="COMMAND"
|
|
>mailmime_extract_boundary()</B
|
|
>, the
|
|
returned value must be freed with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>free()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN2985"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-47. extracting information from MIME content type</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int fd;
|
|
int r;
|
|
|
|
status = EXIT_FAILURE;
|
|
|
|
fd = open("message.rfc2822", O_RDONLY);
|
|
if (fd >= 0) {
|
|
void * mem;
|
|
struct stat stat_info;
|
|
|
|
r = fstat(fd, &stat_info);
|
|
if (r >= 0) {
|
|
mem = mmap(NULL, stat_info.st_size, PROT_READ, MAP_PRIVATE);
|
|
if (mem != MAP_FAILED) {
|
|
struct mailimf_fields * f;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailimf_fields_parse(mem, stat_info.st_size,
|
|
&current_index, &f);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
clistiter * cur;
|
|
|
|
for(cur = clist_begin(f->fld_list) ; cur != NULL ; cur =
|
|
clist_next(cur)) {
|
|
struct mailmime_field * mime_field;
|
|
struct mailimf_field * field;
|
|
|
|
field = clist_content(cur);
|
|
|
|
if (field->fld_type == MAILIMF_FIELD_OPTIONAL_FIELD) {
|
|
if (strcasecmp(field->fld_data.fld_optional_field->fld_name,
|
|
"Content-Type") == 0) {
|
|
struct mailmime_content * content_type;
|
|
size_t current_index;
|
|
|
|
current_index = 0;
|
|
r = mailmime_content_parse(field->fld_data.fld_optional_field->fld_value,
|
|
strlen(field->fld_data.fld_optional_field->fld_value),
|
|
&current_index, &content_type);
|
|
if (r == MAILIMF_NO_ERROR) {
|
|
char * charset;
|
|
char * name;
|
|
char * boundary;
|
|
|
|
charset = mailmime_content_charset_get(content_type);
|
|
name = mailmime_content_param_get(content_type, "name");
|
|
boundary = mailmime_extract_boundary(content_type);
|
|
|
|
/* do the things */
|
|
|
|
free(boundary);
|
|
|
|
status = EXIT_SUCCESS;
|
|
mailmime_content_free(content_type);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mailimf_fields_free(f);
|
|
}
|
|
}
|
|
munmap(mem, stat_info.st_size);
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
exit(status);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><HR><H1
|
|
><A
|
|
NAME="AEN2988"
|
|
></A
|
|
>Chapter 5. Storages, folders, messages</H1
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN2990"
|
|
>Introduction</A
|
|
></H2
|
|
><P
|
|
> This part will give the definition of some objects.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN2993"
|
|
>Message</A
|
|
></H3
|
|
><P
|
|
> A message is the common e-mail message or news message you
|
|
read or send.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN2996"
|
|
>MIME part</A
|
|
></H3
|
|
><P
|
|
> A message can have attachment such as images or other documents.
|
|
The attachment are organized into a tree structure. Each
|
|
node of this structure is a MIME part.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN2999"
|
|
>Mailbox</A
|
|
></H3
|
|
><P
|
|
> A mailbox will contain a given number of messages.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3002"
|
|
>Storage</A
|
|
></H3
|
|
><P
|
|
> A storage is a "physical" localisation of your mailbox. This
|
|
can be on a filesystem (local or remote disk, this is the
|
|
case of MH, mbox and maildir), or this can be on a remote
|
|
host (this is the case for POP3, IMAP or NNTP).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3005"
|
|
>Folder</A
|
|
></H3
|
|
><P
|
|
> A storage, for the same user, can contain a given number of
|
|
mailboxes, depending the storage capabilities, then, the
|
|
storage driver capabilities. With etPan!, MH, IMAP and NNTP
|
|
storages can have more than one mailbox. The mailboxes will
|
|
be called folders. On storage where we only have one
|
|
mailbox, the unique mailbox is the unique folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3008"
|
|
>Session</A
|
|
></H3
|
|
><P
|
|
> The session is the network connection or the entity to which
|
|
the commands of the drivers are given.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN3011"
|
|
>Error codes</A
|
|
></H2
|
|
><P
|
|
> Error codes returned as integers can be one of the following :
|
|
</P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>enum {
|
|
MAIL_NO_ERROR = 0,
|
|
MAIL_NO_ERROR_AUTHENTICATED,
|
|
MAIL_NO_ERROR_NON_AUTHENTICATED,
|
|
MAIL_ERROR_NOT_IMPLEMENTED,
|
|
MAIL_ERROR_UNKNOWN,
|
|
MAIL_ERROR_CONNECT,
|
|
MAIL_ERROR_BAD_STATE,
|
|
MAIL_ERROR_FILE,
|
|
MAIL_ERROR_STREAM,
|
|
MAIL_ERROR_LOGIN,
|
|
MAIL_ERROR_CREATE, /* 10 */
|
|
MAIL_ERROR_DELETE,
|
|
MAIL_ERROR_LOGOUT,
|
|
MAIL_ERROR_NOOP,
|
|
MAIL_ERROR_RENAME,
|
|
MAIL_ERROR_CHECK,
|
|
MAIL_ERROR_EXAMINE,
|
|
MAIL_ERROR_SELECT,
|
|
MAIL_ERROR_MEMORY,
|
|
MAIL_ERROR_STATUS,
|
|
MAIL_ERROR_SUBSCRIBE, /* 20 */
|
|
MAIL_ERROR_UNSUBSCRIBE,
|
|
MAIL_ERROR_LIST,
|
|
MAIL_ERROR_LSUB,
|
|
MAIL_ERROR_APPEND,
|
|
MAIL_ERROR_COPY,
|
|
MAIL_ERROR_FETCH,
|
|
MAIL_ERROR_STORE,
|
|
MAIL_ERROR_SEARCH,
|
|
MAIL_ERROR_DISKSPACE,
|
|
MAIL_ERROR_MSG_NOT_FOUND, /* 30 */
|
|
MAIL_ERROR_PARSE,
|
|
MAIL_ERROR_INVAL,
|
|
MAIL_ERROR_PART_NOT_FOUND,
|
|
MAIL_ERROR_REMOVE,
|
|
MAIL_ERROR_FOLDER_NOT_FOUND,
|
|
MAIL_ERROR_MOVE,
|
|
MAIL_ERROR_STARTTLS,
|
|
MAIL_ERROR_CACHE_MISS,
|
|
MAIL_ERROR_NO_TLS,
|
|
MAIL_ERROR_EXPUNGE,
|
|
/* misc errors */
|
|
MAIL_ERROR_MISC,
|
|
MAIL_ERROR_PROTOCOL,
|
|
MAIL_ERROR_CAPABILITY,
|
|
MAIL_ERROR_CLOSE,
|
|
MAIL_ERROR_FATAL,
|
|
MAIL_ERROR_READONLY,
|
|
MAIL_ERROR_NO_APOP,
|
|
MAIL_ERROR_COMMAND_NOT_SUPPORTED,
|
|
MAIL_ERROR_NO_PERMISSION,
|
|
MAIL_ERROR_PROGRAM_ERROR,
|
|
MAIL_ERROR_SUBJECT_NOT_FOUND,
|
|
MAIL_ERROR_CHAR_ENCODING_FAILED,
|
|
MAIL_ERROR_SEND,
|
|
MAIL_ERROR_COMMAND,
|
|
};
|
|
</PRE
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN3015"
|
|
>Storage</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTORAGE-DRIVER"
|
|
>Storage driver</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct mailstorage_driver mailstorage_driver;
|
|
|
|
struct mailstorage_driver {
|
|
char * sto_name;
|
|
int (* sto_connect)(struct mailstorage * storage);
|
|
int (* sto_get_folder_session)(struct mailstorage * storage,
|
|
char * pathname, mailsession ** result);
|
|
void (* sto_uninitialize)(struct mailstorage * storage);
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is the driver for a storage.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_name</B
|
|
> is the name of the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_connect()</B
|
|
> connects the storage to
|
|
the remote access or to the path in the local filesystem.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_get_folder_session()</B
|
|
> 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 access.
|
|
</P
|
|
><P
|
|
> <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>XXX - in the future, this will be moved to the
|
|
folder driver</I
|
|
></SPAN
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_uninitialize()</B
|
|
> frees the data
|
|
created with mailstorage constructor.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTORAGE"
|
|
>Storage</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailstorage {
|
|
char * sto_id;
|
|
void * sto_data;
|
|
mailsession * sto_session;
|
|
mailstorage_driver * sto_driver;
|
|
clist * sto_shared_folders; /* list of (struct mailfolder *) */
|
|
|
|
void * sto_user_data;
|
|
};
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_id</B
|
|
> is an identifier for the
|
|
storage. This can be <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_data</B
|
|
> is the internal data
|
|
of the storage. This can only be changed by the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_session</B
|
|
> is the session used by
|
|
the storage. The session can be used to send commands.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_driver</B
|
|
> is the driver of the
|
|
storage.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_shared_folders</B
|
|
> is the list of
|
|
folders that share the session with the storage.
|
|
This is used internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sto_user_data</B
|
|
> is a field for free
|
|
use. The user can store any data in that field.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTORAGE-NEW"
|
|
>mailstorage_new and mailstorage_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailstorage * mailstorage_new(char * sto_id);
|
|
|
|
void mailstorage_free(struct mailstorage * storage);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstorage_new()</B
|
|
> initializes a storage
|
|
structure with an identifier (<B
|
|
CLASS="COMMAND"
|
|
>sto_id</B
|
|
>) and
|
|
with no driver.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstorage_free()</B
|
|
> free the memory used
|
|
by a storage.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSTORAGE-CONNECT"
|
|
>mailstorage_connect and mailstorage_disconnect</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailstorage_connect(struct mailstorage * storage);
|
|
|
|
void mailstorage_disconnect(struct mailstorage * storage);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstorage_connect()</B
|
|
> connects the storage.
|
|
This function can also be used to confirm that a storage
|
|
connection is valid when the storage is already connected.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailstorage_disconnect()</B
|
|
> disconnects the
|
|
storage.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3074"
|
|
>IMAP storage</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int imap_mailstorage_init(struct mailstorage * storage,
|
|
char * imap_servername, uint16_t imap_port,
|
|
char * imap_command,
|
|
int imap_connection_type, int imap_auth_type,
|
|
char * imap_login, char * imap_password,
|
|
int imap_cached, char * imap_cache_directory);
|
|
</PRE
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3077"
|
|
>Example</A
|
|
></H3
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN3079"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 5-1. use of storage</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(void)
|
|
{
|
|
struct mailstorage * storage;
|
|
int r;
|
|
|
|
storage = mailstorage_new(NULL);
|
|
|
|
imap_mailstorage_init(storage, "imap.my-servers.org", 0,
|
|
NULL, CONNECTION_TYPE_TRY_STARTTLS, IMAP_AUTH_TYPE_PLAIN,
|
|
"my-login", "my-password", 1, "/home/login/.libetpan/cache");
|
|
|
|
r = mailstorage_connect(storage);
|
|
if (r == MAIL_NO_ERROR) {
|
|
mailstorage_disconnect(storage);
|
|
}
|
|
|
|
mailstorage_free(storage);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN3082"
|
|
>Folder</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-DRIVER"
|
|
>Folder driver</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct mailfolder_driver mailfolder_driver;
|
|
|
|
struct mailfolder_driver {
|
|
int (* fld_get_session)(struct mailfolder * folder,
|
|
mailsession ** result);
|
|
|
|
int (* fld_noop)(struct mailfolder * folder);
|
|
|
|
int (* fld_check)(struct mailfolder * folder);
|
|
|
|
int (* fld_expunge)(struct mailfolder * folder);
|
|
|
|
int (* fld_status)(struct mailfolder * folder,
|
|
uint32_t * result_messages, uint32_t * result_recent,
|
|
uint32_t * result_unseen);
|
|
|
|
int (* fld_append_message)(struct mailfolder * folder,
|
|
char * message, size_t size);
|
|
|
|
int (* fld_get_messages_list)(struct mailfolder * folder,
|
|
struct mailmessage_list ** result);
|
|
|
|
int (* fld_get_envelopes_list)(struct mailfolder * folder,
|
|
struct mailmessage_list * result);
|
|
|
|
int (* fld_get_message)(struct mailfolder * folder,
|
|
uint32_t num, mailmessage ** result);
|
|
|
|
int (* fld_get_message_by_uid)(struct mailfolder * folder,
|
|
const char * uid, mailmessage ** result);
|
|
}
|
|
</PRE
|
|
><P
|
|
> XXX - this will be implemented in the future.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_get_session()</B
|
|
> will return the session
|
|
this folder should use.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> For other method, you should see <A
|
|
HREF="#MAILSESSION-DRIVER"
|
|
>the Section called <I
|
|
>Session driver</I
|
|
></A
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3095"
|
|
>Folder</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailfolder {
|
|
char * fld_pathname;
|
|
char * fld_virtual_name;
|
|
|
|
struct mailstorage * fld_storage;
|
|
|
|
mailsession * fld_session;
|
|
int fld_shared_session;
|
|
clistiter * fld_pos;
|
|
|
|
struct mailfolder * fld_parent;
|
|
unsigned int fld_sibling_index;
|
|
carray * fld_children; /* array of (struct mailfolder *) */
|
|
|
|
void * fld_user_data;
|
|
};
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_pathname</B
|
|
> is the pathname specific to
|
|
the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_virtual_name</B
|
|
> is the identifier of
|
|
this folder. This can be <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_storage</B
|
|
> is the storage used for this
|
|
folder (see <A
|
|
HREF="#MAILSTORAGE"
|
|
>the Section called <I
|
|
>Storage</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_session</B
|
|
> is the session used for this
|
|
folder.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_shared_session</B
|
|
> is set to 1 if the
|
|
folder use the same session as the storage. This is used
|
|
internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_pos</B
|
|
> is the
|
|
position in the list of folders of the storage.
|
|
This is used internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> use of <B
|
|
CLASS="COMMAND"
|
|
>fld_parent</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>fld_sibling_index</B
|
|
> and
|
|
<B
|
|
CLASS="COMMAND"
|
|
>fld_children</B
|
|
> is deprecated.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fld_user_data</B
|
|
> is a field for free
|
|
use. The user can store any data in that field.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-NEW"
|
|
>mailfolder_new and mail_folder_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailfolder * mailfolder_new(struct mailstorage * fld_storage,
|
|
char * fld_pathname, char * fld_virtual_name);
|
|
|
|
void mailfolder_free(struct mailfolder * folder);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailfolder_new()</B
|
|
> initializes a folder
|
|
structure with an identifier
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>fld_virtual_name</B
|
|
>) with path name
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>fld_pathname</B
|
|
>). The folder will be owned
|
|
by the given storage (<B
|
|
CLASS="COMMAND"
|
|
>fld_storage</B
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailfolder_free()</B
|
|
> free the memory used
|
|
by the folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-CONNECT"
|
|
>mailfolder_connect and mailfolder_disconnect</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailfolder_connect(struct mailfolder * folder);
|
|
|
|
void mailfolder_disconnect(struct mailfolder * folder);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailfolder_connect()</B
|
|
> connects the folder.
|
|
This function can also be used to confirm that a folder
|
|
connection is valid when the folder is already connected.
|
|
When doing operations with several folders, you have to be
|
|
sure that this function has been called before making calls
|
|
on folder.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailfolder_disconnect()</B
|
|
> disconnects the
|
|
folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-NOOP"
|
|
>mailfolder_noop</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailfolder_noop(struct mailfolder * folder);
|
|
</PRE
|
|
><P
|
|
> This function will only send noop to the mail access.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-CHECK"
|
|
>mailfolder_check</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailfolder_check(struct mailfolder * folder);
|
|
</PRE
|
|
><P
|
|
> A call to this function will save to disk the internal state
|
|
of the selected mailbox (such as flags).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-EXPUNGE"
|
|
>mailfolder_expunge</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailfolder_expunge(struct mailfolder * folder);
|
|
</PRE
|
|
><P
|
|
> A call to this function will delete all messages marked for
|
|
deletion.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-STATUS"
|
|
>mailfolder_status</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_status(struct mailfolder * folder,
|
|
uint32_t * result_messages, uint32_t * result_recent,
|
|
uint32_t * result_unseen);
|
|
</PRE
|
|
><P
|
|
> A call to this function will return some counts of messages
|
|
in the mailbox.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-APPEND-MESSAGE"
|
|
>mailfolder_append_message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_append_message(struct mailfolder * folder,
|
|
char * message, size_t size);
|
|
</PRE
|
|
><P
|
|
> This function will store a new message in the given folder.
|
|
The message is given by a string in memory
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>message</B
|
|
>) and a size
|
|
(<B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-GET-MESSAGES-LIST"
|
|
>mailfolder_get_messages_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_get_messages_list(struct mailfolder * folder,
|
|
struct mailmessage_list ** result);
|
|
</PRE
|
|
><P
|
|
> This function will return the list of messages in the given
|
|
folder (see <A
|
|
HREF="#MAILMESSAGE-LIST"
|
|
>the Section called <I
|
|
>Message list</I
|
|
></A
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-GET-ENVELOPES-LIST"
|
|
>mailfolder_get_envelopes_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_get_envelopes_list(struct mailfolder * folder,
|
|
struct mailmessage_list * result);
|
|
</PRE
|
|
><P
|
|
> This function will fill the list of parsed header fields
|
|
structure in the <B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structures
|
|
of the given list of messages (<B
|
|
CLASS="COMMAND"
|
|
>result</B
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-GET-MESSAGE"
|
|
>mailfolder_get_message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_get_message(struct mailfolder * folder,
|
|
uint32_t num, mailmessage ** result);
|
|
</PRE
|
|
><P
|
|
> This function will return the message identified by a
|
|
message index (<B
|
|
CLASS="COMMAND"
|
|
>num</B
|
|
>)
|
|
This will return a <B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structure
|
|
in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
> (see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILFOLDER-GET-MESSAGE-BY-UID"
|
|
>mailfolder_get_message_by_uid</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int mailfolder_get_message_by_uid(struct mailfolder * folder,
|
|
const char * uid, mailmessage ** result);
|
|
</PRE
|
|
><P
|
|
> This function will return the message identified by a
|
|
unique identifier (<B
|
|
CLASS="COMMAND"
|
|
>uid</B
|
|
>)
|
|
This will return a <B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structure
|
|
in <B
|
|
CLASS="COMMAND"
|
|
>(* result)</B
|
|
> (see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3193"
|
|
>Example</A
|
|
></H3
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN3195"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 5-2. use of folder</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int main(void)
|
|
{
|
|
struct mailstorage * storage;
|
|
int r;
|
|
|
|
storage = mailstorage_new(NULL);
|
|
|
|
imap_mailstorage_init(storage, "imap.my-servers.org", 0,
|
|
NULL, CONNECTION_TYPE_TRY_STARTTLS, IMAP_AUTH_TYPE_PLAIN,
|
|
"my-login", "my-password", 1, "/home/login/.libetpan/cache");
|
|
|
|
r = mailstorage_connect(storage);
|
|
if (r == MAIL_NO_ERROR) {
|
|
struct mailfolder * folder;
|
|
|
|
folder = mailfolder_new(storage, "INBOX", NULL);
|
|
|
|
r = mailfolder_connect(folder);
|
|
if (r == MAIL_NO_ERROR) {
|
|
struct mailmessage_list * msg_list;
|
|
|
|
mailfolder_get_messages_list(folder, &msg_list);
|
|
|
|
/* do the things */
|
|
|
|
mailmessage_list_free(msg_list);
|
|
|
|
mailfolder_disconnect(folder);
|
|
}
|
|
|
|
mailstorage_disconnect(storage);
|
|
}
|
|
|
|
mailstorage_free(storage);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN3198"
|
|
>Message</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-DRIVER"
|
|
>Message driver</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmessage_driver {
|
|
char * msg_name;
|
|
|
|
int (* msg_initialize)(mailmessage * msg_info);
|
|
|
|
void (* msg_uninitialize)(mailmessage * msg_info);
|
|
|
|
void (* msg_flush)(mailmessage * msg_info);
|
|
|
|
void (* msg_check)(mailmessage * msg_info);
|
|
|
|
void (* msg_fetch_result_free)(mailmessage * msg_info,
|
|
char * msg);
|
|
|
|
int (* msg_fetch)(mailmessage * msg_info,
|
|
char ** result,
|
|
size_t * result_len);
|
|
|
|
int (* msg_fetch_header)(mailmessage * msg_info,
|
|
char ** result,
|
|
size_t * result_len);
|
|
|
|
int (* msg_fetch_body)(mailmessage * msg_info,
|
|
char ** result, size_t * result_len);
|
|
|
|
int (* msg_fetch_size)(mailmessage * msg_info,
|
|
size_t * result);
|
|
|
|
int (* msg_get_bodystructure)(mailmessage * msg_info,
|
|
struct mailmime ** result);
|
|
|
|
int (* msg_fetch_section)(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result, size_t * result_len);
|
|
|
|
int (* msg_fetch_section_header)(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
|
|
int (* msg_fetch_section_mime)(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
|
|
int (* msg_fetch_section_body)(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
|
|
int (* msg_fetch_envelope)(mailmessage * msg_info,
|
|
struct mailimf_fields ** result);
|
|
|
|
int (* msg_get_flags)(mailmessage * msg_info,
|
|
struct mail_flags ** result);
|
|
};
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_name</B
|
|
> is the name of the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_initialize()</B
|
|
> will initialize the
|
|
internal message state (field
|
|
<B
|
|
CLASS="COMMAND"
|
|
>msg_data</B
|
|
> of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structure (see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_uninitialize()</B
|
|
> will free the
|
|
internal message state.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_flush()</B
|
|
> will release memory used
|
|
by the MIME structure of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_check()</B
|
|
> will store the flags of
|
|
the message into the session, so that the message can be
|
|
released without the flags are lost.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_result_free()</B
|
|
> will free a
|
|
string returned by any fetch_XXX() function.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch()</B
|
|
> will fetch a message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_header()</B
|
|
> will fetch the
|
|
header fields of a message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_body()</B
|
|
> will fetch a message
|
|
without its main header.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_size()</B
|
|
> will return the size
|
|
of a message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_get_bodystructure</B
|
|
> will retrieve
|
|
the MIME structure of the message. The returned
|
|
structure must <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be freed.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_section()</B
|
|
> will fetch the
|
|
content of the section of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_section_header()</B
|
|
> will fetch
|
|
the header of a section of the message if the content of
|
|
the section is a message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_section_mime()</B
|
|
> will fetch
|
|
the MIME header of a section of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_section_body()</B
|
|
> will fetch
|
|
the body of a section (without the headers) of the
|
|
message if the content of the section is a message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fetch_envelope()</B
|
|
> will return
|
|
a given number of parsed header fields.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_get_flags()</B
|
|
> will return the
|
|
flags of the message.
|
|
The returned structure must <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
> be
|
|
freed.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE"
|
|
>Message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmessage {
|
|
mailsession * msg_session;
|
|
mailmessage_driver * msg_driver;
|
|
uint32_t msg_index;
|
|
char * msg_uid;
|
|
|
|
size_t msg_size;
|
|
struct mailimf_fields * msg_fields;
|
|
struct mail_flags * msg_flags;
|
|
|
|
int msg_resolved;
|
|
struct mailimf_single_fields msg_single_fields;
|
|
struct mailmime * msg_mime;
|
|
|
|
/* internal data */
|
|
|
|
int msg_cached;
|
|
void * msg_data;
|
|
|
|
/*
|
|
msg_folder field :
|
|
used to reference the mailfolder, this is a workaround due
|
|
to the problem with initial conception, where folder notion
|
|
did not exist.
|
|
*/
|
|
void * msg_folder;
|
|
/* user data */
|
|
void * msg_user_data;
|
|
};
|
|
</PRE
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_session</B
|
|
> is the session related to
|
|
the message
|
|
(see <A
|
|
HREF="#MAILSESSION"
|
|
>the Section called <I
|
|
>Session</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_driver</B
|
|
> is the driver used for the
|
|
message
|
|
(see <A
|
|
HREF="#MAILMESSAGE-DRIVER"
|
|
>the Section called <I
|
|
>Message driver</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_index</B
|
|
> is an index to indentify
|
|
the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_uid</B
|
|
> is the unique identifier of
|
|
the message, valid accross disconnections.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_size</B
|
|
> is the size of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_fields</B
|
|
> is the list of parsed
|
|
header fields of the message. This can be
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_fields - list of header fields</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_flags</B
|
|
> is the flags of the
|
|
message. This can be <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>
|
|
(see <A
|
|
HREF="#MAIL-FLAGS"
|
|
>the Section called <I
|
|
>Message flags</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_resolved</B
|
|
> will tell if the field
|
|
<B
|
|
CLASS="COMMAND"
|
|
>msg_single_fields</B
|
|
> has been initialized.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_single_fields</B
|
|
> will be filled
|
|
using <B
|
|
CLASS="COMMAND"
|
|
>msg_fields</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILIMF-SINGLE-FIELDS"
|
|
>the Section called <I
|
|
>mailimf_single_fields - simplified fields</I
|
|
> in Chapter 3</A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_mime</B
|
|
> is the MIME structure of the
|
|
message. It is intialized at least when
|
|
<B
|
|
CLASS="COMMAND"
|
|
>get_bodystructure()</B
|
|
> is called once.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_cached</B
|
|
> is 1 when the message was
|
|
cached. This is used internally.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_data</B
|
|
> is the internal state of the
|
|
message. The content depends on the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_folder</B
|
|
> is used to reference the
|
|
mailfolder, this is a workaround due to the problem with
|
|
initial conception, where folder notion did not exist.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_user_data</B
|
|
> is a field for free
|
|
use. The user can store any data in that field.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-NEW"
|
|
>mailmessage_new</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
mailmessage * mailmessage_new(void);
|
|
|
|
void mailmessage_free(mailmessage * info);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_new()</B
|
|
> will create a new
|
|
message (without driver). This is used internally by
|
|
drivers.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_free()</B
|
|
> will free the memory
|
|
used by the given message.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-INIT"
|
|
>mailmessage_init</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_init(mailmessage * msg_info,
|
|
mailsession * session,
|
|
mailmessage_driver * driver,
|
|
uint32_t index, size_t size);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_init()</B
|
|
> will initialize a
|
|
message with a driver.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_info</B
|
|
> is the message to initialize
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>session</B
|
|
> is the session related to the
|
|
message
|
|
(see <A
|
|
HREF="#MAILSESSION"
|
|
>the Section called <I
|
|
>Session</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>driver</B
|
|
> is the driver to use for the
|
|
message
|
|
(see <A
|
|
HREF="#MAILMESSAGE-DRIVER"
|
|
>the Section called <I
|
|
>Message driver</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is the index of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>size</B
|
|
> is the size of the message.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FLUSH"
|
|
>mailmessage_flush</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_flush(mailmessage * info);
|
|
</PRE
|
|
><P
|
|
> This function will release the memory used by the MIME
|
|
structure of the message.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-CHECK"
|
|
>mailmessage_check</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_check(mailmessage * info);
|
|
</PRE
|
|
><P
|
|
> After you set some flags, if you want to notify them to the
|
|
session before destroying the message, you can use this function.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-RESULT-FREE"
|
|
>mailmessage_fetch_result_free</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_result_free(mailmessage * msg_info,
|
|
char * msg);
|
|
</PRE
|
|
><P
|
|
> This function will free a string returned by any
|
|
mailmessage_fetch_XXX() function.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH"
|
|
>mailmessage_fetch</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch(mailmessage * msg_info,
|
|
char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the content of the message (headers
|
|
and text).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-HEADER"
|
|
>mailmessage_fetch_header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_header(mailmessage * msg_info,
|
|
char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the header of the message as a string.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-BODY"
|
|
>mailmessage_fetch_body</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_body(mailmessage * msg_info,
|
|
char ** result, size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the content of the message (without
|
|
headers).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-SIZE"
|
|
>mailmessage_fetch_size</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_size(mailmessage * msg_info,
|
|
size_t * result);
|
|
</PRE
|
|
><P
|
|
> This function returns the size of the message content.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-GET-BODYSTRUCTURE"
|
|
>mailmessage_get_bodystructure</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_get_bodystructure(mailmessage * msg_info,
|
|
struct mailmime ** result);
|
|
</PRE
|
|
><P
|
|
> This functions returns the MIME structure of the message.
|
|
The returned information <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>MUST</I
|
|
></SPAN
|
|
> not be
|
|
freed by hand. It is freed by
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmessage_flush()</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmessage_free()</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMIME"
|
|
>the Section called <I
|
|
>mailmime - MIME part</I
|
|
> in Chapter 4</A
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-SECTION"
|
|
>mailmessage_fetch_section</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_section(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result, size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the content of a MIME part.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-SECTION-HEADER"
|
|
>mailmessage_fetch_section_header</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_section_header(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the header of the message contained
|
|
in the given MIME part.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-SECTION-MIME"
|
|
>mailmessage_fetch_section_mime</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_section_mime(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the MIME header of the given MIME
|
|
part.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-SECTION-BODY"
|
|
>mailmessage_fetch_section_body</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_section_body(mailmessage * msg_info,
|
|
struct mailmime * mime,
|
|
char ** result,
|
|
size_t * result_len);
|
|
</PRE
|
|
><P
|
|
> This function returns the text part of the message contained
|
|
in the given MIME part.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-FETCH-ENVELOPE"
|
|
>mailmessage_fetch_envelope</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_fetch_envelope(mailmessage * msg_info,
|
|
struct mailimf_fields ** result);
|
|
</PRE
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-GET-FLAGS"
|
|
>mailmessage_get_flags</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailmessage_get_flags(mailmessage * msg_info,
|
|
struct mail_flags ** result);
|
|
</PRE
|
|
><P
|
|
> This function returns the flags related to the message.
|
|
The returned information MUST not be freed by hand. It is freed by
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmessage_free()</B
|
|
>.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-RESOLVE-SINGLE-FIELDS"
|
|
>mailmessage_resolve_single_fields</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
void mailmessage_resolve_single_fields(mailmessage * msg_info);
|
|
</PRE
|
|
><P
|
|
> This function will use the fields information to fill
|
|
the single_fields structure in the mailmessage structure.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-LIST"
|
|
>Message list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmessage_list {
|
|
carray * msg_tab; /* elements are (mailmessage *) */
|
|
};
|
|
|
|
struct mailmessage_list * mailmessage_list_new(carray * msg_tab);
|
|
|
|
void mailmessage_list_free(struct mailmessage_list * env_list);
|
|
</PRE
|
|
><P
|
|
> This is a list of messages.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>msg_tab</B
|
|
> is an array containing the
|
|
messages (see linkend="carray").
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_list_new()</B
|
|
> will initialize a
|
|
list of messages, using a given array of messages.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_list_free()</B
|
|
> will free the
|
|
memory used by the list of messages. This will also free the
|
|
messages.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILMESSAGE-TREE"
|
|
>Message tree</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailmessage_tree {
|
|
struct mailmessage_tree * node_parent;
|
|
char * node_msgid;
|
|
time_t node_date;
|
|
mailmessage * node_msg;
|
|
carray * node_children; /* array of (struct mailmessage_tree *) */
|
|
|
|
/* private, used for threading */
|
|
int node_is_reply;
|
|
char * node_base_subject;
|
|
};
|
|
|
|
|
|
struct mailmessage_tree *
|
|
mailmessage_tree_new(char * node_msgid, time_t node_date,
|
|
mailmessage * node_msg);
|
|
|
|
void mailmessage_tree_free(struct mailmessage_tree * tree);
|
|
|
|
void mailmessage_tree_free_recursive(struct mailmessage_tree * tree);
|
|
</PRE
|
|
><P
|
|
> This is a node of a tree of messages.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_parent</B
|
|
> is the parent of this
|
|
node.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_msgid</B
|
|
> is the content of the
|
|
field <B
|
|
CLASS="COMMAND"
|
|
>Message-ID</B
|
|
> of the message.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_date</B
|
|
> is the date in UNIX
|
|
format.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_msg</B
|
|
> is the message of the node.
|
|
The message should have the <B
|
|
CLASS="COMMAND"
|
|
>msg_fields</B
|
|
>
|
|
field initialized.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_children</B
|
|
> is the list of
|
|
children of this node.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_is_reply</B
|
|
> is set to 1 if the
|
|
message is a reply.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>node_base_subject</B
|
|
> is the base subject
|
|
of the message (base subject is defined in definition of
|
|
IMAP thread draft).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_tree_new()</B
|
|
> will initialize a
|
|
message node.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_tree_free()</B
|
|
> will release
|
|
memory used by the node. This will <SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>NOT</I
|
|
></SPAN
|
|
>
|
|
free the message.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAIL-FLAGS"
|
|
>Message flags</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
enum {
|
|
MAIL_FLAG_NEW = 1 << 0,
|
|
MAIL_FLAG_SEEN = 1 << 1,
|
|
MAIL_FLAG_FLAGGED = 1 << 2,
|
|
MAIL_FLAG_DELETED = 1 << 3,
|
|
MAIL_FLAG_ANSWERED = 1 << 4,
|
|
MAIL_FLAG_FORWARDED = 1 << 5,
|
|
MAIL_FLAG_CANCELLED = 1 << 6,
|
|
};
|
|
|
|
struct mail_flags {
|
|
uint32_t fl_flags;
|
|
clist * fl_extension; /* elements are (char *) */
|
|
};
|
|
|
|
struct mail_flags * mail_flags_new(uint32_t fl_flags, clist * fl_ext);
|
|
|
|
void mail_flags_free(struct mail_flags * flags);
|
|
|
|
int mail_flags_add_extension(struct mail_flags * flags,
|
|
char * ext_flag);
|
|
|
|
int mail_flags_remove_extension(struct mail_flags * flags,
|
|
char * ext_flag);
|
|
|
|
int mail_flags_has_extension(struct mail_flags * flags,
|
|
char * ext_flag);
|
|
</PRE
|
|
><P
|
|
> This is the structure containing the message flags.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fl_flags</B
|
|
> will contain the standards
|
|
flags. The value will be a combinaison (with or binary
|
|
operation) of <B
|
|
CLASS="COMMAND"
|
|
>MAIL_FLAG_XXX</B
|
|
> values.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>fl_extension</B
|
|
> will be a list (see
|
|
<A
|
|
HREF="#CLIST"
|
|
>the Section called <I
|
|
>List</I
|
|
> in Chapter 2</A
|
|
>) of strings representing the
|
|
non-standard flags.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3467"
|
|
>Example</A
|
|
></H3
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN3469"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 5-3. use of message</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define DEST_CHARSET "iso-8859-1"
|
|
|
|
enum {
|
|
NO_ERROR,
|
|
ERROR_FILE,
|
|
ERROR_MEMORY,
|
|
ERROR_INVAL,
|
|
ERROR_FETCH,
|
|
};
|
|
|
|
/* returns TRUE is given MIME part is a text part */
|
|
|
|
int etpan_mime_is_text(struct mailmime * build_info)
|
|
{
|
|
if (build_info->mm_type == MAILMIME_SINGLE) {
|
|
if (build_info->mm_content_type != NULL) {
|
|
if (build_info->mm_content_type->ct_type->tp_type ==
|
|
MAILMIME_TYPE_DISCRETE_TYPE) {
|
|
if (build_info->mm_content_type->ct_type->tp_data.tp_discrete_type->dt_type ==
|
|
MAILMIME_DISCRETE_TYPE_TEXT)
|
|
return 1;
|
|
}
|
|
}
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/* display content type */
|
|
|
|
int show_part_info(FILE * f,
|
|
struct mailmime_single_fields * mime_fields,
|
|
struct mailmime_content * content)
|
|
{
|
|
char * description;
|
|
char * filename;
|
|
int col;
|
|
int r;
|
|
|
|
description = mime_fields->fld_description;
|
|
filename = mime_fields->fld_disposition_filename;
|
|
|
|
col = 0;
|
|
|
|
r = fprintf(f, " [ Part ");
|
|
if (r < 0)
|
|
goto err;
|
|
|
|
if (content != NULL) {
|
|
r = mailmime_content_type_write(f, &col, content);
|
|
if (r != MAILIMF_NO_ERROR)
|
|
goto err;
|
|
}
|
|
|
|
if (filename != NULL) {
|
|
r = fprintf(f, " (%s)", filename);
|
|
if (r < 0)
|
|
goto err;
|
|
}
|
|
|
|
if (description != NULL) {
|
|
r = fprintf(f, " : %s", description);
|
|
if (r < 0)
|
|
goto err;
|
|
}
|
|
|
|
r = fprintf(f, " ]\n\n");
|
|
if (r < 0)
|
|
goto err;
|
|
|
|
return NO_ERROR;
|
|
|
|
err:
|
|
return ERROR_FILE;
|
|
}
|
|
|
|
/* fetch message and decode if it is base64 or quoted-printable */
|
|
|
|
int etpan_fetch_message(mailmessage * msg_info,
|
|
struct mailmime * mime_part,
|
|
struct mailmime_single_fields * fields,
|
|
char ** result, size_t * result_len)
|
|
{
|
|
char * data;
|
|
size_t len;
|
|
int r;
|
|
int encoding;
|
|
char * decoded;
|
|
size_t decoded_len;
|
|
size_t cur_token;
|
|
int res;
|
|
int encoded;
|
|
|
|
encoded = 0;
|
|
|
|
r = mailmessage_fetch_section(msg_info,
|
|
mime_part, &data, &len);
|
|
if (r != MAIL_NO_ERROR) {
|
|
res = ERROR_FETCH;
|
|
goto err;
|
|
}
|
|
|
|
encoded = 1;
|
|
|
|
/* decode message */
|
|
|
|
if (encoded) {
|
|
if (fields->fld_encoding != NULL)
|
|
encoding = fields->fld_encoding->enc_type;
|
|
else
|
|
encoding = MAILMIME_MECHANISM_8BIT;
|
|
}
|
|
else {
|
|
encoding = MAILMIME_MECHANISM_8BIT;
|
|
}
|
|
|
|
cur_token = 0;
|
|
r = mailmime_part_parse(data, len, &cur_token,
|
|
encoding, &decoded, &decoded_len);
|
|
if (r != MAILIMF_NO_ERROR) {
|
|
res = ERROR_FETCH;
|
|
goto free;
|
|
}
|
|
|
|
mailmessage_fetch_result_free(msg_info, data);
|
|
|
|
* result = decoded;
|
|
* result_len = decoded_len;
|
|
|
|
return NO_ERROR;
|
|
|
|
free:
|
|
mailmessage_fetch_result_free(msg_info, data);
|
|
err:
|
|
return res;
|
|
}
|
|
|
|
/* fetch fields */
|
|
|
|
struct mailimf_fields * fetch_fields(mailmessage * msg_info,
|
|
struct mailmime * mime)
|
|
{
|
|
char * data;
|
|
size_t len;
|
|
int r;
|
|
size_t cur_token;
|
|
struct mailimf_fields * fields;
|
|
|
|
r = mailmessage_fetch_section_header(msg_info, mime,
|
|
&data, &len);
|
|
if (r != MAIL_NO_ERROR)
|
|
return NULL;
|
|
|
|
cur_token = 0;
|
|
r = mailimf_envelopes_fields_parse(data, len,
|
|
&cur_token, &fields);
|
|
if (r != MAILIMF_NO_ERROR) {
|
|
mailmessage_fetch_result_free(msg_info, data);
|
|
return NULL;
|
|
}
|
|
|
|
mailmessage_fetch_result_free(msg_info, data);
|
|
|
|
return fields;
|
|
}
|
|
|
|
/* render message */
|
|
|
|
static int etpan_render_mime(FILE * f, mailmessage * msg_info,
|
|
struct mailmime * mime)
|
|
{
|
|
int r;
|
|
clistiter * cur;
|
|
int col;
|
|
int text;
|
|
int show;
|
|
struct mailmime_single_fields fields;
|
|
int res;
|
|
|
|
mailmime_single_fields_init(&fields, mime->mm_mime_fields,
|
|
mime->mm_content_type);
|
|
|
|
text = etpan_mime_is_text(mime);
|
|
|
|
r = show_part_info(f, &fields, mime->mm_content_type);
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
|
|
switch(mime->mm_type) {
|
|
case MAILMIME_SINGLE:
|
|
show = 0;
|
|
if (text)
|
|
show = 1;
|
|
|
|
if (show) {
|
|
char * data;
|
|
size_t len;
|
|
char * converted;
|
|
size_t converted_len;
|
|
char * source_charset;
|
|
size_t write_len;
|
|
|
|
/* viewable part */
|
|
|
|
r = etpan_fetch_message(msg_info, mime,
|
|
&fields, &data, &len);
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
|
|
source_charset = fields.fld_content_charset;
|
|
if (source_charset == NULL)
|
|
source_charset = DEST_CHARSET;
|
|
|
|
r = charconv_buffer(source_charset, DEST_CHARSET,
|
|
data, len, &converted, &converted_len);
|
|
if (r != MAIL_CHARCONV_NO_ERROR) {
|
|
|
|
r = fprintf(f, "[ error converting charset from %s to %s ]\n",
|
|
source_charset, DEST_CHARSET);
|
|
if (r < 0) {
|
|
res = ERROR_FILE;
|
|
goto err;
|
|
}
|
|
|
|
write_len = fwrite(data, 1, len, f);
|
|
if (write_len != len) {
|
|
mailmime_decoded_part_free(data);
|
|
res = r;
|
|
goto err;
|
|
}
|
|
}
|
|
else {
|
|
write_len = fwrite(converted, 1, converted_len, f);
|
|
if (write_len != len) {
|
|
charconv_buffer_free(converted);
|
|
mailmime_decoded_part_free(data);
|
|
res = r;
|
|
goto err;
|
|
}
|
|
|
|
charconv_buffer_free(converted);
|
|
}
|
|
|
|
write_len = fwrite("\r\n\r\n", 1, 4, f);
|
|
if (write_len < 4) {
|
|
mailmime_decoded_part_free(data);
|
|
res = ERROR_FILE;
|
|
goto err;
|
|
}
|
|
|
|
mailmime_decoded_part_free(data);
|
|
}
|
|
else {
|
|
/* not viewable part */
|
|
|
|
r = fprintf(f, " (not shown)\n\n");
|
|
if (r < 0) {
|
|
res = ERROR_FILE;
|
|
goto err;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case MAILMIME_MULTIPLE:
|
|
|
|
if (strcasecmp(mime->mm_content_type->ct_subtype,
|
|
"alternative") == 0) {
|
|
struct mailmime * prefered_body;
|
|
int prefered_score;
|
|
|
|
/* case of multiple/alternative */
|
|
|
|
/*
|
|
we choose the better part,
|
|
alternative preference :
|
|
|
|
text/plain => score 3
|
|
text/xxx => score 2
|
|
other => score 1
|
|
*/
|
|
|
|
prefered_body = NULL;
|
|
prefered_score = 0;
|
|
|
|
for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ;
|
|
cur != NULL ; cur = clist_next(cur)) {
|
|
struct mailmime * submime;
|
|
int score;
|
|
|
|
score = 1;
|
|
submime = clist_content(cur);
|
|
if (etpan_mime_is_text(submime))
|
|
score = 2;
|
|
|
|
if (submime->mm_content_type != NULL) {
|
|
if (strcasecmp(submime->mm_content_type->ct_subtype,
|
|
"plain") == 0)
|
|
score = 3;
|
|
}
|
|
|
|
if (score > prefered_score) {
|
|
prefered_score = score;
|
|
prefered_body = submime;
|
|
}
|
|
}
|
|
|
|
if (prefered_body != NULL) {
|
|
r = etpan_render_mime(f, msg_info, prefered_body);
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ;
|
|
cur != NULL ; cur = clist_next(cur)) {
|
|
|
|
r = etpan_render_mime(f, msg_info, clist_content(cur));
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case MAILMIME_MESSAGE:
|
|
|
|
if (mime->mm_data.mm_message.mm_fields != NULL) {
|
|
struct mailimf_fields * fields;
|
|
|
|
if (msg_info != NULL) {
|
|
fields = fetch_fields(msg_info, mime);
|
|
if (fields == NULL) {
|
|
res = ERROR_FETCH;
|
|
goto err;
|
|
}
|
|
|
|
col = 0;
|
|
r = mailimf_fields_write(f, &col, fields);
|
|
if (r != NO_ERROR) {
|
|
mailimf_fields_free(fields);
|
|
res = r;
|
|
goto err;
|
|
}
|
|
|
|
mailimf_fields_free(fields);
|
|
}
|
|
else {
|
|
col = 0;
|
|
r = fields_write(f, &col, mime->mm_data.mm_message.mm_fields);
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
}
|
|
|
|
r = fprintf(f, "\r\n");
|
|
if (r < 0) {
|
|
res = ERROR_FILE;
|
|
goto err;
|
|
}
|
|
}
|
|
|
|
if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
|
|
r = etpan_render_mime(f, msg_info,
|
|
mime->mm_data.mm_message.mm_msg_mime);
|
|
if (r != NO_ERROR) {
|
|
res = r;
|
|
goto err;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return NO_ERROR;
|
|
|
|
err:
|
|
return res;
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
{
|
|
struct mailstorage * storage;
|
|
int r;
|
|
|
|
storage = mailstorage_new(NULL);
|
|
|
|
imap_mailstorage_init(storage, "imap.my-servers.org", 0,
|
|
NULL, CONNECTION_TYPE_TRY_STARTTLS, IMAP_AUTH_TYPE_PLAIN,
|
|
"my-login", "my-password", 1, "/home/login/.libetpan/cache");
|
|
|
|
r = mailstorage_connect(storage);
|
|
if (r == MAIL_NO_ERROR) {
|
|
struct mailfolder * folder;
|
|
|
|
folder = mailfolder_new(storage, "INBOX", NULL);
|
|
|
|
r = mailfolder_connect(folder);
|
|
if (r == MAIL_NO_ERROR) {
|
|
struct mailmessage_list * msg_list;
|
|
mailmessage * msg;
|
|
|
|
mailfolder_get_messages_list(folder, &msg_list);
|
|
|
|
if (carray_count(msg_list->msg_tab) > 0) {
|
|
struct mailmime * mime;
|
|
|
|
msg = carray_get(msg_list->msg_tab, 0);
|
|
|
|
mailmessage_get_bodystructure(msg, &mime);
|
|
|
|
recursive_fetch(msg, mime);
|
|
|
|
/* do the things */
|
|
|
|
mailmessage_flush(msg);
|
|
}
|
|
mailmessage_list_free(msg_list);
|
|
|
|
mailfolder_disconnect(folder);
|
|
}
|
|
|
|
mailstorage_disconnect(storage);
|
|
}
|
|
|
|
mailstorage_free(storage);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><HR><H2
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN3472"
|
|
>Session</A
|
|
></H2
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSESSION-DRIVER"
|
|
>Session driver</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailsession_driver {
|
|
char * sess_name;
|
|
|
|
int (* sess_initialize)(mailsession * session);
|
|
void (* sess_uninitialize)(mailsession * session);
|
|
|
|
int (* sess_parameters)(mailsession * session,
|
|
int id, void * value);
|
|
|
|
int (* sess_connect_stream)(mailsession * session, mailstream * s);
|
|
int (* sess_connect_path)(mailsession * session, char * path);
|
|
|
|
int (* sess_starttls)(mailsession * session);
|
|
|
|
int (* sess_login)(mailsession * session, char * userid, char * password);
|
|
int (* sess_logout)(mailsession * session);
|
|
int (* sess_noop)(mailsession * session);
|
|
|
|
/* folders operations */
|
|
|
|
int (* sess_build_folder_name)(mailsession * session, char * mb,
|
|
char * name, char ** result);
|
|
|
|
int (* sess_create_folder)(mailsession * session, char * mb);
|
|
int (* sess_delete_folder)(mailsession * session, char * mb);
|
|
int (* sess_rename_folder)(mailsession * session, char * mb,
|
|
char * new_name);
|
|
int (* sess_check_folder)(mailsession * session);
|
|
int (* sess_examine_folder)(mailsession * session, char * mb);
|
|
int (* sess_select_folder)(mailsession * session, char * mb);
|
|
int (* sess_expunge_folder)(mailsession * session);
|
|
int (* sess_status_folder)(mailsession * session, char * mb,
|
|
uint32_t * result_num, uint32_t * result_recent,
|
|
uint32_t * result_unseen);
|
|
int (* sess_messages_number)(mailsession * session, char * mb,
|
|
uint32_t * result);
|
|
int (* sess_recent_number)(mailsession * session, char * mb,
|
|
uint32_t * result);
|
|
int (* sess_unseen_number)(mailsession * session, char * mb,
|
|
uint32_t * result);
|
|
|
|
int (* sess_list_folders)(mailsession * session, char * mb,
|
|
struct mail_list ** result);
|
|
int (* sess_lsub_folders)(mailsession * session, char * mb,
|
|
struct mail_list ** result);
|
|
|
|
int (* sess_subscribe_folder)(mailsession * session, char * mb);
|
|
int (* sess_unsubscribe_folder)(mailsession * session, char * mb);
|
|
|
|
/* messages operations */
|
|
|
|
int (* sess_append_message)(mailsession * session,
|
|
char * message, size_t size);
|
|
int (* sess_copy_message)(mailsession * session,
|
|
uint32_t num, char * mb);
|
|
int (* sess_move_message)(mailsession * session,
|
|
uint32_t num, char * mb);
|
|
|
|
int (* sess_get_message)(mailsession * session,
|
|
uint32_t num, mailmessage ** result);
|
|
|
|
int (* sess_get_message_by_uid)(mailsession * session,
|
|
const char * uid, mailmessage ** result);
|
|
|
|
int (* sess_get_messages_list)(mailsession * session,
|
|
struct mailmessage_list ** result);
|
|
int (* sess_get_envelopes_list)(mailsession * session,
|
|
struct mailmessage_list * env_list);
|
|
int (* sess_remove_message)(mailsession * session, uint32_t num);
|
|
};
|
|
</PRE
|
|
><P
|
|
> This is a driver for a session.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_name</B
|
|
> is the name of the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_initialize()</B
|
|
> is the function
|
|
that will initializes a data structure (field
|
|
<B
|
|
CLASS="COMMAND"
|
|
>sess_data</B
|
|
> in the session) specific to
|
|
the driver.
|
|
The field data (field <B
|
|
CLASS="COMMAND"
|
|
>sess_data</B
|
|
> in
|
|
the session) is the state of the session,
|
|
the internal data structure used by the driver.
|
|
It is called when creating the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailsession</B
|
|
> structure with
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailsession_new()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_uninitialize()</B
|
|
> frees the structure
|
|
created with <B
|
|
CLASS="COMMAND"
|
|
>sess_initialize()</B
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_parameters()</B
|
|
> implements
|
|
functions specific to the given mail access.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_connect_stream()</B
|
|
> connects a
|
|
stream to the session.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_connect_path()</B
|
|
> notify a main
|
|
path to the session.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_starttls()</B
|
|
> changes the current
|
|
stream to a TLS stream
|
|
(see <A
|
|
HREF="#MAILSTREAM-SSL"
|
|
>the Section called <I
|
|
>TLS stream</I
|
|
> in Chapter 2</A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_login()</B
|
|
> notifies the user and
|
|
the password to authenticate to the session.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_logout()</B
|
|
> exits the session and
|
|
closes the stream.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_noop()</B
|
|
> does no operation on the
|
|
session, but it can be used to poll for the status of
|
|
the connection.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_build_folder_name()</B
|
|
> will return an
|
|
allocated string with that contains the complete path of
|
|
the folder to create.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_create_folder()</B
|
|
> creates the
|
|
folder that corresponds to the given name.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_delete_folder()</B
|
|
> deletes the folder
|
|
that corresponds to the given name.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_rename_folder()</B
|
|
> change the name
|
|
of the folder.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_check_folder()</B
|
|
> makes a
|
|
checkpoint of the session.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_examine_folder()</B
|
|
> selects a mailbox as
|
|
readonly.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_select_folder()</B
|
|
> selects a mailbox.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_expunge_folder()</B
|
|
> deletes all
|
|
messages marked \Deleted.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_status_folder()</B
|
|
> queries the
|
|
status of the folder (number of messages, number of
|
|
recent messages, number of unseen messages).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_messages_number()</B
|
|
> queries the
|
|
number of messages in the folder.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_recent_number()</B
|
|
> queries the
|
|
number of recent messages in the folder.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_unseen_number()</B
|
|
> queries the number of
|
|
unseen messages in the folder.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_list_folders()</B
|
|
> returns the list of
|
|
all sub-mailboxes of the given mailbox.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_lsub_folders()</B
|
|
> returns the list of
|
|
subscribed sub-mailboxes of the given mailbox.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_subscribe_folder()</B
|
|
> subscribes to
|
|
the given mailbox.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_unsubscribe_folder()</B
|
|
> unsubscribes to
|
|
the given mailbox.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_append_message()</B
|
|
> adds a RFC 2822
|
|
message to the current given mailbox.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_copy_message()</B
|
|
> copies a message
|
|
whose number is given to a given mailbox. The mailbox
|
|
must be accessible from the same session.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_move_message()</B
|
|
> moves a message whose
|
|
number is given to
|
|
a given mailbox. The mailbox must be accessible from the
|
|
same session.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_messages_list()</B
|
|
> returns the list
|
|
of message numbers
|
|
of the current mailbox
|
|
(see <A
|
|
HREF="#MAILMESSAGE-LIST"
|
|
>the Section called <I
|
|
>Message list</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_envelopes_list()</B
|
|
> fills the parsed
|
|
fields in the <B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structures
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>)
|
|
of the <B
|
|
CLASS="COMMAND"
|
|
>mailmessage_list</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMESSAGE-LIST"
|
|
>the Section called <I
|
|
>Message list</I
|
|
></A
|
|
>).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_remove_message()</B
|
|
> removes the given
|
|
message from the mailbox.
|
|
The message is permanently deleted.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_message()</B
|
|
> returns a
|
|
mailmessage structure
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>)
|
|
that corresponds
|
|
to the given message number.
|
|
<SPAN
|
|
CLASS="emphasis"
|
|
><I
|
|
CLASS="EMPHASIS"
|
|
>Use of this method is deprecated</I
|
|
></SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_message_by_uid()</B
|
|
> returns a
|
|
mailmessage structure
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>)
|
|
that corresponds
|
|
to the given message unique identifier.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> mandatory functions are the following :
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_connect_stream()</B
|
|
> or
|
|
<B
|
|
CLASS="COMMAND"
|
|
>connect_path()</B
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_logout()</B
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_messages_list()</B
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_envelopes_list()</B
|
|
>
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> we advise you to implement these functions :
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_select_folder()</B
|
|
> (in case a session
|
|
can access several folders).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_noop()</B
|
|
> (to check if the server is
|
|
responding)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_check_folder()</B
|
|
> (to make a checkpoint
|
|
of the session)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_status_folder()</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>sess_messages_number()</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>sess_recent_number()</B
|
|
>,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>sess_unseen_number()</B
|
|
>
|
|
(to get stat of the folder)
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_append_message()</B
|
|
> (but can't be done
|
|
in the case of POP3 at least).
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_login()</B
|
|
> in a case of an
|
|
authenticated driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_starttls()</B
|
|
> in a case of a stream
|
|
driver, if the procotol supports STARTTLS.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_get_message_by_uid()</B
|
|
> so that the
|
|
application can remember the messages
|
|
by UID and build its own list of messages.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> Everything that is specific to the driver will be
|
|
implemented in <B
|
|
CLASS="COMMAND"
|
|
>sess_parameters()</B
|
|
>.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="MAILSESSION"
|
|
>Session</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
struct mailsession {
|
|
void * sess_data;
|
|
mailsession_driver * sess_driver;
|
|
};
|
|
|
|
mailsession * mailsession_new(mailsession_driver * sess_driver);
|
|
|
|
void mailsession_free(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This is a session. This is an abstraction used to access the
|
|
storage, using the network or the filesystem.
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_data</B
|
|
> is the state of the
|
|
session. This is specific to the driver.
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>sess_driver</B
|
|
> is the driver of the
|
|
session.
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailsession_new()</B
|
|
> will create a new session
|
|
using the given driver (<B
|
|
CLASS="COMMAND"
|
|
>sess_driver</B
|
|
>).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailsession_free()</B
|
|
> will release the memory
|
|
used by the session.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3670"
|
|
>mailsession_parameters</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_parameters(mailsession * session,
|
|
int id, void * value);
|
|
</PRE
|
|
><P
|
|
> This function make calls specific to the driver
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3674"
|
|
>mailsession_connect_stream</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_connect_stream(mailsession * session, mailstream * s);
|
|
</PRE
|
|
><P
|
|
> There are drivers of two kinds : stream drivers (driver that
|
|
connects to servers through TCP or other means of connection)
|
|
and file drivers (driver that are based on filesystem)
|
|
|
|
This function can only be used by stream drivers and
|
|
this connects a stream to the session
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3678"
|
|
>mailsession_connect_path</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_connect_path(mailsession * session, char * path);
|
|
</PRE
|
|
><P
|
|
> This function can only be used by file drivers and
|
|
selects the main path of the session.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3682"
|
|
>mailsession_starttls</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_starttls(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This switches the current connection to TLS (secure layer).
|
|
This will only work with stream drivers.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3686"
|
|
>mailsession_login</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_login(mailsession * session,
|
|
char * userid, char * password);
|
|
</PRE
|
|
><P
|
|
> This notifies the login and the password to authenticate
|
|
to the session.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3690"
|
|
>mailsession_logout</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_logout(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This function disconnects the session and closes the stream.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3694"
|
|
>mailsession_noop</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_noop(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This function does no operation on the session, but it can be
|
|
used to poll for the status of the connection.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3698"
|
|
>mailsession_check_folder</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_check_folder(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This function makes a checkpoint of the session.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3702"
|
|
>mailsession_select_folder</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_select_folder(mailsession * session, char * mb);
|
|
</PRE
|
|
><P
|
|
> This function selects a mailbox.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3706"
|
|
>mailsession_expunge_folder</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_expunge_folder(mailsession * session);
|
|
</PRE
|
|
><P
|
|
> This function deletes all messages marked for deletion.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3710"
|
|
>mailsession_status_folder</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_status_folder(mailsession * session, char * mb,
|
|
uint32_t * result_messages, uint32_t * result_recent,
|
|
uint32_t * result_unseen);
|
|
</PRE
|
|
><P
|
|
> This function queries the status of the folder
|
|
(number of messages, number of recent messages, number of
|
|
unseen messages).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3714"
|
|
>mailsession_messages_number</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_messages_number(mailsession * session, char * mb,
|
|
uint32_t * result);
|
|
</PRE
|
|
><P
|
|
> This function queries the number of messages in the folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3718"
|
|
>mailsession_recent_number</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_recent_number(mailsession * session,
|
|
char * mb, uint32_t * result);
|
|
</PRE
|
|
><P
|
|
> This function queries the number of recent messages in the
|
|
folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3722"
|
|
>mailsession_unseen_number</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_unseen_number(mailsession * session, char * mb,
|
|
uint32_t * result);
|
|
</PRE
|
|
><P
|
|
> This function queries the number of unseen messages in the
|
|
folder.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3726"
|
|
>mailsession_append_message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_append_message(mailsession * session,
|
|
char * message, size_t size);
|
|
</PRE
|
|
><P
|
|
> This adds a RFC 2822 message to the current mailbox.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3730"
|
|
>mailsession_get_messages_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_get_messages_list(mailsession * session,
|
|
struct mailmessage_list ** result);
|
|
</PRE
|
|
><P
|
|
> This function returns the list of messages
|
|
of the current mailbox.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3734"
|
|
>mailsession_get_envelopes_list</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_get_envelopes_list(mailsession * session,
|
|
struct mailmessage_list * result);
|
|
</PRE
|
|
><P
|
|
> This function fills the parsed fields in the
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
> structures
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>)
|
|
of the mailmessage_list
|
|
(see <A
|
|
HREF="#MAILMESSAGE-LIST"
|
|
>the Section called <I
|
|
>Message list</I
|
|
></A
|
|
>).
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3741"
|
|
>mailsession_get_message</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_get_message(mailsession * session,
|
|
uint32_t num, mailmessage ** result);
|
|
</PRE
|
|
><P
|
|
> This function returns a <B
|
|
CLASS="COMMAND"
|
|
>mailmessage</B
|
|
>
|
|
(see <A
|
|
HREF="#MAILMESSAGE"
|
|
>the Section called <I
|
|
>Message</I
|
|
></A
|
|
>) structure that
|
|
corresponds to the given message number.
|
|
</P
|
|
><DIV
|
|
CLASS="WARNING"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="WARNING"
|
|
BORDER="1"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
ALIGN="CENTER"
|
|
><B
|
|
>Warning</B
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>mailsession_get_message_by_uid()</B
|
|
> should
|
|
be used instead.
|
|
</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><HR><H3
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="AEN3750"
|
|
>mailsession_get_message_by_uid</A
|
|
></H3
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
int mailsession_get_message_by_uid(mailsession * session,
|
|
const char * uid, mailmessage ** result);
|
|
</PRE
|
|
><P
|
|
> This function returns a mailmessage structure
|
|
that corresponds to the given message unique identifier.
|
|
This is currently implemented only for cached drivers.
|
|
</P
|
|
><DIV
|
|
CLASS="WARNING"
|
|
><P
|
|
></P
|
|
><TABLE
|
|
CLASS="WARNING"
|
|
BORDER="1"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
ALIGN="CENTER"
|
|
><B
|
|
>Warning</B
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
ALIGN="LEFT"
|
|
><P
|
|
> That deprecates the use of
|
|
<B
|
|
CLASS="COMMAND"
|
|
>mailsession_get_message()</B
|
|
>.
|
|
</P
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |