static void format_headers_message_part_json (GMimeMessage *message) { void *ctx = talloc_new (NULL); void *ctx_quote = talloc_new (ctx); InternetAddressList *recipients; const char *recipients_string; printf ("%s: %s", json_quote_str (ctx_quote, "From"), json_quote_str (ctx_quote, g_mime_message_get_sender (message))); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf (", %s: %s", json_quote_str (ctx_quote, "To"), json_quote_str (ctx_quote, recipients_string)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf (", %s: %s", json_quote_str (ctx_quote, "Cc"), json_quote_str (ctx_quote, recipients_string)); printf (", %s: %s", json_quote_str (ctx_quote, "Subject"), json_quote_str (ctx_quote, g_mime_message_get_subject (message))); printf (", %s: %s", json_quote_str (ctx_quote, "Date"), json_quote_str (ctx_quote, g_mime_message_get_date_as_string (message))); talloc_free (ctx_quote); talloc_free (ctx); }
void format_headers_sprinter (sprinter_t *sp, GMimeMessage *message, notmuch_bool_t reply) { /* Any changes to the JSON or S-Expression format should be * reflected in the file devel/schemata. */ InternetAddressList *recipients; const char *recipients_string; const char *reply_to_string; sp->begin_map (sp); sp->map_key (sp, "Subject"); sp->string (sp, g_mime_message_get_subject (message)); sp->map_key (sp, "From"); sp->string (sp, g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) { sp->map_key (sp, "To"); sp->string (sp, recipients_string); } recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) { sp->map_key (sp, "Cc"); sp->string (sp, recipients_string); } recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_BCC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) { sp->map_key (sp, "Bcc"); sp->string (sp, recipients_string); } reply_to_string = g_mime_message_get_reply_to (message); if (reply_to_string) { sp->map_key (sp, "Reply-To"); sp->string (sp, reply_to_string); } if (reply) { sp->map_key (sp, "In-reply-to"); sp->string (sp, g_mime_object_get_header (GMIME_OBJECT (message), "In-reply-to")); sp->map_key (sp, "References"); sp->string (sp, g_mime_object_get_header (GMIME_OBJECT (message), "References")); } else { sp->map_key (sp, "Date"); sp->string (sp, g_mime_message_get_date_as_string (message)); } sp->end (sp); }
static void format_part_reply (mime_node_t *node) { int i; if (node->envelope_file) { printf ("On %s, %s wrote:\n", notmuch_message_get_header (node->envelope_file, "date"), notmuch_message_get_header (node->envelope_file, "from")); } else if (GMIME_IS_MESSAGE (node->part)) { GMimeMessage *message = GMIME_MESSAGE (node->part); InternetAddressList *recipients; const char *recipients_string; printf ("> From: %s\n", g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("> To: %s\n", recipients_string); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("> Cc: %s\n", recipients_string); printf ("> Subject: %s\n", g_mime_message_get_subject (message)); printf ("> Date: %s\n", g_mime_message_get_date_as_string (message)); printf (">\n"); } else if (GMIME_IS_PART (node->part)) { GMimeContentType *content_type = g_mime_object_get_content_type (node->part); GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (node->part); if (g_mime_content_type_is_type (content_type, "application", "pgp-encrypted") || g_mime_content_type_is_type (content_type, "application", "pgp-signature")) { /* Ignore PGP/MIME cruft parts */ } else if (g_mime_content_type_is_type (content_type, "text", "*") && !g_mime_content_type_is_type (content_type, "text", "html")) { GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); show_text_part_content (node->part, stream_stdout, NOTMUCH_SHOW_TEXT_PART_REPLY); g_object_unref(stream_stdout); } else if (disposition && strcasecmp (g_mime_content_disposition_get_disposition (disposition), GMIME_DISPOSITION_ATTACHMENT) == 0) { const char *filename = g_mime_part_get_filename (GMIME_PART (node->part)); printf ("Attachment: %s (%s)\n", filename, g_mime_content_type_to_string (content_type)); } else { printf ("Non-text part: %s\n", g_mime_content_type_to_string (content_type)); } } for (i = 0; i < node->nchildren; i++) format_part_reply (mime_node_child (node, i)); }
int main (int argc, char* argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s MSG_FILE\n", argv[0]); return 1; } g_mime_init(0); FILE* fp = fopen(argv[1], "r"); if (fp == NULL) { fprintf(stderr, "Cannot open the file %s\n", argv[1]); return 1; } GMimeStream* stream = g_mime_stream_file_new(fp); GMimeParser* parser = g_mime_parser_new_with_stream(stream); GMimeMessage* message = g_mime_parser_construct_message(parser); if (message == NULL) { fprintf(stderr, "Cannot construct message\n"); return 1; } printf("Date : %s\n", g_mime_message_get_date_as_string(message)); printf("Subject : %s\n", g_mime_message_get_subject(message)); printf("From : %s\n", g_mime_message_get_sender(message)); printf("To : %s\n", internet_address_list_to_string( g_mime_message_get_all_recipients(message), FALSE)); fclose(fp); return 0; }
void format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply) { void *local = talloc_new (ctx); InternetAddressList *recipients; const char *recipients_string; printf ("{%s: %s", json_quote_str (local, "Subject"), json_quote_str (local, g_mime_message_get_subject (message))); printf (", %s: %s", json_quote_str (local, "From"), json_quote_str (local, g_mime_message_get_sender (message))); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf (", %s: %s", json_quote_str (local, "To"), json_quote_str (local, recipients_string)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf (", %s: %s", json_quote_str (local, "Cc"), json_quote_str (local, recipients_string)); if (reply) { printf (", %s: %s", json_quote_str (local, "In-reply-to"), json_quote_str (local, g_mime_object_get_header (GMIME_OBJECT (message), "In-reply-to"))); printf (", %s: %s", json_quote_str (local, "References"), json_quote_str (local, g_mime_object_get_header (GMIME_OBJECT (message), "References"))); } else { printf (", %s: %s", json_quote_str (local, "Date"), json_quote_str (local, g_mime_message_get_date_as_string (message))); } printf ("}"); talloc_free (local); }
static void reply_headers_message_part (GMimeMessage *message) { InternetAddressList *recipients; const char *recipients_string; printf ("> From: %s\n", g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("> To: %s\n", recipients_string); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("> Cc: %s\n", recipients_string); printf ("> Subject: %s\n", g_mime_message_get_subject (message)); printf ("> Date: %s\n", g_mime_message_get_date_as_string (message)); }
static gchar* get_recip (GMimeMessage *msg, GMimeRecipientType rtype) { char *recep; InternetAddressList *receps; receps = g_mime_message_get_recipients (msg, rtype); recep = (char*)internet_address_list_to_string (receps, FALSE); if (!recep || !*recep) { g_free (recep); return NULL; } return recep; }
static void accumulate_text_message (MuMsg *msg, MuMsgPart *part, GString **gstrp) { const gchar *str; char *adrs; GMimeMessage *mimemsg; InternetAddressList *addresses; /* put sender, recipients and subject in the string, so they * can be indexed as well */ mimemsg = GMIME_MESSAGE (part->data); str = g_mime_message_get_sender (mimemsg); g_string_append_printf (*gstrp, "%s%s", str ? str : "", str ? "\n" : ""); str = g_mime_message_get_subject (mimemsg); g_string_append_printf (*gstrp, "%s%s", str ? str : "", str ? "\n" : ""); addresses = g_mime_message_get_all_recipients (mimemsg); adrs = internet_address_list_to_string (addresses, FALSE); g_object_unref (addresses); g_string_append_printf (*gstrp, "%s%s", adrs ? adrs : "", adrs ? "\n" : ""); g_free (adrs); }
static notmuch_status_t format_part_text (const void *ctx, mime_node_t *node, int indent, const notmuch_show_params_t *params) { /* The disposition and content-type metadata are associated with * the envelope for message parts */ GMimeObject *meta = node->envelope_part ? GMIME_OBJECT (node->envelope_part) : node->part; GMimeContentType *content_type = g_mime_object_get_content_type (meta); const notmuch_bool_t leaf = GMIME_IS_PART (node->part); const char *part_type; int i; if (node->envelope_file) { notmuch_message_t *message = node->envelope_file; part_type = "message"; printf ("\f%s{ id:%s depth:%d match:%d excluded:%d filename:%s\n", part_type, notmuch_message_get_message_id (message), indent, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH) ? 1 : 0, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED) ? 1 : 0, notmuch_message_get_filename (message)); } else { GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta); const char *cid = g_mime_object_get_content_id (meta); const char *filename = leaf ? g_mime_part_get_filename (GMIME_PART (node->part)) : NULL; if (disposition && strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) part_type = "attachment"; else part_type = "part"; printf ("\f%s{ ID: %d", part_type, node->part_num); if (filename) printf (", Filename: %s", filename); if (cid) printf (", Content-id: %s", cid); printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type)); } if (GMIME_IS_MESSAGE (node->part)) { GMimeMessage *message = GMIME_MESSAGE (node->part); InternetAddressList *recipients; const char *recipients_string; printf ("\fheader{\n"); if (node->envelope_file) printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file)); printf ("Subject: %s\n", g_mime_message_get_subject (message)); printf ("From: %s\n", g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("To: %s\n", recipients_string); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); recipients_string = internet_address_list_to_string (recipients, 0); if (recipients_string) printf ("Cc: %s\n", recipients_string); printf ("Date: %s\n", g_mime_message_get_date_as_string (message)); printf ("\fheader}\n"); printf ("\fbody{\n"); } if (leaf) { if (g_mime_content_type_is_type (content_type, "text", "*") && !g_mime_content_type_is_type (content_type, "text", "html")) { GMimeStream *stream_stdout = g_mime_stream_file_new (stdout); g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); show_text_part_content (node->part, stream_stdout, 0); g_object_unref(stream_stdout); } else { printf ("Non-text part: %s\n", g_mime_content_type_to_string (content_type)); } } for (i = 0; i < node->nchildren; i++) format_part_text (ctx, mime_node_child (node, i), indent, params); if (GMIME_IS_MESSAGE (node->part)) printf ("\fbody}\n"); printf ("\f%s}\n", part_type); return NOTMUCH_STATUS_SUCCESS; }
static void test_parser (GMimeParser *parser, GMimeStream *mbox, GMimeStream *summary) { gint64 message_begin, message_end, headers_begin, headers_end; GMimeFormatOptions *format = g_mime_format_options_get_default (); InternetAddressList *list; GMimeMessage *message; char *marker, *buf; const char *subject; GMimeObject *body; GDateTime *date; int nmsg = 0; while (!g_mime_parser_eos (parser)) { message_begin = g_mime_parser_tell (parser); if (!(message = g_mime_parser_construct_message (parser, NULL))) throw (exception_new ("failed to parse message #%d", nmsg)); message_end = g_mime_parser_tell (parser); headers_begin = g_mime_parser_get_headers_begin (parser); headers_end = g_mime_parser_get_headers_end (parser); g_mime_stream_printf (summary, "message offsets: %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT "\n", message_begin, message_end); g_mime_stream_printf (summary, "header offsets: %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT "\n", headers_begin, headers_end); marker = g_mime_parser_get_mbox_marker (parser); g_mime_stream_printf (summary, "%s\n", marker); if ((list = g_mime_message_get_from (message)) != NULL && internet_address_list_length (list) > 0) { buf = internet_address_list_to_string (list, format, FALSE); g_mime_stream_printf (summary, "From: %s\n", buf); g_free (buf); } if ((list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO)) != NULL && internet_address_list_length (list) > 0) { buf = internet_address_list_to_string (list, format, FALSE); g_mime_stream_printf (summary, "To: %s\n", buf); g_free (buf); } if (!(subject = g_mime_message_get_subject (message))) subject = ""; g_mime_stream_printf (summary, "Subject: %s\n", subject); if (!(date = g_mime_message_get_date (message))) { date = g_date_time_new_from_unix_utc (0); } else { g_date_time_ref (date); } buf = g_mime_utils_header_format_date (date); g_mime_stream_printf (summary, "Date: %s\n", buf); g_date_time_unref (date); g_free (buf); body = g_mime_message_get_mime_part (message); print_mime_struct (summary, body, 0); g_mime_stream_write (summary, "\n", 1); if (mbox) { if (nmsg > 0) g_mime_stream_write (mbox, "\n", 1); g_mime_stream_printf (mbox, "%s\n", marker); g_mime_object_write_to_stream ((GMimeObject *) message, format, mbox); } g_object_unref (message); g_free (marker); nmsg++; } }