Subject says it all.

The From: address (as it is called in the sources) in the prompt
will be prepopulated with a suggestion whose value comes from either
the "reverse_name" or "from" configuration variables, the latter
of the two possibly set during an early reply-hook.
From f0056833c193cfce560563c6e26b48300d5b4ca5 Mon Sep 17 00:00:00 2001
From: Mono DHS <mono...@arcor.de>
Date: Mon, 20 Jul 2020 20:22:34 +0200
Subject: [PATCH] Optionally prompt for the From: address in outgoing messages.

---
 doc/manual.xml.head | 23 ++++++++++++-----
 init.h              | 29 +++++++++++++++++++++
 mutt.h              |  3 +++
 send.c              | 73 +++++++++++++++++++++++++++++++++++++++++------------
 4 files changed, 105 insertions(+), 23 deletions(-)

diff --git a/doc/manual.xml.head b/doc/manual.xml.head
index 
5276953059e453592c2832db5abed4ec6a500395..a910dc7de04289e54aaa821a0792eeb1fa0bdfda
 100644
--- a/doc/manual.xml.head
+++ b/doc/manual.xml.head
@@ -1307,8 +1307,9 @@ when you hit <literal>m</literal> to start a new message. 
Next, it will
 ask you for the <quote>Subject:</quote> field for the message, providing
 a default if you are replying to or forwarding a message. You again have
 the chance to adjust recipients, subject, and security settings right
-before actually sending the message. See also <link
-linkend="askcc">$askcc</link>, <link linkend="askbcc">$askbcc</link>,
+before actually sending the message. See also
+<link linkend="askfrom">$askfrom</link>,
+<link linkend="askcc">$askcc</link>, <link linkend="askbcc">$askbcc</link>,
 <link linkend="autoedit">$autoedit</link>, <link
 linkend="bounce">$bounce</link>, <link
 linkend="fast-reply">$fast_reply</link>, and <link
@@ -7162,10 +7163,8 @@ macro index ,a 
"&lt;save-message&gt;=archive&lt;enter&gt;&lt;enter-command&gt;ec
     </listitem>
     <listitem>
       <para>
-        Prompts for To, Cc, Bcc, Subject headers.
-        See <link linkend="askcc">$askcc</link>,
-        <link linkend="askbcc">$askbcc</link>,
-        <link linkend="fast-reply">$fast_reply</link>.
+        <link linkend="reply-hook">reply-hook</link>,
+        if <link linkend="early-reply-hook">$early_reply_hook</link> is set.
       </para>
     </listitem>
     <listitem>
@@ -7178,7 +7177,17 @@ macro index ,a 
"&lt;save-message&gt;=archive&lt;enter&gt;&lt;enter-command&gt;ec
     </listitem>
     <listitem>
       <para>
-        <link linkend="reply-hook">reply-hook</link>
+        Prompts for From, To, Cc, Bcc, Subject headers.
+        See <link linkend="askfrom">$askfrom</link>,
+        <link linkend="askcc">$askcc</link>,
+        <link linkend="askbcc">$askbcc</link>,
+        <link linkend="fast-reply">$fast_reply</link>.
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+        <link linkend="reply-hook">reply-hook</link>,
+        if <link linkend="early-reply-hook">$early_reply_hook</link> is not 
set.
       </para>
     </listitem>
     <listitem>
diff --git a/init.h b/init.h
index 
6cbc30a3ca4423a053b69427cb6e906e33618d60..60b1e90023c65144d11e87c9f105305d86d691ee
 100644
