"email.utils" : utilitaires divers
**********************************

**Code source :** Lib/email/utils.py

======================================================================

Il y a quelques utilitaires utiles fournis dans le module
"email.utils" :

email.utils.localtime(dt=None)

   Renvoie l'heure locale en tant qu'objet *datetime* avisé. S'il est
   appelé sans arguments, renvoie l'heure actuelle. Sinon, l'argument
   *dt* doit être une instance "datetime", et il est converti dans le
   fuseau horaire local en fonction de la base de données des fuseaux
   horaires du système. Si *dt* est naïf (c'est-à-dire que "dt.tzinfo"
   vaut "None"), il est supposé être en heure locale. Dans ce cas, une
   valeur positive ou nulle pour *isdst* amène "localtime" à supposer
   initialement que l'heure d'été est ou n'est pas (respectivement) en
   vigueur pour l'heure spécifiée. Une valeur négative pour *isdst*
   fait que "localtime" tente de deviner si l'heure d'été est en
   vigueur pour l'heure spécifiée.

   Nouveau dans la version 3.3.

email.utils.make_msgid(idstring=None, domain=None)

   Renvoie une chaîne adaptée à un en-tête  *Message-ID* compatible
   **RFC 2822**. *idstring*, s'il est fourni, est une chaîne utilisée
   pour renforcer l'unicité de l'identifiant du message. Le *domain*
   facultatif, s'il est fourni, fournit la partie du *msgid* après le
   '@'. La valeur par défaut est le nom d'hôte local. Il n'est
   normalement pas nécessaire de remplacer cette valeur par défaut,
   mais cela peut être utile dans certains cas, comme la construction
   d'un système distribué qui utilise un nom de domaine cohérent sur
   plusieurs hôtes.

   Modifié dans la version 3.2: ajout du mot-clé *domaine*.

Les fonctions restantes font partie de l'ancienne API de messagerie
("Compat32"). Il n'est pas nécessaire de les utiliser directement avec
la nouvelle API, car l'analyse et le formatage qu'elles fournissent
sont effectués automatiquement par le mécanisme d'analyse d'en-tête de
la nouvelle API.

email.utils.quote(str)

   Renvoie une nouvelle chaîne avec les barres obliques inverses
   (*backslash*) dans *str* remplacées par deux barres obliques
   inverses et les guillemets doubles remplacés par des guillemets
   doubles échappés par une barre oblique inverse.

email.utils.unquote(str)

   Renvoie une nouvelle chaîne qui est une version *sans guillemets*
   de *str*. Si *str* se termine et commence par des guillemets
   doubles, ils sont supprimés. De même, si *str* est encadrée par des
   chevrons mathématiques, ils sont supprimés.

email.utils.parseaddr(address, *, strict=True)

   Analyse l'adresse – qui devrait être la valeur d'un champ contenant
   une adresse tel que *To* ou *Cc* – dans ses parties constituantes
   *realname* et *email address*. Renvoie un *n*-uplet de cette
   information, sauf si l'analyse échoue, alors un couple "('', '')"
   est renvoyé.

   If *strict* is true, use a strict parser which rejects malformed
   inputs.

   Modifié dans la version 3.11.10: Add *strict* optional parameter
   and reject malformed inputs by default.

email.utils.formataddr(pair, charset='utf-8')

   L'inverse de "parseaddr()", elle prend un couple de la forme
   "(realname, email_address)" et renvoie la valeur de chaîne
   appropriée pour un en-tête *To* ou *Cc*. Si le premier élément de
   *pair* s'évalue à faux, alors le deuxième élément est renvoyé sans
   modification.

   Le *charset* optionnel est le jeu de caractères qui est utilisé
   dans l'encodage **RFC 2047** du "realname" si le "realname"
   contient des caractères non-ASCII. Cela peut être une instance de
   "str" ou un "Charset". La valeur par défaut est "utf-8".

   Modifié dans la version 3.3: ajout de l'option *charset*.

email.utils.getaddresses(fieldvalues, *, strict=True)

   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".

   If *strict* is true, use a strict parser which rejects malformed
   inputs.

   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)

   Modifié dans la version 3.11.10: Add *strict* optional parameter
   and reject malformed inputs by default.

email.utils.parsedate(date)

   Tente d'analyser une date selon les règles de la **RFC 2822**.
   Cependant, certains expéditeurs ne suivent pas ce format comme
   spécifié, donc "parsedate()" fait son possible dans de tels cas.
   *date* est une chaîne contenant une date **RFC 2822**, telle que
   ""Mon, 20 Nov 1995 19:12:08 -0500"". Si elle réussit à analyser la
   date, "parsedate()" renvoie un 9-uplet qui peut être passé
   directement à "time.mktime()" ; sinon "None" est renvoyé. Notez que
   les indices 6, 7 et 8 du *n*-uplet résultat ne sont pas
   utilisables.

email.utils.parsedate_tz(date)

   Effectue la même fonction que "parsedate()", mais renvoie soit
   "None" ou un 10-uplet ; les 9 premiers éléments constituent un
   *n*-uplet qui peut être passé directement à "time.mktime()", et le
   dixième est le décalage du fuseau horaire de la date par rapport à
   UTC (qui est le terme officiel pour *Greenwich Mean Time*) [1]. Si
   la chaîne d'entrée n'a pas de fuseau horaire, le dernier élément du
   *n*-uplet renvoyé est "0", qui représente l'UTC. Notez que les
   indices 6, 7 et 8 du *n*-uplet résultat ne sont pas utilisables.

