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