CURLOPT_UPLOAD_FLAGS(3) Library Functions Manual CURLOPT_UPLOAD_FLAGS(3)

CURLOPT_UPLOAD_FLAGS - upload flags for IMAP

#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD_FLAGS, long bitmask);

Pass a long as parameter, which is set to a bitmask, to tell libcurl which flags to send the server relating to uploaded files. The currently supported flags are:

Sets the Answered flag for IMAP uploads. Indicates that the message has been replied to.
Sets the Deleted flag for IMAP uploads. Marks the message for deletion rather than immediately removing it.
Sets the Draft flag for IMAP uploads. Marks the message as an uncompleted composition.
Sets the Flagged flag for IMAP uploads. Marks the message for special attention.
Sets the Seen flag for IMAP uploads. Marks the message as read.

A bitmask with only the CURLULFLAG_SEEN flag set.

This functionality affects imap and imaps

static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
{
  FILE *src = userdata;
  /* copy as much data as possible into the 'ptr' buffer, but no more than
     'size' * 'nmemb' bytes */
  size_t retcode = fread(ptr, size, nmemb, src);
  return retcode;
}
int main(void)
{
  CURL *curl;
  FILE *src = fopen("local-file", "r");
  if(!src)
    return 1;
  curl = curl_easy_init();
  if(curl) {
    CURLcode result;
    curl_off_t fsize = 9876; /* set this to the size of the input file */
    /* we want to use our own read function */
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
    /* enable uploading */
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
    /* specify target */
    curl_easy_setopt(curl, CURLOPT_URL, "imap://example.com:993/mailbox");
    /* provide username */
    curl_easy_setopt(curl, CURLOPT_USERNAME, "user@example.com");
    /* provide password */
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");
    /* specify that uploaded mail should be considered flagged */
    curl_easy_setopt(curl, CURLOPT_UPLOAD_FLAGS, CURLULFLAG_FLAGGED);
    /* now specify which pointer to pass to our callback */
    curl_easy_setopt(curl, CURLOPT_READDATA, src);
    /* Set the size of the file to upload */
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize);
    /* perform the upload */
    result = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
  fclose(src);
}

Added in curl 8.13.0

curl_easy_setopt(3) returns a CURLcode indicating success or error.

CURLE_OK (0) means everything was OK, non-zero means an error occurred, see libcurl-errors(3).

CURLOPT_UPLOAD(3)

2026-06-24 libcurl