git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] imap-send: add --draft to set IMAP \Draft flag

From
Aditya Garg <gargaditya08@live.com>
Date
Sep 3, 2026, 05:42 UTC
Message-ID
<MAUPR01MB1154649CE9D154B98459B09CEB8B62@MAUPR01MB11546.INDPRD01.PROD.OUTLOOK.COM>
In-Reply-To
<761c3f1b-e280-48b1-a2ad-770b68be3434@slotpi01m90>
I'm not sure if its acceptable to use newer versions of curl.
This patch was rejected because of this reason: https://lore.kernel.org/git/7108764f437a25079c95a25c227eb79f9f4aee6a.1753273554.git.gargaditya08@live.com/
On 02/09/26 5:43 am, Wolfgang Faust wrote:
Show 113 quoted lines
> The documented purpose of imap-send is to upload draft emails for sending
> later, but it did not have any way to mark the messages as \Draft, so some
> email clients presented the result as an un-editable, un-sendable email
> even if it happened to be in a "Drafts" folder.
> 
> Signed-off-by: Wolfgang Faust <contrib-git@wolfgangfaust.com>
> ---
>  Documentation/git-imap-send.adoc |  9 ++++++++-
>  git-curl-compat.h                |  8 ++++++++
>  imap-send.c                      | 15 +++++++++++++--
>  3 files changed, 29 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/git-imap-send.adoc b/Documentation/git-imap-send.adoc
> index 1814d94491..cf415df45a 100644
> --- a/Documentation/git-imap-send.adoc
> +++ b/Documentation/git-imap-send.adoc
> @@ -9,7 +9,7 @@ git-imap-send - Send a collection of patches from stdin to an IMAP folder
>  SYNOPSIS
>  --------
>  [synopsis]
> -git imap-send [-v] [-q] [--[no-]curl] [(--folder|-f) <folder>]
> +git imap-send [-v] [-q] [--[no-]curl] [--[no-]draft] [(--folder|-f) <folder>]
>  git imap-send --list
>  
>  
> @@ -55,6 +55,13 @@ OPTIONS
>  	using libcurl.  Ignored if Git was built with the NO_OPENSSL option
>  	set.
>  
> +`--draft`::
> +`--no-draft`::
> +	Mark uploaded messages with the IMAP `\Draft` flag. The default is `--no-draft`.
> ++
> +With libcurl, `--draft` requires version 8.13.0 or later.
> +Older libcurl still uploads the message but cannot set the flag.
> +
>  `--list`::
>  	Run the IMAP LIST command to output a list of all the folders present.
>  
> diff --git a/git-curl-compat.h b/git-curl-compat.h
> index dccdd4d6e5..032aaf7126 100644
> --- a/git-curl-compat.h
> +++ b/git-curl-compat.h
> @@ -67,4 +67,12 @@
>  #define GIT_CURL_HAVE_CURLOPT_TCP_KEEPCNT
>  #endif
>  
> +/**
> + * CURLOPT_UPLOAD_FLAGS and CURLULFLAG_* were added in 8.13.0,
> + * released in April 2025.
> + */
> +#if LIBCURL_VERSION_NUM >= 0x080D00
> +#define GIT_CURL_HAVE_CURLOPT_UPLOAD_FLAGS
> +#endif
> +
>  #endif
> diff --git a/imap-send.c b/imap-send.c
> index 0d16d02029..bf1d2cf74d 100644
> --- a/imap-send.c
> +++ b/imap-send.c
> @@ -35,6 +35,7 @@
>  #include "setup.h"
>  #include "strbuf.h"
>  #ifdef USE_CURL_FOR_IMAP_SEND
> +#include "git-curl-compat.h"
>  #include "http.h"
>  #endif
>  
> @@ -49,10 +50,11 @@
>  static int verbosity;
>  static int list_folders;
>  static int use_curl = USE_CURL_DEFAULT;
> +static int opt_draft;
>  static char *opt_folder;
>  
>  static char const * const imap_send_usage[] = {
> -	N_("git imap-send [-v] [-q] [--[no-]curl] [(--folder|-f) <folder>] < <mbox>"),
> +	N_("git imap-send [-v] [-q] [--[no-]curl] [--[no-]draft] [(--folder|-f) <folder>] < <mbox>"),
>  	"git imap-send --list",
>  	NULL
>  };
> @@ -60,6 +62,7 @@ static char const * const imap_send_usage[] = {
>  static struct option imap_send_options[] = {
>  	OPT__VERBOSITY(&verbosity),
>  	OPT_BOOL(0, "curl", &use_curl, "use libcurl to communicate with the IMAP server"),
> +	OPT_BOOL(0, "draft", &opt_draft, "mark uploaded messages with the IMAP \\Draft flag"),
>  	OPT_STRING('f', "folder", &opt_folder, "folder", "specify the IMAP folder"),
>  	OPT_BOOL(0, "list", &list_folders, "list all folders on the IMAP server"),
>  	OPT_END()
> @@ -1416,7 +1419,8 @@ static int imap_store_msg(struct imap_store *ctx, struct strbuf *msg)
>  
>  	box = ctx->name;
>  	prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
> -	ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" ", prefix, box);
> +	ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" %s", prefix, box,
> +			  opt_draft ? "(\\Draft) " : "");
>  	imap->caps = imap->rcaps;
>  	if (ret != DRV_OK)
>  		return ret;
> @@ -1718,6 +1722,13 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
>  
>  	curl_easy_setopt(curl, CURLOPT_READDATA, &msgbuf);
>  
> +	if (opt_draft) {
> +#ifdef GIT_CURL_HAVE_CURLOPT_UPLOAD_FLAGS
> +		curl_easy_setopt(curl, CURLOPT_UPLOAD_FLAGS, CURLULFLAG_DRAFT);
> +#else
> +		warning("--draft requires libcurl 8.13.0 or later");
> +#endif
> +	}
>  	fprintf(stderr, "Sending %d message%s to %s folder...\n",
>  		total, (total != 1) ? "s" : "", server->folder);
>  	while (1) {
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 7 in “imap-send: add --draft to set IMAP \Draft flag”
  1. imap-send: add --draft to set IMAP \Draft flagWolfgang Faust, Sep 2, 2026
  2. Junio C HamanoSep 2, 2026
  3. Wolfgang FaustSep 2, 2026
  4. Junio C HamanoSep 2, 2026
  5. Aditya GargSep 3, 2026
  6. Junio C HamanoSep 3, 2026
  7. Aditya GargSep 3, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.