mu: fake reply-to for mailing-list posts

Some mailing lists do _not_ set reply-to, see e.g.,
   https://github.com/djcb/mu/pull/1278

In that case, use the 'List-Post' address instead, so the behavior is
the same (in mu4e) as for other mailing lists.
This commit is contained in:
djcb
2018-11-04 12:28:28 +02:00
parent d5a4ba06ce
commit e321d15c2a

View File

@ -46,9 +46,6 @@ append_sexp_attr_list (GString *gstr, const char* elm, const GSList *lst)
g_string_append (gstr, ")\n"); g_string_append (gstr, ")\n");
} }
static void static void
append_sexp_attr (GString *gstr, const char* elm, const char *str) append_sexp_attr (GString *gstr, const char* elm, const char *str)
{ {
@ -71,7 +68,6 @@ append_sexp_attr (GString *gstr, const char* elm, const char *str)
g_free (esc); g_free (esc);
} }
static void static void
append_sexp_body_attr (GString *gstr, const char* elm, const char *str) append_sexp_body_attr (GString *gstr, const char* elm, const char *str)
{ {
@ -86,11 +82,6 @@ append_sexp_body_attr (GString *gstr, const char* elm, const char *str)
g_free (esc); g_free (esc);
} }
struct _ContactData { struct _ContactData {
gboolean from, to, cc, bcc, reply_to; gboolean from, to, cc, bcc, reply_to;
GString *gstr; GString *gstr;
@ -118,6 +109,7 @@ get_name_addr_pair (MuMsgContact *c)
return pair; return pair;
} }
static void static void
add_prefix_maybe (GString *gstr, gboolean *field, const char *prefix) add_prefix_maybe (GString *gstr, gboolean *field, const char *prefix)
{ {
@ -172,6 +164,36 @@ each_contact (MuMsgContact *c, ContactData *cdata)
} }
static void
maybe_append_list_post_as_reply_to (GString *gstr, MuMsg *msg)
{
/* some mailing lists do not set the reply-to; see pull #1278. So for
* those cases, check the List-Post address and use that instead */
GMatchInfo *minfo;
GRegex *rx;
const char* list_post;
list_post = mu_msg_get_header (msg, "List-Post");
if (!list_post)
return;
rx = g_regex_new ("^(<?mailto:)?([a-z0-9%+@.-]+)>?", G_REGEX_CASELESS, 0, NULL);
g_return_if_fail(rx);
if (g_regex_match (rx, list_post, 0, &minfo)) {
char *addr;
addr = g_match_info_fetch (minfo, 2);
g_string_append_printf (gstr,"\t:reply-to ((nil . \"%s\"))\n", addr);
g_free(addr);
}
g_match_info_free (minfo);
g_regex_unref (rx);
}
static void static void
append_sexp_contacts (GString *gstr, MuMsg *msg) append_sexp_contacts (GString *gstr, MuMsg *msg)
{ {
@ -184,9 +206,11 @@ append_sexp_contacts (GString *gstr, MuMsg *msg)
mu_msg_contact_foreach (msg, (MuMsgContactForeachFunc)each_contact, mu_msg_contact_foreach (msg, (MuMsgContactForeachFunc)each_contact,
&cdata); &cdata);
if (cdata.from || cdata.to || cdata.cc || cdata.bcc || cdata.reply_to) if (cdata.from || cdata.to || cdata.cc || cdata.bcc || cdata.reply_to)
gstr = g_string_append (gstr, ")\n"); gstr = g_string_append (gstr, ")\n");
if (!cdata.reply_to)
maybe_append_list_post_as_reply_to (gstr, msg);
} }
struct _FlagData { struct _FlagData {
@ -557,7 +581,6 @@ append_sexp_tags (GString *gstr, MuMsg *msg)
g_string_free (tagstr, TRUE); g_string_free (tagstr, TRUE);
} }
char* char*
mu_msg_to_sexp (MuMsg *msg, unsigned docid, const MuMsgIterThreadInfo *ti, mu_msg_to_sexp (MuMsg *msg, unsigned docid, const MuMsgIterThreadInfo *ti,
MuMsgOptions opts) MuMsgOptions opts)
@ -580,9 +603,8 @@ mu_msg_to_sexp (MuMsg *msg, unsigned docid, const MuMsgIterThreadInfo *ti,
append_sexp_attr (gstr, "subject", mu_msg_get_subject (msg)); append_sexp_attr (gstr, "subject", mu_msg_get_subject (msg));
/* in the no-headers-only case (see below) we get a more /* in the no-headers-only case (see below) we get a more complete list
* complete list of contacts, so no need to get them here if * of contacts, so no need to get them here if that's the case */
* that's the case */
if (opts & MU_MSG_OPTION_HEADERS_ONLY) if (opts & MU_MSG_OPTION_HEADERS_ONLY)
append_sexp_contacts (gstr, msg); append_sexp_contacts (gstr, msg);