18.1.9. "email.utils": Miscellaneous utilities
**********************************************

There are several useful utilities provided in the "email.utils"
module:

email.utils.quote(str)

   Return a new string with backslashes in *str* replaced by two
   backslashes, and double quotes replaced by backslash-double quote.

email.utils.unquote(str)

   Return a new string which is an *unquoted* version of *str*. If
   *str* ends and begins with double quotes, they are stripped off.
   Likewise if *str* ends and begins with angle brackets, they are
   stripped off.

email.utils.parseaddr(address)

   Parse address – which should be the value of some address-
   containing field such as *To* or *Cc* – into its constituent
   *realname* and *email address* parts.  Returns a tuple of that
   information, unless the parse fails, in which case a 2-tuple of
   "('', '')" is returned.

email.utils.formataddr(pair)

   The inverse of "parseaddr()", this takes a 2-tuple of the form
   "(realname, email_address)" and returns the string value suitable
   for a *To* or *Cc* header.  If the first element of *pair* is
   false, then the second element is returned unmodified.

email.utils.getaddresses(fieldvalues)

   This method returns a list of 2-tuples of the form returned by
   "parseaddr()". *fieldvalues* is a sequence of header field values
   as might be returned by "Message.get_all".  Here’s a simple example
   that gets all the recipients of a message:

      from email.utils import getaddresses

      tos = msg.get_all('to', [])
      ccs = msg.get_all('cc', [])
      resent_tos = msg.get_all('resent-to', [])
      resent_ccs = msg.get_all('resent-cc', [])
      all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)

email.utils.parsedate(date)

   Attempts to parse a date according to the rules in **RFC 2822**.
   however, some mailers don’t follow that format as specified, so
   "parsedate()" tries to guess correctly in such cases.  *date* is a
   string containing an **RFC 2822** date, such as  ""Mon, 20 Nov 1995
   19:12:08 -0500"".  If it succeeds in parsing the date,
   "parsedate()" returns a 9-tuple that can be passed directly to
   "time.mktime()"; otherwise "None" will be returned.  Note that
   indexes 6, 7, and 8 of the result tuple are not usable.

email.utils.parsedate_tz(date)

   Performs the same function as "parsedate()", but returns either
   "None" or a 10-tuple; the first 9 elements make up a tuple that can
   be passed directly to "time.mktime()", and the tenth is the offset
   of the date’s timezone from UTC (which is the official term for
   Greenwich Mean Time) [1].  If the input string has no timezone, the
   last element of the tuple returned is "None".  Note that indexes 6,
   7, and 8 of the result tuple are not usable.

email.utils.mktime_tz(tuple)

   Turn a 10-tuple as returned by "parsedate_tz()" into a UTC
   timestamp (seconds since the Epoch).  If the timezone item in the
   tuple is "None", assume local time.

email.utils.formatdate([timeval[, localtime][, usegmt]])

   Returns a date string as per **RFC 2822**, e.g.:

      Fri, 09 Nov 2001 01:08:47 -0000

   Optional *timeval* if given is a floating point time value as
   accepted by "time.gmtime()" and "time.localtime()", otherwise the
   current time is used.

   Optional *localtime* is a flag that when "True", interprets
   *timeval*, and returns a date relative to the local timezone
   instead of UTC, properly taking daylight savings time into account.
   The default is "False" meaning UTC is used.

   Optional *usegmt* is a flag that when "True", outputs a  date
   string with the timezone as an ascii string "GMT", rather than a
   numeric "-0000". This is needed for some protocols (such as HTTP).
   This only applies when *localtime* is "False".  The default is
   "False".

   New in version 2.4.

email.utils.make_msgid([idstring])

   Returns a string suitable for an **RFC 2822**-compliant *Message-
   ID* header.  Optional *idstring* if given, is a string used to
   strengthen the uniqueness of the message id.

email.utils.decode_rfc2231(s)

   Decode the string *s* according to **RFC 2231**.

email.utils.encode_rfc2231(s[, charset[, language]])

   Encode the string *s* according to **RFC 2231**.  Optional
   *charset* and *language*, if given is the character set name and
   language name to use.  If neither is given, *s* is returned as-is.
   If *charset* is given but *language* is not, the string is encoded
   using the empty string for *language*.

email.utils.collapse_rfc2231_value(value[, errors[, fallback_charset]])

   When a header parameter is encoded in **RFC 2231** format,
   "Message.get_param" may return a 3-tuple containing the character
   set, language, and value.  "collapse_rfc2231_value()" turns this
   into a unicode string.  Optional *errors* is passed to the *errors*
   argument of the built-in "unicode()" function; it defaults to
   "replace".  Optional *fallback_charset* specifies the character set
   to use if the one in the **RFC 2231** header is not known by
   Python; it defaults to "us-ascii".

   For convenience, if the *value* passed to
   "collapse_rfc2231_value()" is not a tuple, it should be a string
   and it is returned unquoted.

email.utils.decode_params(params)

   Decode parameters list according to **RFC 2231**.  *params* is a
   sequence of 2-tuples containing elements of the form "(content-
   type, string-value)".

Changed in version 2.4: The "dump_address_pair()" function has been
removed; use "formataddr()" instead.

Changed in version 2.4: The "decode()" function has been removed; use
the "Header.decode_header" method instead.

Changed in version 2.4: The "encode()" function has been removed; use
the "Header.encode" method instead.

-[ Footnotes ]-

[1] Note that the sign of the timezone offset is the opposite of
    the sign of the "time.timezone" variable for the same timezone;
    the latter variable follows the POSIX standard while this module
    follows **RFC 2822**.
