e.g. text/html; charset="utf-8"
7-bit ASCII like e.g. z84d86635fa691af3d9d7d9436cc5d44018a7bc8
An empty Content-Type: multipart/mixed parts container.
The primary subtype for multipart, "mixed", is intended for use when the body parts are independent and intended to be displayed serially. Any multipart subtypes that an implementation does not recognize should be treated as being of subtype "mixed". https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
An empty Content-Type: multipart/alternative parts container.
each of the parts is an "alternative" version of the same information. User agents should recognize that the content of the various parts are interchangeable. The user agent should either choose the "best" type based on the user's environment and preferences, or offer the user the available alternatives. In general, choosing the best type means displaying only the LAST part that can be displayed. https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
In the following multipart, the "best" type is text/html
Multipart.alternative (Multipart.boundary "boundary-string")
|> Multipart.addStringPart "text/plain; charset=\"utf-8\"" textHeaders textContent
|> Multipart.addStringPart "text/html; charset=\"utf-8\"" htmlHeaders htmlContent
|> Multipart.stringAn empty Content-Type: multipart/{{subtype}} parts container. Where {{subtype}}
is any String you supply
See https://en.wikipedia.org/wiki/MIME#Multipart_subtypes
Multipart.subtype "related" (Multipart.boundary "boundary-string")
|> Multipart.addStringPart "text/css; charset=\"utf-8\"" cssHeaders cssContent
|> Multipart.addStringPart "text/html; charset=\"utf-8\"" htmlHeaders htmlContent
|> Multipart.stringAdd a section to a Multipart value
Multipart.mixed (Multipart.boundary "boundary-string")
|> Multipart.addStringPart "text/plain" [] "hello world!"
|> Multipart.string
--> "Content-Type: text/plain\r\n\r\nhello world!"A Multipart with more than 1 part carries Content-Type header of multipart/alternative
Multipart.alternative (Multipart.boundary "boundary-string")
|> Multipart.addStringPart "text/plain" [] "hello world!"
|> Multipart.addStringPart "text/html" [] "<p>hello world!</p>"
|> Multipart.string
--> "Content-Type: multipart/alternative; boundary=\"boundary-string\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--boundary-string\r\nContent-Type: text/plain\r\n\r\nhello world!\r\n\r\n--boundary-string\r\nContent-Type: text/html\r\n\r\n<p>hello world!</p>\r\n\r\n--boundary-string--"Embeds another multipart into an outer multipart. The
Multipart.mixed (Multipart.boundary "boundary-string111")
|> Multipart.addStringPart "text/plain" [] "hello world!"
|> Multipart.addMultipart
(Multipart.alternative (Multipart.boundary "boundary-string222")
|> Multipart.addStringPart "text/plain" [] "hello world!"
|> Multipart.addStringPart "text/html" [] "<p>hello world!</p>"
)
|> Multipart.string
--> "Content-Type: multipart/mixed; boundary=\"boundary-string111\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--boundary-string111\r\nContent-Type: text/plain\r\n\r\nhello world!\r\n\r\n--boundary-string111\r\nContent-Type: multipart/alternative; boundary=\"boundary-string222\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n--boundary-string222\r\nContent-Type: text/plain\r\n\r\nhello world!\r\n\r\n--boundary-string222\r\nContent-Type: text/html\r\n\r\n<p>hello world!</p>\r\n\r\n--boundary-string222--\r\n\r\n--boundary-string111--"
use the
stringfunction to convert aMultipartvalue into aString