17db96d56Sopenharmony_ci:mod:`email.utils`: Miscellaneous utilities
27db96d56Sopenharmony_ci-------------------------------------------
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: email.utils
57db96d56Sopenharmony_ci   :synopsis: Miscellaneous email package utilities.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci**Source code:** :source:`Lib/email/utils.py`
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci--------------
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciThere are a couple of useful utilities provided in the :mod:`email.utils`
127db96d56Sopenharmony_cimodule:
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci.. function:: localtime(dt=None)
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    Return local time as an aware datetime object.  If called without
177db96d56Sopenharmony_ci    arguments, return current time.  Otherwise *dt* argument should be a
187db96d56Sopenharmony_ci    :class:`~datetime.datetime` instance, and it is converted to the local time
197db96d56Sopenharmony_ci    zone according to the system time zone database.  If *dt* is naive (that
207db96d56Sopenharmony_ci    is, ``dt.tzinfo`` is ``None``), it is assumed to be in local time.  In this
217db96d56Sopenharmony_ci    case, a positive or zero value for *isdst* causes ``localtime`` to presume
227db96d56Sopenharmony_ci    initially that summer time (for example, Daylight Saving Time) is or is not
237db96d56Sopenharmony_ci    (respectively) in effect for the specified time.  A negative value for
247db96d56Sopenharmony_ci    *isdst* causes the ``localtime`` to attempt to divine whether summer time
257db96d56Sopenharmony_ci    is in effect for the specified time.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci    .. versionadded:: 3.3
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci.. function:: make_msgid(idstring=None, domain=None)
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   Returns a string suitable for an :rfc:`2822`\ -compliant
337db96d56Sopenharmony_ci   :mailheader:`Message-ID` header.  Optional *idstring* if given, is a string
347db96d56Sopenharmony_ci   used to strengthen the uniqueness of the message id.  Optional *domain* if
357db96d56Sopenharmony_ci   given provides the portion of the msgid after the '@'.  The default is the
367db96d56Sopenharmony_ci   local hostname.  It is not normally necessary to override this default, but
377db96d56Sopenharmony_ci   may be useful certain cases, such as a constructing distributed system that
387db96d56Sopenharmony_ci   uses a consistent domain name across multiple hosts.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci   .. versionchanged:: 3.2
417db96d56Sopenharmony_ci      Added the *domain* keyword.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ciThe remaining functions are part of the legacy (``Compat32``) email API.  There
457db96d56Sopenharmony_ciis no need to directly use these with the new API, since the parsing and
467db96d56Sopenharmony_ciformatting they provide is done automatically by the header parsing machinery
477db96d56Sopenharmony_ciof the new API.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci.. function:: quote(str)
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   Return a new string with backslashes in *str* replaced by two backslashes, and
537db96d56Sopenharmony_ci   double quotes replaced by backslash-double quote.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci.. function:: unquote(str)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   Return a new string which is an *unquoted* version of *str*. If *str* ends and
597db96d56Sopenharmony_ci   begins with double quotes, they are stripped off.  Likewise if *str* ends and
607db96d56Sopenharmony_ci   begins with angle brackets, they are stripped off.
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. function:: parseaddr(address)
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   Parse address -- which should be the value of some address-containing field such
667db96d56Sopenharmony_ci   as :mailheader:`To` or :mailheader:`Cc` -- into its constituent *realname* and
677db96d56Sopenharmony_ci   *email address* parts.  Returns a tuple of that information, unless the parse
687db96d56Sopenharmony_ci   fails, in which case a 2-tuple of ``('', '')`` is returned.
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci.. function:: formataddr(pair, charset='utf-8')
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   The inverse of :meth:`parseaddr`, this takes a 2-tuple of the form ``(realname,
747db96d56Sopenharmony_ci   email_address)`` and returns the string value suitable for a :mailheader:`To` or
757db96d56Sopenharmony_ci   :mailheader:`Cc` header.  If the first element of *pair* is false, then the
767db96d56Sopenharmony_ci   second element is returned unmodified.
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci   Optional *charset* is the character set that will be used in the :rfc:`2047`
797db96d56Sopenharmony_ci   encoding of the ``realname`` if the ``realname`` contains non-ASCII
807db96d56Sopenharmony_ci   characters.  Can be an instance of :class:`str` or a
817db96d56Sopenharmony_ci   :class:`~email.charset.Charset`.  Defaults to ``utf-8``.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   .. versionchanged:: 3.3
847db96d56Sopenharmony_ci      Added the *charset* option.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. function:: getaddresses(fieldvalues)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   This method returns a list of 2-tuples of the form returned by ``parseaddr()``.
907db96d56Sopenharmony_ci   *fieldvalues* is a sequence of header field values as might be returned by
917db96d56Sopenharmony_ci   :meth:`Message.get_all <email.message.Message.get_all>`.  Here's a simple
927db96d56Sopenharmony_ci   example that gets all the recipients of a message::
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci      from email.utils import getaddresses
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci      tos = msg.get_all('to', [])
977db96d56Sopenharmony_ci      ccs = msg.get_all('cc', [])
987db96d56Sopenharmony_ci      resent_tos = msg.get_all('resent-to', [])
997db96d56Sopenharmony_ci      resent_ccs = msg.get_all('resent-cc', [])
1007db96d56Sopenharmony_ci      all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci.. function:: parsedate(date)
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci   Attempts to parse a date according to the rules in :rfc:`2822`. however, some
1067db96d56Sopenharmony_ci   mailers don't follow that format as specified, so :func:`parsedate` tries to
1077db96d56Sopenharmony_ci   guess correctly in such cases.  *date* is a string containing an :rfc:`2822`
1087db96d56Sopenharmony_ci   date, such as  ``"Mon, 20 Nov 1995 19:12:08 -0500"``.  If it succeeds in parsing
1097db96d56Sopenharmony_ci   the date, :func:`parsedate` returns a 9-tuple that can be passed directly to
1107db96d56Sopenharmony_ci   :func:`time.mktime`; otherwise ``None`` will be returned.  Note that indexes 6,
1117db96d56Sopenharmony_ci   7, and 8 of the result tuple are not usable.
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci.. function:: parsedate_tz(date)
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   Performs the same function as :func:`parsedate`, but returns either ``None`` or
1177db96d56Sopenharmony_ci   a 10-tuple; the first 9 elements make up a tuple that can be passed directly to
1187db96d56Sopenharmony_ci   :func:`time.mktime`, and the tenth is the offset of the date's timezone from UTC
1197db96d56Sopenharmony_ci   (which is the official term for Greenwich Mean Time) [#]_.  If the input string
1207db96d56Sopenharmony_ci   has no timezone, the last element of the tuple returned is ``0``, which represents
1217db96d56Sopenharmony_ci   UTC. Note that indexes 6, 7, and 8 of the result tuple are not usable.
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci.. function:: parsedate_to_datetime(date)
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci   The inverse of :func:`format_datetime`.  Performs the same function as
1277db96d56Sopenharmony_ci   :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`;
1287db96d56Sopenharmony_ci   otherwise ``ValueError`` is raised if *date* contains an invalid value such
1297db96d56Sopenharmony_ci   as an hour greater than 23 or a timezone offset not between -24 and 24 hours.
1307db96d56Sopenharmony_ci   If the input date has a timezone of ``-0000``, the ``datetime`` will be a naive
1317db96d56Sopenharmony_ci   ``datetime``, and if the date is conforming to the RFCs it will represent a
1327db96d56Sopenharmony_ci   time in UTC but with no indication of the actual source timezone of the
1337db96d56Sopenharmony_ci   message the date comes from.  If the input date has any other valid timezone
1347db96d56Sopenharmony_ci   offset, the ``datetime`` will be an aware ``datetime`` with the
1357db96d56Sopenharmony_ci   corresponding a :class:`~datetime.timezone` :class:`~datetime.tzinfo`.
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   .. versionadded:: 3.3
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci.. function:: mktime_tz(tuple)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci   Turn a 10-tuple as returned by :func:`parsedate_tz` into a UTC
1437db96d56Sopenharmony_ci   timestamp (seconds since the Epoch).  If the timezone item in the
1447db96d56Sopenharmony_ci   tuple is ``None``, assume local time.
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci.. function:: formatdate(timeval=None, localtime=False, usegmt=False)
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci   Returns a date string as per :rfc:`2822`, e.g.::
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci      Fri, 09 Nov 2001 01:08:47 -0000
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci   Optional *timeval* if given is a floating point time value as accepted by
1547db96d56Sopenharmony_ci   :func:`time.gmtime` and :func:`time.localtime`, otherwise the current time is
1557db96d56Sopenharmony_ci   used.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci   Optional *localtime* is a flag that when ``True``, interprets *timeval*, and
1587db96d56Sopenharmony_ci   returns a date relative to the local timezone instead of UTC, properly taking
1597db96d56Sopenharmony_ci   daylight savings time into account. The default is ``False`` meaning UTC is
1607db96d56Sopenharmony_ci   used.
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   Optional *usegmt* is a flag that when ``True``, outputs a  date string with the
1637db96d56Sopenharmony_ci   timezone as an ascii string ``GMT``, rather than a numeric ``-0000``. This is
1647db96d56Sopenharmony_ci   needed for some protocols (such as HTTP). This only applies when *localtime* is
1657db96d56Sopenharmony_ci   ``False``.  The default is ``False``.
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci.. function:: format_datetime(dt, usegmt=False)
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci   Like ``formatdate``, but the input is a :mod:`datetime` instance.  If it is
1717db96d56Sopenharmony_ci   a naive datetime, it is assumed to be "UTC with no information about the
1727db96d56Sopenharmony_ci   source timezone", and the conventional ``-0000`` is used for the timezone.
1737db96d56Sopenharmony_ci   If it is an aware ``datetime``, then the numeric timezone offset is used.
1747db96d56Sopenharmony_ci   If it is an aware timezone with offset zero, then *usegmt* may be set to
1757db96d56Sopenharmony_ci   ``True``, in which case the string ``GMT`` is used instead of the numeric
1767db96d56Sopenharmony_ci   timezone offset.  This provides a way to generate standards conformant HTTP
1777db96d56Sopenharmony_ci   date headers.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci   .. versionadded:: 3.3
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci.. function:: decode_rfc2231(s)
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci   Decode the string *s* according to :rfc:`2231`.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci.. function:: encode_rfc2231(s, charset=None, language=None)
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci   Encode the string *s* according to :rfc:`2231`.  Optional *charset* and
1907db96d56Sopenharmony_ci   *language*, if given is the character set name and language name to use.  If
1917db96d56Sopenharmony_ci   neither is given, *s* is returned as-is.  If *charset* is given but *language*
1927db96d56Sopenharmony_ci   is not, the string is encoded using the empty string for *language*.
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci.. function:: collapse_rfc2231_value(value, errors='replace', fallback_charset='us-ascii')
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci   When a header parameter is encoded in :rfc:`2231` format,
1987db96d56Sopenharmony_ci   :meth:`Message.get_param <email.message.Message.get_param>` may return a
1997db96d56Sopenharmony_ci   3-tuple containing the character set,
2007db96d56Sopenharmony_ci   language, and value.  :func:`collapse_rfc2231_value` turns this into a unicode
2017db96d56Sopenharmony_ci   string.  Optional *errors* is passed to the *errors* argument of :class:`str`'s
2027db96d56Sopenharmony_ci   :func:`~str.encode` method; it defaults to ``'replace'``.  Optional
2037db96d56Sopenharmony_ci   *fallback_charset* specifies the character set to use if the one in the
2047db96d56Sopenharmony_ci   :rfc:`2231` header is not known by Python; it defaults to ``'us-ascii'``.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci   For convenience, if the *value* passed to :func:`collapse_rfc2231_value` is not
2077db96d56Sopenharmony_ci   a tuple, it should be a string and it is returned unquoted.
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci.. function:: decode_params(params)
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci   Decode parameters list according to :rfc:`2231`.  *params* is a sequence of
2137db96d56Sopenharmony_ci   2-tuples containing elements of the form ``(content-type, string-value)``.
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci.. rubric:: Footnotes
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci.. [#] Note that the sign of the timezone offset is the opposite of the sign of the
2197db96d56Sopenharmony_ci   ``time.timezone`` variable for the same timezone; the latter variable follows
2207db96d56Sopenharmony_ci   the POSIX standard while this module follows :rfc:`2822`.
221