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 ..).
mu_folder_t mu_url_t -/var/mail- +- .. ->+-------------------+ +-->+------------+ ( alain *-)-+ | | mu_url_t *-|---+ | port | ---------- | | |-------------------| | hostname | ( jakob *-)-+--+ | mu_auth_t *-|---+ | file | ---------- | |-------------------| | | ... | ( jeff *-)-+ | mu_stream_t | | +------------+ ---------- | |-------------------| | ( shaleh*-)-+ | ..... | | mu_auth_t ---------- |-------------------| +-->+-------------+ +---|-* mu_mailbox_t[] | | mu_ticket_t | mu_mailbox_t | +-------------------+ +-------------+ +-------------------+ | mu_locker_t *--|-------------+ |-------------------| | | mu_url_t | | mu_locker_t |-------------------| +-------->+---------+ | mu_stream_t | | lock | |-------------------| | unlock | | mu_message_t[] *-|-------+ +---------+ +-------------------+ | mu_envelope_t | +-------->+-----------+ mu_message_t | | | date | +-------------------+<------+ | | from | | mu_envelope_t *-|------------------+ | to | |-------------------| mu_header_t +-----------+ | mu_header_t *-|------------>+-----------------+ |-------------------| | mu_stream_t | | mu_body_t *-|----+ +-----------------+ +-------------------+ | mu_body_t +-->+-----------------+ | mu_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; mu_mailbox_t mbox; size_t msgno, total = 0; int status; /* Register the formats. */ mu_register_all_mbox_formats (); status = mu_mailbox_create_default (&mbox, argv[1]); if (status != 0) { mu_error ("mu_mailbox_create: %s", mu_strerror (status)); exit (EXIT_FAILURE); } status = mu_mailbox_open (mbox, MU_STREAM_READ); if (status != 0) { mu_error ("mu_mailbox_open: %s", mu_strerror (status)); exit (EXIT_FAILURE); } mu_mailbox_messages_count (mbox, &total); for (msgno = 1; msgno <= total; msgno++) { mu_message_t msg; mu_header_t hdr; if ((status = mu_mailbox_get_message (mbox, msgno, &msg)) != 0 || (status = mu_message_get_header (msg, &hdr)) != 0) { mu_error ("Error message: %s", mu_strerror (status)); exit (EXIT_FAILURE); } if (mu_header_aget_value (hdr, MU_HEADER_FROM, &from)) from = strdup ("(NO FROM)"); if (mu_header_aget_value (hdr, MU_HEADER_SUBJECT, &subject)) subject = strdup ("(NO SUBJECT)"); printf ("%s\t%s\n", from, subject); free (from); free (subject); } status = mu_mailbox_close (mbox); if (status != 0) { mu_error ("mu_mailbox_close: %s", mu_strerror (status)); exit (EXIT_FAILURE); } mu_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 ... |