Reworked the man page system and some man page contents (mmh-intro).
[mmh] / man / mhbuild.man1
diff --git a/man/mhbuild.man1 b/man/mhbuild.man1
new file mode 100644 (file)
index 0000000..9a78e02
--- /dev/null
@@ -0,0 +1,688 @@
+.\"
+.\" %nmhwarning%
+.\"
+.TH MHBUILD %manext1% "%nmhdate%" MH.6.8 [%nmhversion%]
+.SH NAME
+mhbuild \- translate MIME composition draft
+.SH SYNOPSIS
+.na
+.HP 5
+.B mhbuild
+.I file
+.RB [ \-list " | " \-nolist ]
+.RB [ \-realsize " | " \-norealsize ]
+.RB [ \-headers " | " \-noheaders ]
+.RB [ \-ebcdicsafe " | " \-noebcdicsafe ]
+.RB [ \-rfc934mode " | " \-norfc934mode ]
+.RB [ \-contentid " | " \-nocontentid ]
+.RB [ \-verbose " | " \-noverbose ]
+.RB [ \-check " | " \-nocheck ]
+.RB [ \-version ]
+.RB [ \-help ]
+.ad
+.SH DESCRIPTION
+The
+.B mhbuild
+command will translate a MIME composition draft into
+a valid MIME message.
+.PP
+.B mhbuild
+creates multi-media messages as specified in RFC\-2045
+thru RFC\-2049.  Currently
+.B mhbuild
+only supports encodings in
+message bodies, and does not support the encoding of message headers as
+specified in RFC\-2047.
+.PP
+If you specify the name of the composition file as \*(lq-\*(rq,
+then
+.B mhbuild
+will accept the composition draft on the standard
+input.  If the translation of this input is successful,
+.B mhbuild
+will output the new MIME message to the standard output.  This argument
+must be the last argument on the command line.
+.PP
+Otherwise if the file argument to
+.B mhbuild
+is the name of a valid
+composition file, and the translation is successful,
+.B mhbuild
+will replace the original file with the new MIME message.  It will rename
+the original file to start with the \*(lq,\*(rq character and end with the
+string \*(lq.orig\*(rq, e.g., if you are editing the file \*(lqdraft\*(rq,
+it will be renamed to \*(lq,draft.orig\*(rq.  This allows you to easily
+recover the
+.B mhbuild
+input file.
+.SS "Listing the Contents"
+The
+.B \-list
+switch tells
+.B mhbuild
+to list the table of contents associated with the MIME message that is created.
+.PP
+The
+.B \-headers
+switch indicates
+that a one-line banner should be displayed above the listing.  The
+.B \-realsize
+switch tells
+.B mhbuild
+to evaluate the \*(lqnative\*(rq
+(decoded) format of each content prior to listing.  This provides an
+accurate count at the expense of a small delay.  If the
+.B \-verbose
+switch
+is present, then the listing will show any \*(lqextra\*(rq information
+that is present in the message, such as comments in the
+\*(lqContent-Type\*(rq header.
+.SS "Translating the Composition File"
+.B mhbuild
+is essentially a filter to aid in the composition of MIME
+messages.
+.B mhbuild
+will convert an
+.B mhbuild
+\*(lqcomposition file\*(rq
+into a valid MIME message.  A
+.B mhbuild
+\*(lqcomposition file\*(rq
+is just a file containing plain text that is interspersed
+with various
+.B mhbuild
+directives.  When this file is processed
+by
+.BR mhbuild ,
+the various directives will be expanded to the
+appropriate content, and will be encoded according to the MIME standards.
+The resulting MIME message can then be sent by electronic mail.
+.PP
+The formal syntax for a
+.B mhbuild
+composition file is defined at the
+end of this document, but the ideas behind this format are not complex.
+Basically, the body contains one or more contents.  A content consists of
+either a directive, indicated with a \*(lq#\*(rq as the first character
+of a line; or, plaintext (one or more lines of text).  The continuation
+character, \*(lq\\\*(lq, may be used to enter a single directive on more
+than one line, e.g.,
+.PP
+.RS 5
+.nf
+#image/png \\
+    /home/foobar/junk/picture.png
+.fi
+.RE
+.PP
+There are four kinds of directives: \*(lqtype\*(rq directives, which
+name the type and subtype of the content; \*(lqexternal-type\*(rq
+directives, which also name the type and subtype of the content; the
+\*(lqmessage\*(rq directive (#forw), which is used to forward one or
+more messages; and, the \*(lqbegin\*(rq directive (#begin), which is
+used to create a multipart content.
+.PP
+The \*(lqtype\*(rq directive is used to directly specify the type and
+subtype of a content.  You may only specify discrete types in this manner
+(can't specify the types multipart or message with this directive).
+You may optionally specify the name of a file containing the contents
+in \*(lqnative\*(rq (decoded) format.  If this filename starts with the
+\*(lq|\*(rq character, then it represents a command to execute whose
+output is captured accordingly.
+For example,
+.PP
+.RS 5
+.nf
+#audio/basic |raw2audio -F < /usr/lib/sound/giggle.au
+.fi
+.RE
+.PP
+If a filename is not given,
+.B mhbuild
+will look for information in the
+user's profile to determine how the different contents should be composed.
+This is accomplished by consulting a composition string, and executing
+it under
+.BR /bin/sh ,
+with the standard output set to the content.
+If the
+.B \-verbose
+switch is given,
+.B mhbuild
+will echo any commands that are used to create contents in this way.
+.PP
+The composition string may contain the following escapes:
+.PP
+.RS 5
+.nf
+.ta \w'%P  'u
+%a     Insert parameters from directive
+%f     Insert filename containing content
+%F     %f, and stdout is not re-directed
+%s     Insert content subtype
+%%     Insert character %
+.fi
+.RE
+.PP
+First,
+.B mhbuild
+will look for an entry of the form:
+.PP
+.RS 5
+mhbuild-compose-<type>/<subtype>
+.RE
+.PP
+to determine the command to use to compose the content.  If this isn't
+found,
+.B mhbuild
+will look for an entry of the form:
+.PP
+.RS 5
+mhbuild-compose-<type>
+.RE
+.PP
+to determine the composition command. If this isn't found,
+.B mhbuild
+will complain.
+.PP
+An example entry might be:
+.PP
+.RS 5
+mhbuild-compose-audio/basic: record | raw2audio -F
+.RE
+.PP
+Because commands like these will vary, depending on the display
+environment used for login, composition strings for different
+contents should probably be put in the file specified by the
+.B $MHBUILD
+environment variable, instead of directly in your
+user profile.
+.PP
+The \*(lqexternal-type\*(rq directives are used to provide a MIME
+reference to a content, rather than enclosing the contents itself
+(for instance, by specifying an ftp site).  Hence, instead of
+providing a filename as with the type directives, external-parameters
+are supplied.  These look like regular parameters, so they must be
+separated accordingly.  For example,
+.PP
+.RS 5
+.nf
+#@application/octet-stream; \\
+    type=tar; \\
+    conversions=compress \\
+    [this is the nmh distribution] \\
+    {application; filename="nmh.tar.gz"} \\
+    name="nmh.tar.gz"; \\
+    directory="/pub/nmh"; \\
+    site="ftp.math.gatech.edu"; \\
+    access-type=anon-ftp; \\
+    mode="image"
+.fi
+.RE
+.PP
+You must give a description string to separate the content parameters
+from the external-parameters (although this string may be empty).
+This description string is specified by enclosing it within
+\*(lq[]\*(rq.  A disposition string, to appear in a
+\*(lqContent-Disposition\*(rq header, may appear in the optional
+\*(lq{}\*(rq.
+.PP
+These parameters are of the form:
+.PP
+.RS 5
+.nf
+.ta \w'access-type=  'u
+access-type=   usually \fIanon-ftp\fR or \fImail-server\fR
+name=  filename
+permission=    read-only or read-write
+site=  hostname
+directory=     directoryname (optional)
+mode=  usually \fIascii\fR or \fIimage\fR (optional)
+size=  number of octets
+server=        mailbox
+subject=       subject to send
+body=  command to send for retrieval
+.fi
+.RE
+.PP
+The \*(lqmessage\*(rq directive (#forw) is used to specify a message or
+group of messages to include.  You may optionally specify the name of
+the folder and which messages are to be forwarded.  If a folder is not
+given, it defaults to the current folder.  Similarly, if a message is not
+given, it defaults to the current message.  Hence, the message directive
+is similar to the
+.B forw
+command, except that the former uses
+the MIME rules for encapsulation rather than those specified in RFC\-934.
+For example,
+.PP
+.RS 5
+.nf
+#forw +inbox 42 43 99
+.fi
+.RE
+.PP
+If you include a single message, it will be included directly as a content
+of type \*(lqmessage/rfc822\*(rq.  If you include more than one message,
+then
+.B mhbuild
+will add a content of type \*(lqmultipart/digest\*(rq
+and include each message as a subpart of this content.
+.PP
+If you are using this directive to include more than one message, you
+may use the
+.B \-rfc934mode
+switch.  This switch will indicate that
+.B mhbuild
+should attempt to utilize the MIME encapsulation rules
+in such a way that the \*(lqmultipart/digest\*(rq that is created
+is (mostly) compatible with the encapsulation specified in RFC\-934.
+If given, then RFC\-934 compliant user-agents should be able to burst the
+message on reception\0--\0providing that the messages being encapsulated
+do not contain encapsulated messages themselves.  The drawback of this
+approach is that the encapsulations are generated by placing an extra
+newline at the end of the body of each message.
+.PP
+The \*(lqbegin\*(rq directive is used to create a multipart content.
+When using the \*(lqbegin\*(rq directive, you must specify at least one
+content between the begin and end pairs.
+.PP
+.RS 5
+.nf
+#begin
+This will be a multipart with only one part.
+#end
+.fi
+.RE
+.PP
+If you use multiple directives in a composition draft,
+.B mhbuild
+will
+automatically encapsulate them inside a multipart content.  Therefore the
+\*(lqbegin\*(rq directive is only necessary if you wish to use nested
+multiparts, or create a multipart message containing only one part.
+.PP
+For all of these directives, the user may include a brief description
+of the content between the \*(lq[\*(rq character and the \*(lq]\*(rq
+character.  This description will be copied into the
+\*(lqContent-Description\*(rq header when the directive is processed.
+.PP
+.RS 5
+.nf
+#forw [important mail from Bob] +bob 1 2 3 4 5
+.fi
+.RE
+.PP
+Similarly, a disposition string may optionally be provided between
+\*(lq{\*(rq and \*(lq}\*(rq characters; it will be copied into the
+\*(lqContent-Disposition\*(rq header when the directive is processed.
+If a disposition string is provided that does not contain a filename
+parameter, and a filename is provided in the directive, it will be
+added to the \*(lqContent-Disposition\*(rq header.  For example, the
+following directive:
+.PP
+.RS 5
+.nf
+#text/plain; charset=iso-8859-1 <>{attachment} /tmp/summary.txt
+.fi
+.RE
+.PP
+creates these message part headers:
+.PP
+.RS 5
+.nf
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Disposition: attachment; filename="summary.txt"
+.fi
+.RE
+.PP
+By default,
+.B mhbuild
+will generate a unique \*(lqContent-ID:\*(rq for each directive,
+corresponding to each message part; however, the user may override
+this by defining the ID using the \*(lq<\*(rq and \*(lq>\*(rq
+characters.  The
+.B \-nocontentid
+switch suppresses creation of all \*(lqContent-ID:\*(rq headers,
+even in the top level of the message.
+.PP
+In addition to the various directives, plaintext can be present.
+Plaintext is gathered, until a directive is found or the draft is
+exhausted, and this is made to form a text content.  If the plaintext
+must contain a \*(lq#\*(rq at the beginning of a line, simply double it,
+e.g.,
+.PP
+.RS 5
+##when sent, this line will start with only one #
+.RE
+.PP
+If you want to end the plaintext prior to a directive, e.g., to have two
+plaintext contents adjacent, simply insert a line containing a single
+\*(lq#\*(rq character, e.g.,
+.PP
+.RS 5
+.nf
+this is the first content
+#
+and this is the second
+.fi
+.RE
+.PP
+Finally, if the plaintext starts with a line of the form:
+.PP
+.RS 5
+Content-Description: text
+.RE
+.PP
+then this will be used to describe the plaintext content.
+You MUST follow this line with a blank line before starting
+your text.
+.PP
+By default, plaintext is captured as a text/plain content.  You can
+override this by starting the plaintext with \*(lq#<\*(rq followed by
+a content-type specification.  For example, e.g.,
+.PP
+.RS 5
+.nf
+#<text/enriched
+this content will be tagged as text/enriched
+#
+and this content will be tagged as text/plain
+#
+#<application/x-patch [this is a patch]
+and this content will be tagged as application/x-patch
+.fi
+.RE
+.PP
+Note that if you use the \*(lq#<\*(rq plaintext-form, then the
+content-description must be on the same line which identifies the content
+type of the plaintext.
+.PP
+When composing a text content, you may indicate the relevant character
+set by adding the \*(lqcharset\*(rq parameter to the directive.
+.PP
+.RS 5
+#<text/plain; charset=iso-8859-5
+.RE
+.PP
+If a text content contains any 8\-bit characters (characters with the
+high bit set) and the character set is not specified as above, then
+.B mhbuild
+will assume the character set is of the type given by the
+environment variable MM_CHARSET.  If this environment variable is not
+set, then the character set will be labeled as \*(lqx-unknown\*(rq.
+.PP
+If a text content contains only 7\-bit characters and the character set
+is not specified as above, then the character set will be labeled as
+\*(lqus-ascii\*(rq.
+.PP
+Putting this all together,
+here is an example of a more complicated message draft.  The
+following draft will expand into a multipart/mixed message
+containing five parts:
+.PP
+.RS 5
+.nf
+To: nobody@nowhere.org
+cc:
+Subject: Look and listen to me!
+--------
+The first part will be text/plain
+#<text/enriched
+The second part will be text/enriched
+#
+This third part will be text/plain
+#audio/basic [silly giggle]  \\
+    |raw2audio -F < /usr/lib/sounds/giggle.au
+#image/gif   [photo of foobar] \\
+                    /home/foobar/lib/picture.gif
+.fi
+.RE
+.SS "Integrity Check"
+If
+.B mhbuild
+is given the
+.B \-check
+switch, then it will also associate
+an integrity check with each \*(lqleaf\*(rq content.  This will add a
+Content-MD5 header field to the content, along with the md5 sum of the
+unencoded contents.  This may be used by the receiver of the message to
+verify that the contents of the message were not changed in transport.
+
+.SS "Transfer Encodings"
+After
+.B mhbuild
+constructs the new MIME message by parsing directives,
+including files, etc., it scans the contents of the message to determine
+which transfer encoding to use.  It will check for 8bit data, long lines,
+spaces at the end of lines, and clashes with multipart boundaries.  It will
+then choose a transfer encoding appropriate for each content type.
+.PP
+If an integrity check is being associated with each content by using
+the
+.B \-check
+switch, then
+.B mhbuild
+will encode each content with
+a transfer encoding, even it the content contains only 7\-bit data.  This
+is to increase the likelihood that the content is not changed while in
+transport.
+.PP
+The switch
+.B \-ebcdicsafe
+will cause
+.B mhbuild
+to slightly change
+the way in which it performs the \*(lqquoted-printable\*(rq transfer
+encoding.  Along with encoding 8\-bit characters, it will now also encode
+certain common punctuation characters as well.  This slightly reduces the
+readability of the message, but allows the message to pass more reliably
+through mail gateways which involve the EBCDIC character encoding.
+
+.SS "Invoking mhbuild"
+Typically,
+.B mhbuild
+ is invoked by the
+.B whatnow
+program.  This
+command will expect the body of the draft to be formatted as an
+.B mhbuild
+composition file.  Once you have composed this input file
+using a command such as
+.BR comp ,
+.BR repl ,
+or
+.BR forw ,
+you invoke
+.B mhbuild
+at the \*(lqWhat now\*(rq prompt with
+.PP
+.RS 5
+What now? mime
+.RE
+.PP
+prior to sending the draft.  This will cause
+.B whatnow
+to execute
+.B mhbuild
+to translate the composition file into MIME format.
+.PP
+It is also possible to have the
+.B whatnow
+program invoke
+.B mhbuild
+automatically when a message is sent.  To do this, you must add the line
+.PP
+.RS 5
+automimeproc: 1
+.RE
+.PP
+to your
+.I .mmh/profile
+file.
+.PP
+Finally, you should consider adding this line to your profile:
+.PP
+.RS 5
+lproc: show
+.RE
+.PP
+This way, if you decide to
+.B list
+after invoking
+.BR mime ,
+the command
+.PP
+.RS 5
+What now? list
+.RE
+.PP
+will work as you expect.
+
+.SS "User Environment"
+Because the environment in which
+.B mhbuild
+operates may vary for a
+user,
+.B mhbuild
+will look for the environment variable
+.BR $MHBUILD .
+If present, this specifies the name of an additional user profile which
+should be read.  Hence, when a user logs in on a particular machine,
+this environment variable should be set to refer to a file containing
+definitions useful for that machine.
+.PP
+Finally,
+.B mhbuild
+will attempt to consult a global
+.B mhbuild
+user profile, e.g.,
+.PP
+.RS 5
+%etcdir%/mhn.defaults
+.RE
+.PP
+if it exists.
+
+.SS "Syntax of Composition Files"
+The following is the formal syntax of a
+.B mhbuild
+\*(lqcomposition file\*(rq.
+.PP
+.RS 5
+.nf
+body         ::=     1*(content | EOL)
+
+content      ::=     directive | plaintext
+
+directive    ::=     "#" type "/" subtype
+                         0*(";" attribute "=" value)
+                         [ "(" comment ")" ]
+                         [ "<" id ">" ]
+                         [ "[" description "]" ]
+                         [ "{" disposition "}" ]
+                         [ filename ]
+                         EOL
+
+                   | "#@" type "/" subtype
+                         0*(";" attribute "=" value)
+                         [ "(" comment ")" ]
+                         [ "<" id ">" ]
+                         [ "[" description "]" ]
+                         [ "{" disposition "}" ]
+                         external-parameters
+                         EOL
+
+                   | "#forw"
+                         [ "<" id ">" ]
+                         [ "[" description "]" ]
+                         [ "{" disposition "}" ]
+                         [ "+"folder ] [ 0*msg ]
+                         EOL
+
+                   | "#begin"
+                           [ "<" id ">" ]
+                           [ "[" description "]" ]
+                           [ "{" disposition "}" ]
+                           [   "alternative"
+                             | "parallel"
+                             | something-else    ]
+                           EOL
+                         1*body
+                     "#end" EOL
+
+plaintext    ::=     [ "Content-Description:"
+                           description EOL EOL ]
+                         1*line
+                     [ "#" EOL ]
+
+                   | "#<" type "/" subtype
+                         0*(";" attribute "=" value)
+                         [ "(" comment ")" ]
+                         [ "[" description "]" ]
+                         [ "{" disposition "}" ]
+                         EOL
+                         1*line
+                     [ "#" EOL ]
+
+line         ::=     "##" text EOL
+                     -- interpreted as "#"text EOL
+                   | text EOL
+.fi
+.RE
+.PP
+
+.SH FILES
+.fc ^ ~
+.nf
+.ta \w'%etcdir%/ExtraBigFileName  'u
+^$HOME/.mmh/profile~^The user profile
+^$MHBUILD~^Additional profile entries
+^%etcdir%/mhn.defaults~^System default MIME profile entries
+.fi
+
+.SH "PROFILE COMPONENTS"
+.fc ^ ~
+.nf
+.ta 2.4i
+.ta \w'ExtraBigProfileName  'u
+^Path:~^To determine the user's mail storage
+^Current\-Folder:~^To find the default current folder
+^mhbuild-compose-<type>*~^Template for composing contents
+.fi
+
+.SH "SEE ALSO"
+mhlist(1), mhshow(1), mhstore(1),
+.br
+.I "Proposed Standard for Message Encapsulation"
+(RFC\-934),
+.br
+.I "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies"
+(RFC\-2045),
+.br
+.I "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types"
+(RFC\-2046),
+.br
+.I "Multipurpose Internet Mail Extensions (MIME) Part Three: Message Header Extensions for Non-ASCII Text"
+(RFC\-2047),
+.br
+.I "Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures"
+(RFC\-2048),
+.br
+.I "Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples"
+(RFC\-2049)
+
+.SH DEFAULTS
+.nf
+.RB ` \-headers '
+.RB ` \-realsize '
+.RB ` \-norfc934mode '
+.RB ` \-contentid '
+.RB ` \-nocheck '
+.RB ` \-noebcdicsafe '
+.RB ` \-noverbose '
+.fi
+
+.SH CONTEXT
+If a folder is given, it will become the current folder.  The last
+message selected will become the current message.