/* %S */ static char * hdr_q_subject (struct header_call_args *args, void *data) { mu_header_t hdr; char *subj = NULL; size_t len; if (args->cols_rest <= 2) return "\"\""; mu_message_get_header (args->msg, &hdr); mu_header_aget_value_unfold (hdr, MU_HEADER_SUBJECT, &subj); if (!subj) return ""; util_rfc2047_decode (&subj); len = strlen (subj); if (len + 2 > args->cols_rest) len = args->cols_rest - 2; header_ensure_space (args, len + 3); args->buf[0] = '"'; memcpy (args->buf + 1, subj, len); args->buf[len+1] = '"'; args->buf[len+2] = 0; free (subj); return args->buf; }
/* %s */ static char * hdr_subject (struct header_call_args *args, void *data) { mu_header_t hdr; char *subj = NULL; mu_message_get_header (args->msg, &hdr); mu_header_aget_value_unfold (hdr, MU_HEADER_SUBJECT, &subj); util_rfc2047_decode (&subj); header_buf_string (args, subj); free (subj); return args->buf; }
static void vacation_subject (mu_sieve_machine_t mach, mu_list_t tags, mu_message_t msg, mu_header_t newhdr) { mu_sieve_value_t *arg; char *value; char *subject; int subject_allocated = 0; mu_header_t hdr; if (mu_sieve_tag_lookup (tags, "subject", &arg)) subject = arg->v.string; else if (mu_message_get_header (msg, &hdr) == 0 && mu_header_aget_value_unfold (hdr, MU_HEADER_SUBJECT, &value) == 0) { char *p; int rc = mu_rfc2047_decode (MU_SIEVE_CHARSET, value, &p); subject_allocated = 1; if (rc) { subject = value; value = NULL; } else { subject = p; } if (mu_sieve_tag_lookup (tags, "reply_regex", &arg)) { char *err = NULL; rc = mu_unre_set_regex (arg->v.string, 0, &err); if (rc) { mu_sieve_error (mach, _("%lu: cannot compile reply prefix regexp: %s: %s"), (unsigned long) mu_sieve_get_message_num (mach), mu_strerror (rc), err ? err : ""); } } if (mu_unre_subject (subject, NULL)) re_subject (mach, tags, &subject); free (value); } else subject = "Re: Your mail"; if (mu_rfc2047_encode (MU_SIEVE_CHARSET, "quoted-printable", subject, &value)) mu_header_set_value (newhdr, MU_HEADER_SUBJECT, subject, 0); else { mu_header_set_value (newhdr, MU_HEADER_SUBJECT, value, 0); free (value); } if (subject_allocated) free (subject); }
/* %f */ static char * hdr_from (struct header_call_args *args, void *data) { char *from = NULL; if (mailvar_get (NULL, "fromfield", mailvar_type_boolean, 0) == 0) { mu_header_t hdr; mu_message_get_header (args->msg, &hdr); if (mu_header_aget_value_unfold (hdr, MU_HEADER_FROM, &from) == 0) { mu_address_t address = NULL; if (mu_address_create (&address, from) == 0) { char *name; const char *email; if (mu_address_sget_email (address, 1, &email) == 0) { if (mailvar_get (NULL, "showto", mailvar_type_boolean, 0) == 0 && mail_is_my_name (email)) { char *tmp; if (mu_header_aget_value_unfold (hdr, MU_HEADER_TO, &tmp) == 0) { mu_address_t addr_to; if (mu_address_create (&addr_to, tmp) == 0) { mu_address_destroy (&address); address = addr_to; } free (tmp); } } } if ((mu_address_aget_personal (address, 1, &name) == 0 && name) || (mu_address_aget_email (address, 1, &name) == 0 && name)) { free (from); from = name; } mu_address_destroy (&address); } } util_rfc2047_decode (&from); } else { mu_envelope_t env = NULL; const char *sender = ""; if (mu_message_get_envelope (args->msg, &env) == 0) mu_envelope_sget_sender (env, &sender); from = strdup (sender); } header_buf_string (args, from); free (from); return args->buf; }