Node:libmailbox, Next:libmuauth, Previous:Introduction, Up:Top
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.
/* sfrom, Simple From */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <mailutils/mailutils.h> int main (int argc, const char **argv) { char *from; char *subject; mailbox_t mbox; int status; size_t msgno, total = 0; /* Register the type of mailbox. IMAP4, POP3 and local format */ { list_t registrar; registrar_get_list (®istrar); list_append (registrar, imap_record); list_append (registrar, path_record); list_append (registrar, pop_record); } status = mailbox_create_default (&mbox, argv[1]); if (status != 0) { fprintf (stderr, "mailbox_create: %s\n", mu_errstring (status)); exit (EXIT_FAILURE); } status = mailbox_open (mbox, MU_STREAM_READ); if (status != 0) { fprintf (stderr, "mailbox_open: %s\n", mu_errstring (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", mu_errstring (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); } mailbox_close (mbox); mailbox_destroy (&mbox); return 0; }
Here is a sample output produced by this program:
% MAIL=pop://alain@localhost ./sfrom Passwd: xxxx Jim Meyering <meyering@foo.org> fetish(shellutils) beta François Pinard <pinard@bar.org> recode new alpha ...