summaryrefslogtreecommitdiff
path: root/libmailutils/tests/mimetest.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/tests/mimetest.c')
-rw-r--r--libmailutils/tests/mimetest.c296
1 files changed, 296 insertions, 0 deletions
diff --git a/libmailutils/tests/mimetest.c b/libmailutils/tests/mimetest.c
new file mode 100644
index 000000000..e440b372e
--- /dev/null
+++ b/libmailutils/tests/mimetest.c
@@ -0,0 +1,296 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 1999, 2000, 2001, 2005, 2007, 2009, 2010 Free Software
+ Foundation, Inc.
+
+ GNU Mailutils is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GNU Mailutils is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Mailutils; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301 USA */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+
+#include <mailutils/mailutils.h>
+
+void message_display_parts(mu_message_t msg, int indent);
+
+const char *from;
+const char *subject;
+const char *charset;
+int print_attachments;
+int indent_level = 4;
+
+void
+print_file (const char *fname, int indent)
+{
+ char buf[128];
+ FILE *fp = fopen (fname, "r");
+
+ if (!fp)
+ {
+ fprintf (stderr, "can't open file %s: %s", fname, strerror (errno));
+ return;
+ }
+
+ while (fgets (buf, sizeof buf, fp))
+ printf ("%*.*s%s", indent, indent, "", buf);
+ fclose (fp);
+ unlink (fname);
+}
+
+int
+main (int argc, char **argv)
+{
+ mu_mailbox_t mbox = NULL;
+ size_t i;
+ size_t count = 0;
+ char *mailbox_name;
+ int debug = 0;
+
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp (argv[i], "-d") == 0)
+ debug = 1;
+ else if (strcmp (argv[i], "-p") == 0)
+ print_attachments = 1;
+ else if (strcmp (argv[i], "-i") == 0)
+ {
+ if (++i == argc)
+ {
+ mu_error ("-i requires argument");
+ exit (1);
+ }
+ indent_level = strtoul (argv[i], NULL, 0);
+ }
+ else if (strcmp (argv[i], "-c") == 0)
+ {
+ if (++i == argc)
+ {
+ mu_error ("-c requires argument");
+ exit (1);
+ }
+ charset = argv[i];
+ }
+ else
+ break;
+ }
+
+ mailbox_name = argv[i];
+
+ /* Registration. */
+ mu_registrar_record (mu_imap_record);
+ mu_registrar_record (mu_pop_record);
+ mu_registrar_record (mu_mbox_record);
+ mu_registrar_set_default_record (mu_mbox_record);
+
+ MU_ASSERT (mu_mailbox_create_default (&mbox, mailbox_name));
+
+ /* Debugging trace. */
+ if (debug)
+ {
+ mu_debug_t debug;
+ mu_mailbox_get_debug (mbox, &debug);
+ mu_debug_set_level (debug, MU_DEBUG_LEVEL_UPTO (MU_DEBUG_PROT));
+ }
+
+ /* Open the mailbox for reading only. */
+ MU_ASSERT (mu_mailbox_open (mbox, MU_STREAM_RDWR));
+
+ /* Iterate through the entire message set. */
+ MU_ASSERT (mu_mailbox_messages_count (mbox, &count));
+
+ for (i = 1; i <= count; ++i)
+ {
+ mu_message_t msg;
+ mu_header_t hdr;
+ size_t nparts;
+ size_t msize, nlines;
+
+ MU_ASSERT (mu_mailbox_get_message (mbox, i, &msg));
+ MU_ASSERT (mu_message_size (msg, &msize));
+ MU_ASSERT (mu_message_lines (msg, &nlines));
+ MU_ASSERT (mu_message_get_header (msg, &hdr));
+ if (mu_header_sget_value (hdr, MU_HEADER_FROM, &from))
+ from = "";
+ if (mu_header_sget_value (hdr, MU_HEADER_SUBJECT, &subject))
+ subject = "";
+ printf ("Message: %lu\n", (unsigned long) i);
+ printf ("From: %s\n", from);
+ printf ("Subject: %s\n", subject);
+
+ MU_ASSERT (mu_message_get_num_parts (msg, &nparts));
+ printf ("Number of parts in message - %lu\n",
+ (unsigned long) nparts);
+ printf ("Total message size - %lu/%lu\n",
+ (unsigned long) msize, (unsigned long) nlines);
+ message_display_parts (msg, 0);
+ }
+ mu_mailbox_close (mbox);
+ mu_mailbox_destroy (&mbox);
+ return 0;
+}
+
+char buf[2048];
+
+static void
+print_message_part_sizes (mu_message_t part, int indent)
+{
+ mu_body_t body;
+ mu_header_t hdr;
+ size_t msize, mlines, hsize, hlines, bsize, blines;
+
+ MU_ASSERT (mu_message_size (part, &msize));
+ MU_ASSERT (mu_message_lines (part, &mlines));
+ MU_ASSERT (mu_message_get_header (part, &hdr));
+ MU_ASSERT (mu_header_size (hdr, &hsize));
+ MU_ASSERT (mu_header_lines (hdr, &hlines));
+ MU_ASSERT (mu_message_get_body (part, &body));
+ MU_ASSERT (mu_body_size (body, &bsize));
+ MU_ASSERT (mu_body_lines (body, &blines));
+ printf ("%*.*sMessage part size - %lu/%lu: %lu/%lu, %lu/%lu\n",
+ indent, indent, "",
+ (unsigned long) msize, (unsigned long) mlines,
+ (unsigned long) hsize, (unsigned long) hlines,
+ (unsigned long) bsize, (unsigned long) blines);
+}
+
+void
+message_display_parts (mu_message_t msg, int indent)
+{
+ int ret, j;
+ size_t nparts;
+ mu_message_t part;
+ mu_header_t hdr;
+ mu_stream_t str;
+ mu_body_t body;
+ int ismulti;
+ size_t nbytes;
+
+ /* How many parts does the message has? */
+ if ((ret = mu_message_get_num_parts (msg, &nparts)) != 0)
+ {
+ fprintf (stderr, "mu_message_get_num_parts - %s\n", mu_strerror (ret));
+ exit (2);
+ }
+
+ /* Iterate through all the parts.
+ Treat type "message/rfc822" differently, since it is a message of
+ its own that can have other subparts(recursive). */
+ for (j = 1; j <= nparts; j++)
+ {
+ int status;
+ const char *hvalue;
+ char *type = NULL;
+ const char *encoding = "";
+
+ MU_ASSERT (mu_message_get_part (msg, j, &part));
+ MU_ASSERT (mu_message_get_header (part, &hdr));
+ status = mu_header_sget_value (hdr, MU_HEADER_CONTENT_TYPE,
+ &hvalue);
+ if (status == MU_ERR_NOENT)
+ /* nothing */;
+ else if (status != 0)
+ mu_error ("Cannot get header value: %s", mu_strerror (status));
+ else
+ {
+ status = mu_mimehdr_aget_disp (hvalue, &type);
+ if (status)
+ mu_error ("Cannot extract content type field: %s",
+ mu_strerror (status));
+ }
+ printf ("%*.*sType of part %d = %s\n", indent, indent, "",
+ j, type ? type : "");
+ print_message_part_sizes (part, indent);
+ if (mu_header_sget_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING,
+ &encoding))
+ encoding = "";
+ ismulti = 0;
+ if ((type
+ && mu_c_strcasecmp (type, "message/rfc822") == 0)
+ || (mu_message_is_multipart (part, &ismulti) == 0 && ismulti))
+ {
+ if (!ismulti)
+ MU_ASSERT (mu_message_unencapsulate (part, &part, NULL));
+
+ MU_ASSERT (mu_message_get_header (part, &hdr));
+ if (mu_header_sget_value (hdr, MU_HEADER_FROM, &from))
+ from = "";
+ if (mu_header_sget_value (hdr, MU_HEADER_SUBJECT, &subject))
+ subject = "";
+ printf ("%*.*sEncapsulated message : %s\t%s\n",
+ indent, indent, "", from, subject);
+ printf ("%*.*sBegin\n", indent, indent, "");
+ message_display_parts (part, indent + indent_level);
+ mu_message_destroy (&part, NULL);
+ }
+ else if (!type
+ || (mu_c_strcasecmp (type, "text/plain") == 0)
+ || (mu_c_strcasecmp (type, "text/html")) == 0)
+ {
+ printf ("%*.*sText Message\n", indent, indent, "");
+ printf ("%*.*sBegin\n", indent, indent, "");
+ mu_message_get_body (part, &body);
+ mu_body_get_streamref (body, &str);
+ /* Make sure the original body stream is not closed when
+ str gets destroyed */
+ mu_filter_create (&str, str, encoding, MU_FILTER_DECODE,
+ MU_STREAM_READ);
+
+ while (mu_stream_readline (str, buf, sizeof (buf), &nbytes) == 0
+ && nbytes)
+ {
+ printf ("%*.*s%s", indent, indent, "", buf);
+ }
+ mu_stream_destroy (&str);
+ }
+ else
+ {
+ /* Save the attachements. */
+ char *fname = NULL;
+
+ mu_message_aget_decoded_attachment_name (part, charset,
+ &fname, NULL);
+ if (fname == NULL)
+ fname = mu_tempname (NULL);
+
+ printf ("%*.*sAttachment - saving [%s]\n", indent, indent, "",
+ fname);
+ printf ("%*.*sBegin\n", indent, indent, "");
+ if (charset)
+ {
+ mu_mime_io_buffer_t info;
+ mu_mime_io_buffer_create (&info);
+ mu_mime_io_buffer_set_charset (info, charset);
+ MU_ASSERT (mu_message_save_attachment (part, NULL, info));
+ mu_mime_io_buffer_destroy (&info);
+ }
+ else
+ MU_ASSERT (mu_message_save_attachment (part, fname, NULL));
+ if (print_attachments)
+ print_file (fname, indent);
+ free (fname);
+ }
+ printf ("\n%*.*sEnd\n", indent, indent, "");
+ free (type);
+ }
+}
+

Return to:

Send suggestions and report system problems to the System administrator.