--- a/init.h
+++ b/init.h
@@ -107,6 +107,17 @@ struct option_t MuttVars[] = {
   ** sensitive if the pattern contains at least one upper case letter,
   ** and case insensitive otherwise.
   */
+  { "abort_nofrom",    DT_QUAD, R_NONE, {.l=OPT_ABORTNOFROM}, {.l=MUTT_ASKYES} 
},
+  /*
+  ** .pp
+  ** If set to \fIyes\fP, when composing messages and no sender address
+  ** is given at the sender address prompt, composition will be aborted.
+  ** If set to \fIno\fP, composing messages with no sender address given
+  ** at the sender address prompt continues, but a default sender address
+  ** is used instead.
+  ** .pp
+  ** \fBSee also:\fP $$askfrom, $$from, $$use_from.
+  */
   { "abort_nosubject", DT_QUAD, R_NONE, {.l=OPT_SUBJECT}, {.l=MUTT_ASKYES} },
   /*
   ** .pp
@@ -200,6 +211,14 @@ struct option_t MuttVars[] = {
   ** If \fIset\fP, Mutt will prompt you for carbon-copy (Cc) recipients before
   ** editing the body of an outgoing message.
   */
+  { "askfrom",      DT_BOOL, R_NONE, {.l=OPTASKFROM}, {.l=0} },
+  /*
+  ** .pp
+  ** If \fIset\fP, Mutt will prompt you for the sender address (From) before
+  ** editing the body of an outgoing message.
+  ** .pp
+  ** \fBSee also:\fP $$abort_nofrom.
+  */
   { "assumed_charset", DT_STR, R_NONE, {.p=&AssumedCharset}, {.p=0} },
   /*
   ** .pp
@@ -950,6 +969,16 @@ struct option_t MuttVars[] = {
   ** that it thinks they are duplicates of each other with an equals sign
   ** in the thread tree.
   */
+  { "early_reply_hook",        DT_BOOL, R_NONE, {.l=OPTEARLYREPLYHOOK}, {.l=0} 
},
+  /*
+  ** .pp
+  ** This variable controls whether Mutt will apply the \fCreply-hook\fP
+  ** \fIbefore\fP it consults $$from to temporarily set the sender address 
(From)
+  ** and gives the user the opportunity to edit the envelope
+  ** of an outgoing message.
+  ** .pp
+  ** \fBSee also:\fP $compose-flow, $$askfrom, $$from
+  */
   { "edit_headers",    DT_BOOL, R_NONE, {.l=OPTEDITHDRS}, {.l=0} },
   /*
   ** .pp
diff --git a/mutt.h b/mutt.h
index 
4413739ff0748215807e8a7d3e9d803bdeabd26e..e8979db15aa487e60f42f26ad2aacfad1fc302f7
 100644
--- a/mutt.h
+++ b/mutt.h
@@ -310,6 +310,7 @@ enum
 {
   OPT_ABORT,
   OPT_ABORTNOATTACH,
+  OPT_ABORTNOFROM,
   OPT_BOUNCE,
   OPT_COPY,
   OPT_DELETE,
@@ -381,6 +382,7 @@ enum
   OPTASCIICHARS,
   OPTASKBCC,
   OPTASKCC,
+  OPTASKFROM,
   OPTATTACHSPLIT,
 #ifdef USE_AUTOCRYPT
   OPTAUTOCRYPT,
@@ -407,6 +409,7 @@ enum
   OPTDELETEUNTAG,
   OPTDIGESTCOLLAPSE,
   OPTDUPTHREADS,
+  OPTEARLYREPLYHOOK,
   OPTEDITHDRS,
   OPTENCODEFROM,
   OPTENVFROM,
diff --git a/send.c b/send.c
index 
44e34feaaa3adc0a4e8bdbef9fe3bffc85cbf474..7a760b8c66f93573e82838e15242aa9efcfcb231
 100644
--- a/send.c
+++ b/send.c
@@ -225,11 +225,41 @@ int mutt_edit_address (ADDRESS **a, const char *field, 
int expand_aliases)
   return 0;
 }
 
-static int edit_envelope (ENVELOPE *en)
+static int edit_envelope (ENVELOPE *en, int * killfrom)
 {
   char buf[HUGE_STRING];
   LIST *uh = UserHeader;
 
+  if (option (OPTASKFROM)) {
+
+    if (mutt_edit_address(&en->from, _("From: "), 1) == -1)
+      return (-1);
+
+    if (en->from == NULL) {
+
+      int b = query_quadoption(OPT_ABORTNOFROM, _("No sender address, 
abort?"));
+      if (b != MUTT_NO)
+        return (-1);
+
+      /* Proceeding with no From: address does not really
+       * make much sense here, so we understand the empty
+       * address to mean to fall back to whatever default
+       * From: address Mutt is capable to come up with
+       * further down in the message composition process.
+       */
+      en->from = rfc822_new_address();
+      (*killfrom) = 1;
+
+    } else {
+
+      /* Only if the user specified a proper address do
+       * we instruct Mutt to not touch the From: address
+       * for the outgoing message.
+       */
+      (*killfrom) = 0;
+    }
+  }
+
   if (mutt_edit_address (&en->to, _("To: "), 1) == -1 || en->to == NULL)
     return (-1);
   if (option (OPTASKCC) && mutt_edit_address (&en->cc, _("Cc: "), 1) == -1)
