(* $Id: netsendmail.mli 1206 2008-10-23 13:51:12Z gerd $
* ----------------------------------------------------------------------
*
*)
(** Functions to compose and send electronic mails
*
* {b Contents}
*
* - {!Netsendmail.composing}
* - {!Netsendmail.sending}
*
* The tutorial has been moved to {!Netsendmail_tut}.
*)
(** {1:composing Composing Messages}
*
* The core function is {!Netsendmail.compose} generating a MIME mail.
* The mail can be sent with {!Netsendmail.sendmail}, written to an
* object channel with {!Netmime.write_mime_message}, or postprocessed
* by a user function.
*
* The call to [compose] can be as easy as
*
* {[ compose ~from_addr:("me", "me\@domain.net")
* ~to_addrs:["you", "you\@domain.com"]
* ~subject:"I have a message for you"
* "Hello, this is my message!\n"
* ]}
*
* This call generates the message as {!Netmime.complex_mime_message},
* and can be directly sent with {!Netsendmail.sendmail}.
*
* The [compose] function is the simplified interface; alternatively one
* can also generate the mail by calling {!Netsendmail.wrap_mail},
* {!Netsendmail.wrap_parts}, and {!Netsendmail.wrap_attachment}, getting
* more fine-grained control of certain options.
*)
val compose :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
?from_addr:(string * string) ->
?cc_addrs:(string * string) list ->
?bcc_addrs:(string * string) list ->
?content_type:(string * (string * Mimestring.s_param) list) ->
?container_type:(string * (string * Mimestring.s_param) list) ->
?attachments:Netmime.complex_mime_message list ->
to_addrs:(string * string) list ->
subject:string ->
(* text:*) string ->
Netmime.complex_mime_message
(** Composes a mail message with a main text, and optionally
* a number of attachments.
*
* The addresses [from_addr], [to_addrs], [cc_addrs], and [bcc_addrs] are
* passed as pairs [(human_readable,formal)] where
* [human_readable] is an arbitrary printable string identifying the
* sender/receiver, and where [formal] is the RFC-822 mailbox specification.
* An example is [("Stolpmann, Gerd", "gerd\@gerd-stolpmann.de")].
*
* The [subject] can be any text.
*
* The anonymous [string] argument is the main text of the mail.
*
* The resulting message is always a correct MIME message.
*
* @param in_charset All passed texts (except the formal addresses) must
* be encoded in [in_charset]. Default: [`Enc_iso88591].
* As another exception, setting [content_type] explicitly prevents
* the main text from being converted, and [in_charset] does not
* have a meaning for the main text.
* @param out_charset The encoded words in the generated header fields,
* if necessary, and the main text are encoded in [out_charset].
* Default: [`Enc_iso88591].
* It is required that [out_charset] is ASCII-compatible.
* As a special rule, setting [content_type] explicitly prevents
* the main text from being converted to [out_charset].
* @param content_type The content type of the main text. The list is
* the list of parameters attached
* to the type, e.g. [("text/plain", ["charset", mk_param "ISO-8859-1"])]
* (see {!Mimestring.mk_param}). When this argument is set,
* the main text is no longer converted to [out_charset].
* By default, when this argument is missing, the main text is
* converted from [in_charset] to [out_charset], and the
* content type becomes ["text/plain; charset=<out_charset>"].
* @param container_type The content type of the container wrapping the
* main text and the attachment into one entity
* (only used if [attachments] are present). This
* defaults to [("multipart/mixed", [])]. This must be either a
* "multipart" or "message" type.
* @param attachments An optional list of attachments. Should be generated
* with [wrap_attachment].
*)
(** {b Character Set Conversion}
*
* The impact of [in_charset] and [out_charset] on the generated mail
* is not very obvious. The charset arguments may have an effect on
* the mail header and the mail body.
*
* The mail header can only be composed of ASCII characters (7 bit).
* To circumvent this restriction the MIME standard specifies a special
* format, the so-called encoded words. These may only be used in some
* places, and [compose] knows where: In the subject, and the non-formal
* part of mail addresses. The [out_charset] is the character set
* used in the generated mail. The [in_charset] is the character set
* the strings are encoded you pass to [compose]. It is a good idea
* to have [in_charset = out_charset], or at least choose [out_charset]
* as a superset of [in_charset], because this ensures that the character
* set conversion succeeds.
*
* If the mail header does not make use of the additional non-ASCII
* characters, the encoded words will be avoided.
*
* The mail body is only subject of character set conversion if
* the [content_type] is {b not} passed to [compose]. In this case,
* the function sets it to [text/plain], and converts the message
* from [in_charset] to [out_charset].
*
* {b Adding Attachments}
*
* To generate the attachments, call {!Netsendmail.wrap_attachment}, e.g.
*
* {[ compose ...
* ~attachments:[ wrap_attachment
* ~content_type:("application/octet-stream", [])
* (new Netmime.file_mime_body "file.tar.gz") ]
* ]}
*
* There
* are a number of kinds of attaching files, identified by [container_type].
* The default is [multipart/mixed], meaning that the parts of the mail are
* mixed messages and files. One can give a hint whether to display
* the parts directly in the mailer program (so-called inline attachments),
* or whether to suggest that the file is saved to disk ("real"
* attachments). This hint is contained in the [Content-disposition]
* header, see [wrap_attachment] how to set it.
*
* For a discusion of the other [container_type]s see the
* {!Netsendmail.tutorial} at the end of this document.
*)
val wrap_attachment :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
?content_id:string ->
?content_description:string ->
?content_location:string ->
?content_disposition:(string * (string * Mimestring.s_param) list) ->
content_type:(string * (string * Mimestring.s_param) list) ->
Netmime.mime_body ->
Netmime.complex_mime_message
(** Generates a header for the [mime_body]. The returned value
* is intended to be used as input for the [attachments] argument
* of the [compose] function:
*
* {[
* compose ...
* ~attachments:[ wrap_attachment
* ~content_type:("audio/wav", [])
* (new file_mime_body "music.wav") ]
* ]}
*
* The header contains at least the [Content-type] and the
* [Content-transfer-encoding] fields. The latter is currently
* always ["base64"], but it is possible that the function is
* changed in the future to also generate ["quoted-printable"]
* when applicable.
*
* @param in_charset The encoding of the [content_description] argument.
* Default: [`Enc_iso88591].
* @param out_charset The encoding of the generated [Content-Description]
* header. Default: [`Enc_iso88591].
* @param content_type Specifies the content type with main
* type and list of parameters. Example:
* [ ("text/plain", ["charset", Mimestring.mk_param "ISO-8859-1" ]) ]
* (see {!Mimestring.mk_param})
* @param content_disposition Optionally sets the [Content-disposition]
* header. Frequent values are
* - [ ("inline", []) ]: Indicates that the attachment is displayed
* together with the main text
* - [ ("attachment", ["filename", Mimestring.mk_param fn]) ]: Indicates
* that the attachment should be stored onto the disk. The
* parameter [fn] is the suggested file name. Note that [fn]
* should only consist of ASCII characters unless the [charset]
* argument of [mk_param] is set to a different character encoding.
* @param content_id Optionally sets the [Content-ID] header field.
* The passed string is the ID value without the embracing angle
* brackets. The [Content-ID] can be used to refer to the attachment
* from other parts of the mail, e.g. in [multipart/related] mails
* HTML documents can include hyperlinks to attachments using the
* URL syntax [cid:ID] where [ID] is the ID value.
* @param content_description The [Content-Description] header
* @param content_location The [Content-Location] header. This must be
* a valid URL, only composed of 7 bit characters, and with escaped
* unsafe characters
*)
val wrap_mail :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
?from_addr:(string * string) ->
?cc_addrs:(string * string) list ->
?bcc_addrs:(string * string) list ->
to_addrs:(string * string) list ->
subject:string ->
Netmime.complex_mime_message ->
Netmime.complex_mime_message
(** Sets the mail-related header fields in the input message, and
* returns a message ready for delivery. Transfer- and delivery-related
* header fields are removed from the message first, and the new fields
* are set to the values passed to this function.
*
* The arguments are like in {!Netsendmail.compose}.
*
* The input message should have at least a [Content-type] header,
* but this is not enforced.
*
* Use this function as an alternative to {!Netsendmail.compose},
* if the message is already available as [complex_mime_message],
* e.g. to re-send a parsed mail message to a new destination.
*)
(** {b Note: Resending Messages}
*
* Note that mails generated by [wrap_mail] always appear as new mails,
* not as forwarded or replied mails. In order to do the latter a different
* way of processing the message is needed.
*)
val wrap_parts :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
?content_type:(string * (string * Mimestring.s_param) list) ->
?content_id:string ->
?content_description:string ->
?content_location:string ->
?content_disposition:(string * (string * Mimestring.s_param) list) ->
Netmime.complex_mime_message list ->
Netmime.complex_mime_message
(** Generates an intermediate container for multipart attachments.
* Use this if you want to bundle a set of attachments as a single
* attachment.
*
* @param in_charset The encoding of the [content_description] argument.
* Default: [`Enc_iso88591].
* @param out_charset The encoding of the generated [Content-Description]
* header. Default: [`Enc_iso88591].
* @param content_type The [Content-Type] header. Default: multipart/mixed
* @param content_id The [Content-ID] header, without the angle brackets
* @param content_description The [Content-Description] header
* @param content_location The [Content-Location] header. This must be
* a valid URL, only composed of 7 bit characters, and with escaped
* unsafe characters
* @param content_disposition The [Content-Disposition] header
*)
(** {b Low-level} *)
val create_address_list_tokens :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
(string * string) list ->
Mimestring.s_token list
(** Returns the list of [s_token]s representing email addresses as
* structured value. The addresses are passed as list of pairs
* [(human_readable, formal)] as in the [compose] function above.
* The returned structured field value can be formatted and filled
* into a mail header. For example, to set the "To" header to
* ["Stolpmann, Gerd" <gerd\@gerd-stolpmann.de>] use
* {[
* let sval = create_address_list_tokens ["Stolpmann, Gerd",
* "gerd\@gerd-stolpmann.de"] in
* header # update_field "to" (format_field_value "to" sval)
* ]}
* This ensures that the field is correctly quoted, that appropriate
* encodings are applied and that long values are folded into several
* lines.
*
* @param in_charset The character encoding used for [human_readable].
* Defaults to [`Enc_iso88591].
* @param out_charset The character encoding used in the generated
* encoded word. This encoding must be ASCII-compatible. Defaults to
* [`Enc_iso88591].
*)
val create_text_tokens :
?in_charset:Netconversion.encoding ->
?out_charset:Netconversion.encoding ->
string ->
Mimestring.s_token list
(** Returns the list of [s_token]s representing an informal text
* as structured value. The text is passed as simple string.
* The returned structured field value can be formatted and filled
* into a mail header. For example, to set the "Subject" header to
* ["I have to say something"], use
* {[
* let sval = create_text_tokens "I have to say something" in
* header # update_field "subject" (format_field_value "subject" sval)
* ]}
* This ensures that the field is correctly quoted, that appropriate
* encodings are applied and that long values are folded into several
* lines.
*
* @param in_charset The character encoding used for the input string.
* Defaults to [`Enc_iso88591].
* @param out_charset The character encoding used in the generated
* encoded words. This encoding must be ASCII-compatible. Defaults to
* [`Enc_iso88591].
*)
val format_field_value : string -> Mimestring.s_token list -> string
(** To put [sval], an [s_token list], into the header field [name],
* call
*
* [ header # update_field name (format_field_value name sval) ]
*
* The field value is folded into several lines, if necessary.
*)
(** {1:sending Sending Messages} *)
val sendmail : ?mailer:string -> ?crlf:bool -> Netmime.complex_mime_message -> unit
(** Sends the passed message. The mailer program must be sendmail-compatible
* (this can be assumed on all Unix systems, even if a non-sendmail
* mailer is installed).
*
* The mailer program is the command passed as [mailer], which is by
* default a reasonable compile-time setting.
*
* With [crlf] one can determine the EOL convention for the message piped to
* the mailer program: If [crlf], CR/LF is used, if [not crlf], only LF is
* used. The default is [false] for Unix systems.
*)