curl_mime_subparts(3)

πŸ’– curl_mime_subparts(3) β€” Library Functions Manual, but make it cute πŸ’–

okay so bestie, this is the page for curl_mime_subparts(3) from the Library Functions Manual. It's a libcurl function, and it is lowkey iconic for building multipart mime stuff. Let's get into it. πŸŽ€


✨ NAME ✨

curl_mime_subparts β€” set sub-parts of a multipart mime part 😌

🌸 SYNOPSIS 🌸

#include <curl/curl.h>

CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts);

πŸ¦‹ DESCRIPTION πŸ¦‹

okay so curl_mime_subparts(3) literally sets a multipart mime part's content from a mime structure. that's the whole vibe. πŸ’…

part is a handle to the multipart part.

subparts is a mime structure handle holding the sub-parts. After curl_mime_subparts(3) succeeds, that mime structure handle belongs to the multipart part and must not be freed explicitly. It may however be updated by subsequent calls to mime API functions. so yeah, ownership moved, don't touch the free button, periodt. 🫢

Setting a part's contents multiple times is valid: only the value set by the last call is retained. It is possible to unassign previous part's contents by setting subparts to NULL. no cap, that's how you clear it out. 🌈

🧚 PROTOCOLS 🧚

This functionality affects http, imap and smtp ✨

πŸ“ EXAMPLE πŸ“

here's the example, and it is giving "build a multipart alternative part" main character energy πŸ’–

static char *inline_html = "<title>example</title>";
static char *inline_text = "once upon the time";

int main(void)
{
  CURL *curl = curl_easy_init();
  if(curl) {
    struct curl_slist *slist;

    /* The inline part is an alternative proposing the html and the text
       versions of the email. */
    curl_mime *alt = curl_mime_init(curl);
    curl_mimepart *part;

    /* HTML message. */
    part = curl_mime_addpart(alt);
    curl_mime_data(part, inline_html, CURL_ZERO_TERMINATED);
    curl_mime_type(part, "text/html");

    /* Text message. */
    part = curl_mime_addpart(alt);
    curl_mime_data(part, inline_text, CURL_ZERO_TERMINATED);

    /* Create the inline part. */
    part = curl_mime_addpart(alt);
    curl_mime_subparts(part, alt);
    curl_mime_type(part, "multipart/alternative");
    slist = curl_slist_append(NULL, "Content-Disposition: inline");
    curl_mime_headers(part, slist, 1);
  }
}

πŸ‘‘ AVAILABILITY πŸ‘‘

Added in curl 7.56.0 ⭐

πŸ’œ RETURN VALUE πŸ’œ

This function returns a CURLcode indicating success or error.

CURLE_OK (0) means everything was OK, non-zero means an error occurred, see libcurl-errors(3). If CURLOPT_ERRORBUFFER(3) was set with curl_easy_setopt(3) there can be an error message stored in the error buffer when non-zero is returned. so if something goes sideways, check that buffer, bestie 😭

πŸ”₯ SEE ALSO πŸ”₯


xoxo, your libcurl bestie πŸ’– β€” page date: 2026-10-12 πŸŽ€

πŸ“¦ where this page comes from