Next: , Previous: Libraries, Up: Libraries



3.1 Framework

Wherever the mail is and whatever format it is stored in, it is operated upon using the same set of functions. To unified the C API, gnu Mailutils offers a heteroclite set of objects that work in aggregation to do operations on emails. Each object does a specific task and delegates non-related tasks to others. The object comes alive by specifying a URL parameter when created, it will indicate the storage format or protocol (POP3, IMAP4, MH, MAILDIR, etc ..).

                               folder_t                  url_t
       -/var/mail-    +- .. ->+-----------------+   +-->+------------+
      (  alain *-)-+  |       |   url_t       *-|---+   |   port     |
       ----------  |  |       |-----------------|       |   hostname |
      (  jakob *-)-+--+       |   auth_t      *-|---+   |   file     |
       ----------  |          |-----------------|   |   |   ...      |
      (  jeff  *-)-+          |   stream_t      |   |   +------------+
       ----------  |          |-----------------|   |
      (  shaleh*-)-+          |   .....         |   |    auth_t
       ----------             |-----------------|   +-->+------------+
                          +---|-* mailbox_t[]   |       |   ticket_t |
       mailbox_t          |   +-----------------+       +------------+
      +----------------+<-+
      |   locker_t  *--|-------------+
      |----------------|             |
      |   url_t        |             |          locker_t
      |----------------|             +-------->+---------+
      |   stream_t     |                       | lock    |
      |----------------|                       | unlock  |
      |  message_t[] *-|-------+               +---------+
      +----------------+       |                     envelope_t
                               |          +-------->+-----------+
       message_t               |          |         | date      |
      +----------------+<------+          |         | from      |
      |   envelope_t *-|------------------+         | to        |
      |----------------|              header_t      +-----------+
      |   header_t   *-|------------>+--------------+
      |----------------|             |   stream_t   |
      |   body_t     *-|----+        +--------------+
      +----------------+    |    body_t
                            +-->+--------------+
                                |   stream_t   |
                                +--------------+

As an example, here is a simplified version of from command. It lists the From and Subject headers of every mail in a mailbox.

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     #include <unistd.h>
     
     #include <mailutils/mailutils.h>
     
     int
     main (int argc, const char **argv)
     {
       char *from;
       char *subject;
       mailbox_t mbox;
       size_t msgno, total = 0;
       int status;
     
       /* Register the formats. */
       mu_register_all_mbox_formats ();
     
       status = mailbox_create_default (&mbox, argv[1]);
       if (status != 0)
         {
           mu_error ("mailbox_create: %s", mu_strerror (status));
           exit (EXIT_FAILURE);
         }
     
       status = mailbox_open (mbox, MU_STREAM_READ);
       if (status != 0)
         {
           mu_error ("mailbox_open: %s", mu_strerror (status));
           exit (EXIT_FAILURE);
         }
     
       mailbox_messages_count (mbox, &total);
     
       for (msgno = 1; msgno <= total; msgno++)
         {
           message_t msg;
           header_t hdr;
     
           if ((status = mailbox_get_message (mbox, msgno, &msg)) != 0
               || (status = message_get_header (msg, &hdr)) != 0)
             {
               mu_error ("Error message: %s", mu_strerror (status));
               exit (EXIT_FAILURE);
             }
     
           if (header_aget_value (hdr, MU_HEADER_FROM, &from))
             from = strdup ("(NO FROM)");
     
           if (header_aget_value (hdr, MU_HEADER_SUBJECT, &subject))
             subject = strdup ("(NO SUBJECT)");
     
           printf ("%s\t%s\n", from, subject);
           free (from);
           free (subject);
         }
     
       status = mailbox_close (mbox);
       if (status != 0)
         {
           mu_error ("mailbox_close: %s", mu_strerror (status));
           exit (EXIT_FAILURE);
         }
     
       mailbox_destroy (&mbox);
       return 0;
     }

Here is a sample output produced by this program:

     

% ./sfrom pop://alain@localhost Passwd: xxxx Jim Meyering <meyering@foo.org> fetish(shellutils) beta François Pinard <pinard@bar.org> recode new alpha ...