char * buf; char * emailText; // this variable is defined in a header file included in the source file // this function is defined in. // In another function in another source file, I free memory and assign emailText to NULL. void GetEmailBody(message_t msg, int * valid_attachments) { int ret, j; size_t msize, nlines, nparts, nsubparts; message_t part; header_t hdr; char type[256]; char encoding[256]; stream_t str; body_t body; int offset, ismulti; size_t nbytes; int indent = 0; int indent_level = 4; int result = 0; /* How many parts does the message has? */ if ((ret = message_get_num_parts (msg, &nparts)) != 0) { fprintf (stderr, "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++) { if ((ret = message_get_part (msg, j, &part)) != 0) { fprintf (stderr, "mime_get_part - %s\n", mu_strerror (ret)); exit (2); } if ((ret = message_size (part, &msize)) != 0) { fprintf (stderr, "message_size - %s\n", mu_strerror (ret)); exit (2); } if ((ret = message_lines (part, &nlines)) != 0) { fprintf (stderr, "message_lines - %s\n", mu_strerror (ret)); exit (2); } if ((ret = message_get_header (part, &hdr)) != 0) { fprintf (stderr, "message_get_header - %s\n", mu_strerror (ret)); exit (2); } header_get_value (hdr, MU_HEADER_CONTENT_TYPE, type, sizeof (type), NULL); printf ("%*.*sType of part %d = %s\n", indent, indent, "", j, type); printf ("%*.*sMessage part size - %lu/%lu\n", indent, indent, "", (unsigned long) msize, (unsigned long) nlines); encoding[0] = '\0'; header_get_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, encoding, sizeof (encoding), NULL); ismulti = 0; if ((type[0] && strncasecmp (type, "message/rfc822", strlen (type)) == 0) || (message_is_multipart (part, &ismulti) == 0 && ismulti)) { if (!ismulti) { ret = message_unencapsulate (part, &part, NULL); if (ret != 0) fprintf (stderr, "message_unencapsulate - %s\n", mu_strerror (ret)); break; } if ((ret = message_get_header (part, &hdr)) != 0) { fprintf (stderr, "message_get_header - %s\n", mu_strerror (ret)); exit (2); } // header_get_value (hdr, MU_HEADER_FROM, from, sizeof (from), NULL); // header_get_value (hdr, MU_HEADER_SUBJECT, subject, sizeof (subject), // NULL); // printf ("%*.*sEncapsulated message : %s\t%s\n", // indent, indent, "", from, subject); printf ("%*.*sBegin\n", indent, indent, ""); if ((ret = message_get_num_parts (part, &nsubparts)) != 0) { fprintf (stderr, "mime_get_num_parts - %s\n", mu_strerror (ret)); exit (2); } indent+=indent_level; GetEmailBody (part, valid_attachments); message_destroy (&part, NULL); } else if (type[0] == '\0' || (strncasecmp (type, "text/plain", strlen ("text/plain")) == 0) ) { printf ("%*.*sText Message\n", indent, indent, ""); printf ("%*.*sBegin\n", indent, indent, ""); result = message_get_body (part, &body); printf("\ngetting body, result = %d\n", result); msize += strlen(emailText); emailText = realloc(emailText, msize); buf = calloc(2046+msize, sizeof(char)); result = body_get_stream (body, &str); printf("\ngetting stream, result = %d\n", result); filter_create (&str, str, encoding, 0, 0); offset = 0; nbytes = 1; while (result == 0 && nbytes) { nbytes = 0; result = stream_readline (str, buf, 2046+msize, offset, &nbytes); printf("\nresult = %d, text = %s\n", result, buf); if (buf != NULL) { printf("\nadding to textStream\n"); strcat(emailText, buf); } offset += nbytes; } free(buf); printf("\ndone getting text, result = %d\n", result); stream_destroy (&str, NULL); } else { /* Save the attachements. */ char *fname = NULL; message_aget_attachment_name (part, &fname); if (fname == NULL) fname = mu_tempname (NULL); printf ("%*.*sAttachment - saving [%s]\n", indent, indent, "", fname); printf ("%*.*sBegin\n", indent, indent, ""); /*FIXME: What is the 'data' argument for? */ // message_save_attachment (part, NULL, NULL); // if (print_attachments) // print_file (fname, indent); free (fname); } printf ("\n%*.*sEnd\n", indent, indent, ""); } }