@@ -1949,26 +1979,38 @@ static int send_message_setup (SEND_CONTEXT *sctx, 
const char *tempfile,
     if (sctx->flags & SENDREPLY)
       mutt_fix_reply_recipients (sctx->msg->env);
 
-    if (! (sctx->flags & (SENDMAILX|SENDBATCH)) &&
-       ! (option (OPTAUTOEDIT) && option (OPTEDITHDRS)) &&
-       ! ((sctx->flags & SENDREPLY) && option (OPTFASTREPLY)))
-    {
-      if (edit_envelope (sctx->msg->env) == -1)
-       goto cleanup;
+    /* An early application of the reply-hook based on $early_reply_hook
+     * makes scenarios possible in which the reply-hook is first applied
+     * here and then again at its traditional point further down below
+     * by clearing $early_reply_hook here and setting it there again.
+     */
+    if (option(OPTEARLYREPLYHOOK) && (sctx->flags & SENDREPLY) && sctx->cur) {
+        mutt_message_hook (ctx, sctx->cur, MUTT_REPLYHOOK);
+        sctx->msg->replied = 1;
     }
 
-    /* the from address must be set here regardless of whether or not
-     * $use_from is set so that the `~P' (from you) operator in send-hook
-     * patterns will work.  if $use_from is unset, the from address is killed
-     * after send-hooks are evaluated */
-
+    /* The From: address should be set before giving the user the
+     * opportunity to edit the envelope and must be set before applying
+     * any hooks on the new message, regardless of whether or not $use_from
+     * is set so that the `~P' (from you) operator in send-hook patterns will
+     * work.  If $use_from is unset, the From: address is killed after
+     * send-hooks are evaluated.
+     */
     if (!sctx->msg->env->from)
     {
       sctx->msg->env->from = mutt_default_from ();
       killfrom = 1;
     }
 
-    if ((sctx->flags & SENDREPLY) && sctx->cur)
+    if (! (sctx->flags & (SENDMAILX|SENDBATCH)) &&
+       ! (option (OPTAUTOEDIT) && option (OPTEDITHDRS)) &&
+       ! ((sctx->flags & SENDREPLY) && option (OPTFASTREPLY)))
+    {
+      if (edit_envelope (sctx->msg->env, &killfrom) == -1)
+       goto cleanup;
+    }
+
+    if (!option(OPTEARLYREPLYHOOK) && (sctx->flags & SENDREPLY) && sctx->cur)
     {
       /* change setting based upon message we are replying to */
       mutt_message_hook (ctx, sctx->cur, MUTT_REPLYHOOK);
@@ -1997,9 +2039,8 @@ static int send_message_setup (SEND_CONTEXT *sctx, const 
char *tempfile,
     if (killfrom)
     {
       rfc822_free_address (&sctx->msg->env->from);
-      if (option (OPTUSEFROM) && !(sctx->flags & (SENDPOSTPONED|SENDRESEND)))
-       sctx->msg->env->from = mutt_default_from ();
-      killfrom = 0;
+      if (option (OPTUSEFROM))
+        sctx->msg->env->from = mutt_default_from ();
     }
 
     if (option (OPTHDRS))
-- 
2.11.0

Attachment: signature.asc
Description: PGP signature

Reply via email to