2001-09-26 02:23:47 -03:00
|
|
|
\declaremodule{standard}{email.Message}
|
|
|
|
\modulesynopsis{The base class representing email messages.}
|
2001-09-26 19:21:52 -03:00
|
|
|
|
|
|
|
The central class in the \module{email} package is the
|
|
|
|
\class{Message} class; it is the base class for the \module{email}
|
|
|
|
object model. \class{Message} provides the core functionality for
|
|
|
|
setting and querying header fields, and for accessing message bodies.
|
|
|
|
|
|
|
|
Conceptually, a \class{Message} object consists of \emph{headers} and
|
|
|
|
\emph{payloads}. Headers are \rfc{2822} style field names and
|
|
|
|
values where the field name and value are separated by a colon. The
|
|
|
|
colon is not part of either the field name or the field value.
|
|
|
|
|
|
|
|
Headers are stored and returned in case-preserving form but are
|
|
|
|
matched case-insensitively. There may also be a single
|
|
|
|
\emph{Unix-From} header, also known as the envelope header or the
|
|
|
|
\code{From_} header. The payload is either a string in the case of
|
|
|
|
simple message objects, a list of \class{Message} objects for
|
|
|
|
multipart MIME documents, or a single \class{Message} instance for
|
|
|
|
\mimetype{message/rfc822} type objects.
|
|
|
|
|
|
|
|
\class{Message} objects provide a mapping style interface for
|
|
|
|
accessing the message headers, and an explicit interface for accessing
|
|
|
|
both the headers and the payload. It provides convenience methods for
|
|
|
|
generating a flat text representation of the message object tree, for
|
|
|
|
accessing commonly used header parameters, and for recursively walking
|
|
|
|
over the object tree.
|
2001-09-26 02:23:47 -03:00
|
|
|
|
|
|
|
Here are the methods of the \class{Message} class:
|
|
|
|
|
2001-09-26 19:21:52 -03:00
|
|
|
\begin{classdesc}{Message}{}
|
|
|
|
The constructor takes no arguments.
|
|
|
|
\end{classdesc}
|
|
|
|
|
2001-09-26 02:23:47 -03:00
|
|
|
\begin{methoddesc}[Message]{as_string}{\optional{unixfrom}}
|
|
|
|
Return the entire formatted message as a string. Optional
|
|
|
|
\var{unixfrom}, when true, specifies to include the \emph{Unix-From}
|
|
|
|
envelope header; it defaults to 0.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__str__()}{}
|
|
|
|
Equivalent to \method{aMessage.as_string(unixfrom=1)}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{is_multipart}{}
|
|
|
|
Return 1 if the message's payload is a list of sub-\class{Message}
|
|
|
|
objects, otherwise return 0. When \method{is_multipart()} returns 0,
|
|
|
|
the payload should either be a string object, or a single
|
|
|
|
\class{Message} instance.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{set_unixfrom}{unixfrom}
|
|
|
|
Set the \emph{Unix-From} (a.k.a envelope header or \code{From_}
|
|
|
|
header) to \var{unixfrom}, which should be a string.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_unixfrom}{}
|
|
|
|
Return the \emph{Unix-From} header. Defaults to \code{None} if the
|
|
|
|
\emph{Unix-From} header was never set.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{add_payload}{payload}
|
|
|
|
Add \var{payload} to the message object's existing payload. If, prior
|
|
|
|
to calling this method, the object's payload was \code{None}
|
|
|
|
(i.e. never before set), then after this method is called, the payload
|
|
|
|
will be the argument \var{payload}.
|
|
|
|
|
|
|
|
If the object's payload was already a list
|
|
|
|
(i.e. \method{is_multipart()} returns 1), then \var{payload} is
|
|
|
|
appended to the end of the existing payload list.
|
|
|
|
|
|
|
|
For any other type of existing payload, \method{add_payload()} will
|
|
|
|
transform the new payload into a list consisting of the old payload
|
|
|
|
and \var{payload}, but only if the document is already a MIME
|
|
|
|
multipart document. This condition is satisfied if the message's
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Type} header's main type is either
|
|
|
|
\mimetype{multipart}, or there is no \mailheader{Content-Type}
|
|
|
|
header. In any other situation,
|
2001-09-26 02:23:47 -03:00
|
|
|
\exception{MultipartConversionError} is raised.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{attach}{payload}
|
|
|
|
Synonymous with \method{add_payload()}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_payload}{\optional{i\optional{, decode}}}
|
|
|
|
Return the current payload, which will be a list of \class{Message}
|
|
|
|
objects when \method{is_multipart()} returns 1, or a scalar (either a
|
|
|
|
string or a single \class{Message} instance) when
|
|
|
|
\method{is_multipart()} returns 0.
|
|
|
|
|
|
|
|
With optional \var{i}, \method{get_payload()} will return the
|
|
|
|
\var{i}-th element of the payload, counting from zero, if
|
2001-09-26 19:21:52 -03:00
|
|
|
\method{is_multipart()} returns 1. An \exception{IndexError} will be raised
|
2001-09-26 02:23:47 -03:00
|
|
|
if \var{i} is less than 0 or greater than or equal to the number of
|
|
|
|
items in the payload. If the payload is scalar
|
|
|
|
(i.e. \method{is_multipart()} returns 0) and \var{i} is given, a
|
2001-09-26 19:21:52 -03:00
|
|
|
\exception{TypeError} is raised.
|
2001-09-26 02:23:47 -03:00
|
|
|
|
|
|
|
Optional \var{decode} is a flag indicating whether the payload should be
|
2001-09-26 19:21:52 -03:00
|
|
|
decoded or not, according to the \mailheader{Content-Transfer-Encoding} header.
|
2001-09-26 02:23:47 -03:00
|
|
|
When true and the message is not a multipart, the payload will be
|
|
|
|
decoded if this header's value is \samp{quoted-printable} or
|
|
|
|
\samp{base64}. If some other encoding is used, or
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Transfer-Encoding} header is
|
2001-09-26 02:23:47 -03:00
|
|
|
missing, the payload is returned as-is (undecoded). If the message is
|
|
|
|
a multipart and the \var{decode} flag is true, then \code{None} is
|
|
|
|
returned.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{set_payload}{payload}
|
|
|
|
Set the entire message object's payload to \var{payload}. It is the
|
|
|
|
client's responsibility to ensure the payload invariants.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
The following methods implement a mapping-like interface for accessing
|
|
|
|
the message object's \rfc{2822} headers. Note that there are some
|
|
|
|
semantic differences between these methods and a normal mapping
|
|
|
|
(i.e. dictionary) interface. For example, in a dictionary there are
|
|
|
|
no duplicate keys, but here there may be duplicate message headers. Also,
|
|
|
|
in dictionaries there is no guaranteed order to the keys returned by
|
|
|
|
\method{keys()}, but in a \class{Message} object, there is an explicit
|
|
|
|
order. These semantic differences are intentional and are biased
|
|
|
|
toward maximal convenience.
|
|
|
|
|
|
|
|
Note that in all cases, any optional \emph{Unix-From} header the message
|
|
|
|
may have is not included in the mapping interface.
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__len__}{}
|
|
|
|
Return the total number of headers, including duplicates.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__contains__}{name}
|
|
|
|
Return true if the message object has a field named \var{name}.
|
|
|
|
Match is done case-insensitively and \var{name} should not include the
|
|
|
|
trailing colon. Used for the \code{in} operator,
|
|
|
|
e.g.:
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
if 'message-id' in myMessage:
|
|
|
|
print 'Message-ID:', myMessage['message-id']
|
|
|
|
\end{verbatim}
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__getitem__}{name}
|
|
|
|
Return the value of the named header field. \var{name} should not
|
|
|
|
include the colon field separator. If the header is missing,
|
2001-09-26 19:21:52 -03:00
|
|
|
\code{None} is returned; a \exception{KeyError} is never raised.
|
2001-09-26 02:23:47 -03:00
|
|
|
|
|
|
|
Note that if the named field appears more than once in the message's
|
|
|
|
headers, exactly which of those field values will be returned is
|
|
|
|
undefined. Use the \method{get_all()} method to get the values of all
|
|
|
|
the extant named headers.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__setitem__}{name, val}
|
|
|
|
Add a header to the message with field name \var{name} and value
|
|
|
|
\var{val}. The field is appended to the end of the message's existing
|
|
|
|
fields.
|
|
|
|
|
|
|
|
Note that this does \emph{not} overwrite or delete any existing header
|
|
|
|
with the same name. If you want to ensure that the new header is the
|
|
|
|
only one present in the message with field name
|
|
|
|
\var{name}, first use \method{__delitem__()} to delete all named
|
|
|
|
fields, e.g.:
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
del msg['subject']
|
|
|
|
msg['subject'] = 'Python roolz!'
|
|
|
|
\end{verbatim}
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{__delitem__}{name}
|
|
|
|
Delete all occurrences of the field with name \var{name} from the
|
|
|
|
message's headers. No exception is raised if the named field isn't
|
|
|
|
present in the headers.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{has_key}{name}
|
|
|
|
Return 1 if the message contains a header field named \var{name},
|
|
|
|
otherwise return 0.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{keys}{}
|
|
|
|
Return a list of all the message's header field names. These keys
|
|
|
|
will be sorted in the order in which they were added to the message
|
|
|
|
via \method{__setitem__()}, and may contain duplicates. Any fields
|
|
|
|
deleted and then subsequently re-added are always appended to the end
|
|
|
|
of the header list.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{values}{}
|
|
|
|
Return a list of all the message's field values. These will be sorted
|
|
|
|
in the order in which they were added to the message via
|
|
|
|
\method{__setitem__()}, and may contain duplicates. Any fields
|
|
|
|
deleted and then subsequently re-added are always appended to the end
|
|
|
|
of the header list.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{items}{}
|
|
|
|
Return a list of 2-tuples containing all the message's field headers and
|
|
|
|
values. These will be sorted in the order in which they were added to
|
|
|
|
the message via \method{__setitem__()}, and may contain duplicates.
|
|
|
|
Any fields deleted and then subsequently re-added are always appended
|
|
|
|
to the end of the header list.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get}{name\optional{, failobj}}
|
|
|
|
Return the value of the named header field. This is identical to
|
|
|
|
\method{__getitem__()} except that optional \var{failobj} is returned
|
|
|
|
if the named header is missing (defaults to \code{None}).
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
Here are some additional useful methods:
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_all}{name\optional{, failobj}}
|
|
|
|
Return a list of all the values for the field named \var{name}. These
|
|
|
|
will be sorted in the order in which they were added to the message
|
|
|
|
via \method{__setitem__()}. Any fields
|
|
|
|
deleted and then subsequently re-added are always appended to the end
|
|
|
|
of the list.
|
|
|
|
|
|
|
|
If there are no such named headers in the message, \var{failobj} is
|
|
|
|
returned (defaults to \code{None}).
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{add_header}{_name, _value, **_params}
|
|
|
|
Extended header setting. This method is similar to
|
|
|
|
\method{__setitem__()} except that additional header parameters can be
|
|
|
|
provided as keyword arguments. \var{_name} is the header to set and
|
|
|
|
\var{_value} is the \emph{primary} value for the header.
|
|
|
|
|
|
|
|
For each item in the keyword argument dictionary \var{_params}, the
|
|
|
|
key is taken as the parameter name, with underscores converted to
|
|
|
|
dashes (since dashes are illegal in Python identifiers). Normally,
|
|
|
|
the parameter will be added as \code{key="value"} unless the value is
|
|
|
|
\code{None}, in which case only the key will be added.
|
|
|
|
|
|
|
|
Here's an example:
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
|
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
This will add a header that looks like
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
Content-Disposition: attachment; filename="bud.gif"
|
|
|
|
\end{verbatim}
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_type}{\optional{failobj}}
|
|
|
|
Return the message's content type, as a string of the form
|
2001-09-26 19:21:52 -03:00
|
|
|
\mimetype{maintype/subtype} as taken from the
|
|
|
|
\mailheader{Content-Type} header.
|
2001-09-26 02:23:47 -03:00
|
|
|
The returned string is coerced to lowercase.
|
|
|
|
|
2001-09-26 19:21:52 -03:00
|
|
|
If there is no \mailheader{Content-Type} header in the message,
|
2001-09-26 02:23:47 -03:00
|
|
|
\var{failobj} is returned (defaults to \code{None}).
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_main_type}{\optional{failobj}}
|
|
|
|
Return the message's \emph{main} content type. This essentially returns the
|
|
|
|
\var{maintype} part of the string returned by \method{get_type()}, with the
|
|
|
|
same semantics for \var{failobj}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_subtype}{\optional{failobj}}
|
|
|
|
Return the message's sub-content type. This essentially returns the
|
|
|
|
\var{subtype} part of the string returned by \method{get_type()}, with the
|
|
|
|
same semantics for \var{failobj}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_params}{\optional{failobj\optional{, header}}}
|
2001-09-26 19:21:52 -03:00
|
|
|
Return the message's \mailheader{Content-Type} parameters, as a list. The
|
2001-09-26 02:23:47 -03:00
|
|
|
elements of the returned list are 2-tuples of key/value pairs, as
|
2001-09-26 19:21:52 -03:00
|
|
|
split on the \character{=} sign. The left hand side of the
|
|
|
|
\character{=} is the key, while the right hand side is the value. If
|
|
|
|
there is no \character{=} sign in the parameter the value is the empty
|
|
|
|
string. The value is always unquoted with \method{Utils.unquote()}.
|
2001-09-26 02:23:47 -03:00
|
|
|
|
|
|
|
Optional \var{failobj} is the object to return if there is no
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Type} header. Optional \var{header} is the header to
|
|
|
|
search instead of \mailheader{Content-Type}.
|
2001-09-26 02:23:47 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_param}{param\optional{,
|
|
|
|
failobj\optional{, header}}}
|
2001-09-26 19:21:52 -03:00
|
|
|
Return the value of the \mailheader{Content-Type} header's parameter
|
|
|
|
\var{param} as a string. If the message has no \mailheader{Content-Type}
|
2001-09-26 02:23:47 -03:00
|
|
|
header or if there is no such parameter, then \var{failobj} is
|
|
|
|
returned (defaults to \code{None}).
|
|
|
|
|
|
|
|
Optional \var{header} if given, specifies the message header to use
|
2001-09-26 19:21:52 -03:00
|
|
|
instead of \mailheader{Content-Type}.
|
2001-09-26 02:23:47 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_charsets}{\optional{failobj}}
|
|
|
|
Return a list containing the character set names in the message. If
|
2001-09-26 19:21:52 -03:00
|
|
|
the message is a \mimetype{multipart}, then the list will contain one
|
2001-09-26 02:23:47 -03:00
|
|
|
element for each subpart in the payload, otherwise, it will be a list
|
|
|
|
of length 1.
|
|
|
|
|
|
|
|
Each item in the list will be a string which is the value of the
|
2001-09-26 19:21:52 -03:00
|
|
|
\code{charset} parameter in the \mailheader{Content-Type} header for the
|
2001-09-26 02:23:47 -03:00
|
|
|
represented subpart. However, if the subpart has no
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Type} header, no \code{charset} parameter, or is not of
|
|
|
|
the \mimetype{text} main MIME type, then that item in the returned list
|
2001-09-26 02:23:47 -03:00
|
|
|
will be \var{failobj}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_filename}{\optional{failobj}}
|
|
|
|
Return the value of the \code{filename} parameter of the
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Disposition} header of the message, or \var{failobj} if
|
2001-09-26 02:23:47 -03:00
|
|
|
either the header is missing, or has no \code{filename} parameter.
|
|
|
|
The returned string will always be unquoted as per
|
|
|
|
\method{Utils.unquote()}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{get_boundary}{\optional{failobj}}
|
|
|
|
Return the value of the \code{boundary} parameter of the
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Type} header of the message, or \var{failobj} if either
|
2001-09-26 02:23:47 -03:00
|
|
|
the header is missing, or has no \code{boundary} parameter. The
|
|
|
|
returned string will always be unquoted as per
|
|
|
|
\method{Utils.unquote()}.
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{set_boundary}{boundary}
|
2001-09-26 19:21:52 -03:00
|
|
|
Set the \code{boundary} parameter of the \mailheader{Content-Type} header
|
2001-09-26 02:23:47 -03:00
|
|
|
to \var{boundary}. \method{set_boundary()} will always quote
|
|
|
|
\var{boundary} so you should not quote it yourself. A
|
2001-09-26 19:21:52 -03:00
|
|
|
\exception{HeaderParseError} is raised if the message object has no
|
|
|
|
\mailheader{Content-Type} header.
|
2001-09-26 02:23:47 -03:00
|
|
|
|
|
|
|
Note that using this method is subtly different than deleting the old
|
2001-09-26 19:21:52 -03:00
|
|
|
\mailheader{Content-Type} header and adding a new one with the new boundary
|
2001-09-26 02:23:47 -03:00
|
|
|
via \method{add_header()}, because \method{set_boundary()} preserves the
|
2001-09-26 19:21:52 -03:00
|
|
|
order of the \mailheader{Content-Type} header in the list of headers.
|
2001-09-26 02:23:47 -03:00
|
|
|
However, it does \emph{not} preserve any continuation lines which may
|
2001-09-26 19:21:52 -03:00
|
|
|
have been present in the original \mailheader{Content-Type} header.
|
2001-09-26 02:23:47 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}[Message]{walk}{}
|
|
|
|
The \method{walk()} method is an all-purpose generator which can be
|
|
|
|
used to iterate over all the parts and subparts of a message object
|
|
|
|
tree, in depth-first traversal order. You will typically use
|
|
|
|
\method{walk()} as the iterator in a \code{for ... in} loop; each
|
|
|
|
iteration returns the next subpart.
|
|
|
|
|
|
|
|
Here's an example that prints the MIME type of every part of a message
|
|
|
|
object tree:
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
>>> for part in msg.walk():
|
|
|
|
>>> print part.get_type('text/plain')
|
|
|
|
multipart/report
|
|
|
|
text/plain
|
|
|
|
message/delivery-status
|
|
|
|
text/plain
|
|
|
|
text/plain
|
|
|
|
message/rfc822
|
|
|
|
\end{verbatim}
|
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\class{Message} objects can also optionally contain two instance
|
|
|
|
attributes, which can be used when generating the plain text of a MIME
|
|
|
|
message.
|
|
|
|
|
|
|
|
\begin{datadesc}{preamble}
|
|
|
|
The format of a MIME document allows for some text between the blank
|
|
|
|
line following the headers, and the first multipart boundary string.
|
|
|
|
Normally, this text is never visible in a MIME-aware mail reader
|
|
|
|
because it falls outside the standard MIME armor. However, when
|
|
|
|
viewing the raw text of the message, or when viewing the message in a
|
|
|
|
non-MIME aware reader, this text can become visible.
|
|
|
|
|
|
|
|
The \var{preamble} attribute contains this leading extra-armor text
|
|
|
|
for MIME documents. When the \class{Parser} discovers some text after
|
|
|
|
the headers but before the first boundary string, it assigns this text
|
|
|
|
to the message's \var{preamble} attribute. When the \class{Generator}
|
|
|
|
is writing out the plain text representation of a MIME message, and it
|
|
|
|
finds the message has a \var{preamble} attribute, it will write this
|
|
|
|
text in the area between the headers and the first boundary.
|
|
|
|
|
|
|
|
Note that if the message object has no preamble, the
|
|
|
|
\var{preamble} attribute will be \code{None}.
|
|
|
|
\end{datadesc}
|
|
|
|
|
|
|
|
\begin{datadesc}{epilogue}
|
|
|
|
The \var{epilogue} attribute acts the same way as the \var{preamble}
|
|
|
|
attribute, except that it contains text that appears between the last
|
|
|
|
boundary and the end of the message.
|
2001-10-19 01:34:42 -03:00
|
|
|
|
|
|
|
One note: when generating the flat text for a \mimetype{multipart}
|
|
|
|
message that has no \var{epilogue} (using the standard
|
|
|
|
\class{Generator} class), no newline is added after the closing
|
|
|
|
boundary line. If the message object has an \var{epilogue} and its
|
|
|
|
value does not start with a newline, a newline is printed after the
|
|
|
|
closing boundary. This seems a little clumsy, but it makes the most
|
|
|
|
practical sense. The upshot is that if you want to ensure that a
|
|
|
|
newline get printed after your closing \mimetype{multipart} boundary,
|
|
|
|
set the \var{epilogue} to the empty string.
|
2001-09-26 02:23:47 -03:00
|
|
|
\end{datadesc}
|