Go to the first, previous, next, last section, table of contents.


Framework

Wherever the mail is and whatever format it is stored in, the same operations to manipulate emails are common. To unified the C API, GNU mailutils offers a heteroclite set of objects that work in aggregation to do operations on emails. Each object do 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   |
                           +--------------+

For example writing a simple from command that will list the From and Subject headers of every mail in a mailbox.

/* sfrom, Simple From */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mailutils/registrar.h>
#include <mailutils/list.h>
#include <mailutils/mailbox.h>

#define BUFFER_SIZE 64
int
main (int argc, const char **argv)
{
   char from[BUFFER_SIZE];
   char subject[BUFFER_SIZE];
   char *mail;
   mailbox_t mbox;
   int status
   size_t msgno, total = 0;

   mail = (argc == 2) ? argv[1] : getenv ("MAIL");

   /* Register the type of mailbox. IMAP4, POP3 and local format  */
   {
       list_t registrar;
       registrar_get_list (&registrar);
       list_append (registrar, imap_record);
       list_append (registrar, path_record);
       list_append (registrar, pop_record);
   }

   status = mailbox_create (&mbox, mail);
   if (status != 0)
     {
        fprintf (stderr, "mailbox_create: %s\n", strerror (status));
        exit (EXIT_FAILURE);
     }

   status = mailbox_open (mbox, MU_STREAM_READ);
   if (status != 0)
     {
        fprintf (stderr, "mailbox_open: %s\n", 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)
           {
               fprintf (stderr, "Error message:%s\n",
                        strerror (status));
               exit (EXIT_FAILURE);
           }

         status = header_get_value (hdr, MU_HEADER_FROM, from,
                                    sizeof (from), NULL);
         if (status != 0)
            strcpy (from, "(NO FROM)");

         status = header_get_value (hdr, MU_HEADER_SUBJECT, subject,
                                    sizeof (subject), NULL);
         if (status != 0)
            strcpy (subject, "(NO SUBJECT)");

         printf ("%s\t%s\n", from, subject);
      }

    mailbox_close (mbox);
    mailbox_destroy (&mbox);
    return 0;
}
% MAIL=pop://alain@localhost ./sfrom
Passwd: xxxx
Jim Meyering <meyering@foo.org>      fetish(shellutils) beta
Fran@,{c}ois Pinard <pinard@bar.org> recode new alpha
...


Go to the first, previous, next, last section, table of contents.