email.utils.parsedate_to_datetime(date)

   L'inverse de "format_datetime()". Effectue la même fonction que
   "parsedate()" mais, en cas de succès, renvoie un "datetime" ; sinon
   une "ValueError" est levée si *date* contient une valeur invalide
   telle qu'une heure supérieure à 23 ou un décalage de fuseau horaire
   non compris entre −24 et 24 heures. Si la date d'entrée a un fuseau
   horaire de "-0000", le "datetime" sera un "datetime" naïf, et si la
   date est conforme aux RFC, elle représentera une heure en UTC mais
   sans indication du fuseau horaire source réel du message d'où
   provient la date. Si la date d'entrée a un autre décalage de fuseau
   horaire valide, le "datetime" sera un "datetime" avisé avec le
   "timezone" "tzinfo" adéquat.

   Nouveau dans la version 3.3.

email.utils.mktime_tz(tuple)

   Transforme un 10-uplet renvoyé par "parsedate_tz()" en un
   horodatage UTC (en secondes depuis *Epoch*). Si l'élément de fuseau
   horaire dans le *n*-uplet est "None", elle considère que l'heure
   est locale.

email.utils.formatdate(timeval=None, localtime=False, usegmt=False)

   Renvoie une chaîne de date conforme à la **RFC 2822**, par exemple
   :

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

   *timeval*, s'il est fourni, est une valeur de temps à virgule
   flottante telle qu'acceptée par "time.gmtime()" et
   "time.localtime()", sinon l'heure actuelle est utilisée.

   L'option *localtime* est un indicateur qui, lorsqu'il est "True",
   interprète *timeval* et renvoie une date relative au fuseau horaire
   local au lieu de UTC, en tenant correctement compte de l'heure
   d'été. La valeur par défaut est "False", ce qui signifie que l'UTC
   est utilisée.

   L'option *usegmt* est un indicateur qui, lorsqu'il est "True",
   affiche une chaîne de date avec le fuseau horaire sous la forme de
   la chaîne ASCII "GMT", plutôt qu'un "-0000" numérique. C'est
   nécessaire pour certains protocoles (tels que HTTP). Cela ne
   s'applique que lorsque *localtime* est "False". La valeur par
   défaut est "False".

email.utils.format_datetime(dt, usegmt=False)

   Comme "formatdate", mais l'entrée est une instance "datetime". S'il
   s'agit d'un groupe date-heure naïf, il est considéré être « UTC
   sans information sur le fuseau horaire source », et le "-0000"
   conventionnel est utilisé pour le fuseau horaire. S'il s'agit d'un
   "datetime" avisé, alors le décalage numérique du fuseau horaire est
   utilisé. S'il s'agit d'un groupe date-heure avisé avec un décalage
   de fuseau horaire de zéro, alors *usegmt* peut être défini sur
   "True", la chaîne "GMT" est alors utilisée à la place du décalage
   numérique du fuseau horaire. Cela fournit un moyen de générer des
   en-têtes de date HTTP conformes aux normes.

   Nouveau dans la version 3.3.

email.utils.decode_rfc2231(s)

   Décode la chaîne *s* selon la **RFC 2231**.

email.utils.encode_rfc2231(s, charset=None, language=None)

   Encode la chaîne *s* selon la **RFC 2231**. *charset* et
   *language*, s'ils sont fournis, indiquent le jeu de caractères et
   le nom de la langue à utiliser. Si aucun n'est donné, *s* est
   renvoyé telle quelle. Si *charset* est donné mais que *language* ne
   l'est pas, la chaîne est encodée en utilisant la chaîne vide pour
   *language*.

email.utils.collapse_rfc2231_value(value, errors='replace', fallback_charset='us-ascii')

   Lorsqu'un paramètre d'en-tête est encodé au format **RFC 2231**,
   "Message.get_param" peut renvoyer un triplet contenant le jeu de
   caractères, la langue et la valeur. "collapse_rfc2231_value()"
   transforme cela en une chaîne Unicode. *errors* (facultatif) est
   passé à l'argument *errors* de la méthode "encode()" de "str" ; sa
   valeur par défaut est "'replace'". *fallback_charset* (facultatif)
   spécifie le jeu de caractères à utiliser si celui de l'en-tête
   **RFC 2231** n'est pas connu de Python ; sa valeur par défaut est
   "'us-ascii'".

   Pour plus de commodité, si la *valeur* transmise à
   "collapse_rfc2231_value()" n'est pas un *n*-uplet, ce doit être une
   chaîne et elle est renvoyée sans guillemets.

email.utils.decode_params(params)

   Décode la liste des paramètres selon la **RFC 2231**. *params* est
   une séquence de couples contenant des éléments de la forme
   "(content-type, string-value)".

-[ Notes ]-

[1] Notez que le signe du décalage horaire est l'opposé du signe de la
    variable "time.timezone" pour le même fuseau horaire ; cette
    dernière variable suit la norme POSIX tandis que ce module suit la
    **RFC 2822**.
