Go to the first, previous, next, last section, table of contents.
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 (®istrar); 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.