/* To parse something like... * =?UTF-8?Q?=E0=A4=95=E0=A4=95=E0=A4=AC=E0=A5=82=E0=A5=8B=E0=A5=87?=\t\n=?UTF-8?Q?=E0=A4=B0?=\t\n<*****@*****.**> * and return the decoded representation of name & email parts. */ gboolean eab_parse_qp_email (const gchar *string, gchar **name, gchar **email) { struct _camel_header_address *address; gboolean res = FALSE; address = camel_header_address_decode (string, "UTF-8"); if (!address) return FALSE; /* report success only when we have filled both name and email address */ if (address->type == CAMEL_HEADER_ADDRESS_NAME && address->name && *address->name && address->v.addr && *address->v.addr) { *name = g_strdup (address->name); *email = g_strdup (address->v.addr); res = TRUE; } camel_header_address_unref (address); return res; }
static void emfqe_format_header (EMailFormatter *formatter, EMailFormatterContext *context, GString *buffer, EMailPart *part, const gchar *header_name, const gchar *charset) { CamelMimePart *mime_part; EMailFormatterHeaderFlags flags; gchar *canon_name, *buf, *value = NULL; const gchar *txt, *label; gboolean addrspec = FALSE; gint is_html = FALSE; gint i; /* Skip Face header in prints, which includes also message forward */ if (context->mode == E_MAIL_FORMATTER_MODE_PRINTING && g_ascii_strcasecmp (header_name, "Face") == 0) return; flags = E_MAIL_FORMATTER_HEADER_FLAG_NOELIPSIZE; canon_name = g_alloca (strlen (header_name) + 1); strcpy (canon_name, header_name); e_mail_formatter_canon_header_name (canon_name); /* Never quote Bcc/Resent-Bcc headers. */ if (g_str_equal (canon_name, "Bcc")) return; if (g_str_equal (canon_name, "Resent-Bcc")) return; mime_part = e_mail_part_ref_mime_part (part); for (i = 0; addrspec_hdrs[i]; i++) { if (g_str_equal (canon_name, addrspec_hdrs[i])) { addrspec = TRUE; break; } } label = _(canon_name); if (addrspec) { CamelMedium *medium; struct _camel_header_address *addrs; GString *html; gchar *charset; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); if (txt == NULL) return; charset = e_mail_formatter_dup_charset (formatter); if (!charset) charset = e_mail_formatter_dup_default_charset (formatter); buf = camel_header_unfold (txt); addrs = camel_header_address_decode (txt, charset); g_free (charset); if (addrs == NULL) { g_free (buf); return; } g_free (buf); html = g_string_new (""); e_mail_formatter_format_address (formatter, html, addrs, canon_name, FALSE, FALSE); camel_header_address_unref (addrs); txt = value = html->str; g_string_free (html, FALSE); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; is_html = TRUE; } else if (g_str_equal (canon_name, "Subject")) { CamelMimeMessage *message; message = CAMEL_MIME_MESSAGE (mime_part); txt = camel_mime_message_get_subject (message); label = _("Subject"); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "X-Evolution-Mailer")) { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, "x-mailer"); if (txt == NULL) txt = camel_medium_get_header (medium, "user-agent"); if (txt == NULL) txt = camel_medium_get_header (medium, "x-newsreader"); if (txt == NULL) txt = camel_medium_get_header (medium, "x-mimeole"); if (txt == NULL) return; txt = value = camel_header_format_ctext (txt, charset); label = _("Mailer"); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Date") || g_str_equal (canon_name, "Resent-Date")) { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); if (txt == NULL) return; flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); buf = camel_header_unfold (txt); txt = value = camel_header_decode_string (txt, charset); g_free (buf); } emfqe_format_text_header (formatter, buffer, label, txt, flags, is_html); g_free (value); g_object_unref (mime_part); }
static void append_to_header (ExchangeSendOptionsDialog *dialog, gint state, gpointer data) { EMsgComposer *composer; CamelAddress *sender_address; const gchar *sender_id, *recipient_id; struct _camel_header_address *addr; struct _camel_header_address *sender_addr; composer = (EMsgComposer *) data; if (state == GTK_RESPONSE_OK) { if (dialog->options->importance) { switch (dialog->options->importance) { case E_IMP_HIGH : e_msg_composer_set_header (composer, "Importance", "high"); break; case E_IMP_LOW : e_msg_composer_set_header (composer, "Importance", "low"); break; default : g_print ("\nNo importance set"); break; } } else e_msg_composer_remove_header (composer, "Importance"); if (dialog->options->sensitivity) { switch (dialog->options->sensitivity) { case E_SENSITIVITY_CONFIDENTIAL : e_msg_composer_set_header (composer, "Sensitivity", "Company-Confidential"); break; case E_SENSITIVITY_PERSONAL : e_msg_composer_set_header (composer, "Sensitivity", "Personal"); break; case E_SENSITIVITY_PRIVATE : e_msg_composer_set_header (composer, "Sensitivity", "Private"); break; default : g_print ("\nNo importance set"); break; } } else e_msg_composer_remove_header (composer, "Sensitivity"); sender_address = (CamelAddress *) e_msg_composer_get_from (composer); sender_id = (const gchar *) camel_address_encode (sender_address); addr = camel_header_address_decode (dialog->options->delegate_address, NULL); sender_addr = camel_header_address_decode (sender_id, NULL); if (dialog->options->send_as_del_enabled && dialog->options->delegate_address && g_ascii_strcasecmp (addr->v.addr, sender_addr->v.addr)) { e_msg_composer_set_header (composer, "Sender" , sender_id); /* This block handles the case wherein the address to be added * in the "From" field has no name associated with it. * So for cases where there is no name we append the address * (only email) within angular braces. */ if (!g_ascii_strcasecmp (addr->name, "")) { recipient_id = g_strdup_printf ("<%s>", dialog->options->delegate_address); e_msg_composer_add_header (composer, "From", recipient_id); } else e_msg_composer_add_header (composer, "From", dialog->options->delegate_address); } else { e_msg_composer_remove_header (composer, "Sender"); e_msg_composer_add_header (composer, "From", sender_id); } if (dialog->options->delivery_enabled) { EComposerHeaderTable *table; EAccount *account; gchar *mdn_address; table = e_msg_composer_get_header_table (composer); account = e_composer_header_table_get_account (table); mdn_address = account->id->reply_to; if (!mdn_address || !*mdn_address) mdn_address = account->id->address; e_msg_composer_set_header (composer, "Return-Receipt-To", mdn_address); } else e_msg_composer_remove_header (composer, "Return-Receipt-To"); if (dialog->options->read_enabled) { EComposerHeaderTable *table; EAccount *account; gchar *mdn_address; table = e_msg_composer_get_header_table (composer); account = e_composer_header_table_get_account (table); mdn_address = account->id->reply_to; if (!mdn_address || !*mdn_address) mdn_address = account->id->address; e_msg_composer_set_header (composer, "Disposition-Notification-To", mdn_address); } else e_msg_composer_remove_header (composer, "Disposition-Notification-To"); } }
void e_mail_formatter_format_header (EMailFormatter *formatter, GString *buffer, const gchar *header_name, const gchar *header_value, guint32 flags, const gchar *charset) { gchar *canon_name, *buf, *value = NULL; const gchar *label, *txt; gboolean addrspec = FALSE; gchar *str_field = NULL; gint i; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); g_return_if_fail (buffer != NULL); g_return_if_fail (header_name != NULL); g_return_if_fail (header_value != NULL); canon_name = g_alloca (strlen (header_name) + 1); strcpy (canon_name, header_name); e_mail_formatter_canon_header_name (canon_name); for (i = 0; addrspec_hdrs[i]; i++) { if (g_ascii_strcasecmp (canon_name, addrspec_hdrs[i]) == 0) { addrspec = TRUE; break; } } label = _(canon_name); if (addrspec) { struct _camel_header_address *addrs; GString *html; gchar *img; gchar *charset; charset = e_mail_formatter_dup_charset (formatter); if (charset == NULL) charset = e_mail_formatter_dup_default_charset (formatter); buf = camel_header_unfold (header_value); addrs = camel_header_address_decode (buf, charset); if (addrs == NULL) { g_free (charset); g_free (buf); return; } g_free (charset); g_free (buf); html = g_string_new (""); img = e_mail_formatter_format_address ( formatter, html, addrs, label, (flags & E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS), !(flags & E_MAIL_FORMATTER_HEADER_FLAG_NOELIPSIZE)); if (img != NULL) { str_field = g_strdup_printf ("%s: %s", label, img); label = str_field; flags |= E_MAIL_FORMATTER_HEADER_FLAG_NODEC; g_free (img); } camel_header_address_list_clear (&addrs); txt = value = html->str; g_string_free (html, FALSE); flags |= E_MAIL_FORMATTER_HEADER_FLAG_HTML; flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Subject")) { buf = camel_header_unfold (header_value); txt = value = camel_header_decode_string (buf, charset); g_free (buf); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "X-Evolution-Mailer")) { /* pseudo-header */ label = _("Mailer"); txt = value = camel_header_format_ctext (header_value, charset); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Date") || g_str_equal (canon_name, "Resent-Date")) { CamelMimeFilterToHTMLFlags text_format_flags; gint msg_offset, local_tz; time_t msg_date; struct tm local; gchar *html; gboolean hide_real_date; hide_real_date = !e_mail_formatter_get_show_real_date (formatter); txt = header_value; while (*txt == ' ' || *txt == '\t') txt++; text_format_flags = e_mail_formatter_get_text_format_flags (formatter); html = camel_text_to_html (txt, text_format_flags, 0); msg_date = camel_header_decode_date (txt, &msg_offset); e_localtime_with_offset (msg_date, &local, &local_tz); /* Convert message offset to minutes (e.g. -0400 --> -240) */ msg_offset = ((msg_offset / 100) * 60) + (msg_offset % 100); /* Turn into offset from localtime, not UTC */ msg_offset -= local_tz / 60; /* value will be freed at the end */ if (!hide_real_date && !msg_offset) { /* No timezone difference; just * show the real Date: header. */ txt = value = html; } else { gchar *date_str; date_str = e_datetime_format_format ( "mail", "header", DTFormatKindDateTime, msg_date); if (hide_real_date) { /* Show only the local-formatted date, losing * all timezone information like Outlook does. * Should we attempt to show it somehow? */ txt = value = date_str; } else { txt = value = g_strdup_printf ( "%s (<I>%s</I>)", html, date_str); g_free (date_str); } g_free (html); } flags |= E_MAIL_FORMATTER_HEADER_FLAG_HTML; flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Newsgroups")) { GSList *ng, *scan; GString *html; buf = camel_header_unfold (header_value); if (!(ng = camel_header_newsgroups_decode (buf))) { g_free (buf); return; } g_free (buf); html = g_string_new (""); scan = ng; while (scan) { const gchar *newsgroup = scan->data; if (flags & E_MAIL_FORMATTER_HEADER_FLAG_NOLINKS) g_string_append_printf ( html, "%s", newsgroup); else g_string_append_printf ( html, "<a href=\"news:%s\">%s</a>", newsgroup, newsgroup); scan = g_slist_next (scan); if (scan) g_string_append_printf (html, ", "); } g_slist_free_full (ng, g_free); txt = html->str; value = g_string_free (html, FALSE); flags |= E_MAIL_FORMATTER_HEADER_FLAG_HTML; flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Received") || g_str_has_prefix (canon_name, "X-")) { /* don't unfold Received nor extension headers */ txt = value = camel_header_decode_string (header_value, charset); } else { /* don't unfold Received nor extension headers */ buf = camel_header_unfold (header_value); txt = value = camel_header_decode_string (buf, charset); g_free (buf); } e_mail_formatter_format_text_header ( formatter, buffer, label, txt, flags); g_free (value); g_free (str_field); }