Rebol Programming/build-attach-body

= USAGE: = BUILD-ATTACH-BODY body files boundary

= DESCRIPTION: = Return an email body with attached files.

BUILD-ATTACH-BODY is a function value. = ARGUMENTS =
 * body -- The message body (Type: string)
 * files -- List of files to send [%file1.r [%file2.r "data"]] (Type: block)
 * boundary -- The boundary divider (Type: string)

= SOURCE CODE = build-attach-body: func [ "Return an email body with attached files." body [string!] "The message body" files [block!] {List of files to send [%file1.r [%file2.r "data"]]} boundary [string!] "The boundary divider" /local make-mime-header break-lines file val ][   make-mime-header: func [file] [ net-utils/export context [ Content-Type: join {application/octet-stream; name="} [file {"}] Content-Transfer-Encoding: "base64" Content-Disposition: join {attachment; filename="} [file {" }]       ]    ]     break-lines: func [mesg data /at num] [ num: any [num 72] while [not tail? data] [ append mesg join copy/part data num #"^/" data: skip data num ]        mesg ]    if not empty? files [ insert body reduce [boundary "^/Content-type: text/plain^/^/"] append body "^/^/" if not parse files [ some [ (file: none) [                   set file file! (val: read/binary file) | into [ set file file! set val skip to end ]               ] (                    if file [                        repend body [                            boundary "^/"                             make-mime-header any [find/last/tail file #"/" file]                        ]                         val: either any-string? val [val] [mold :val]                         break-lines body enbase val                    ]                ) ]       ] [net-error "Cannot parse file list."] append body join boundary "--^/" ]    body ]