"email.message.Message" : représentation d'un message électronique à l'aide de l'API "compat32"
***********************************************************************************************

La classe "Message" est très similaire à la classe "EmailMessage",
sans les méthodes ajoutées par cette classe et avec le comportement
par défaut légèrement différent pour certaines autres méthodes. Nous
documentons également ici certaines méthodes qui, bien que prises en
charge par la classe "EmailMessage", ne sont pas recommandées, sauf si
vous avez affaire à du code hérité.

La philosophie et la structure des deux classes sont par ailleurs les
mêmes.

Ce document décrit le comportement avec les règles par défaut (pour
"Message") "Compat32". Si vous envisagez d'utiliser d'autres règles,
vous devriez plutôt utiliser la classe "EmailMessage".

Un message électronique se compose d'*en-têtes* et d'une *charge
utile*. Les en-têtes doivent être des noms et des valeurs de style
**RFC 5322**, où le nom et la valeur du champ sont séparés par deux-
points. Les deux-points ne font partie ni du nom du champ ni de la
valeur du champ. La charge utile peut être un simple message texte, ou
un objet binaire, ou une séquence structurée de sous-messages chacun
avec son propre ensemble d'en-têtes et sa propre charge utile. Ce
dernier type de charge utile est indiqué par le message ayant un type
MIME tel que *multipart/** ou *message/rfc822*.

Le modèle conceptuel fourni par un objet "Message" est celui d'un
dictionnaire ordonné d'en-têtes avec des méthodes supplémentaires pour
accéder à la fois aux informations spécialisées des en-têtes, pour
accéder à la charge utile, pour générer une version sérialisée du
message et pour parcourir récursivement l'arbre d'objets. Notez que
les en-têtes en double sont pris en charge mais que des méthodes
spéciales doivent être utilisées pour y accéder.

Le pseudo-dictionnaire "Message" est indicé par les noms d'en-tête,
qui doivent être des valeurs ASCII. Les valeurs du dictionnaire sont
des chaînes censées contenir uniquement des caractères ASCII ; il
existe une gestion spéciale pour les entrées non ASCII, mais cela ne
produit pas toujours les résultats corrects. Les en-têtes sont stockés
et renvoyés sous une forme respectant la casse, mais les noms de champ
sont mis en correspondance sans tenir compte de la casse. Il peut
également y avoir un seul en-tête d'enveloppe, également appelé en-
tête *Unix-From* ou en-tête "From_". La *charge utile* est soit une
chaîne ou des octets, dans le cas d'objets message simples, soit une
liste d'objets "Message", pour les documents conteneurs MIME (par
exemple *multipart/** et *message/rfc822*).

Voici les méthodes de la classe "Message" :

class email.message.Message(policy=compat32)

   Si *policy* est spécifié (il doit s'agir d'une instance d'une
   classe "policy"), utilise les règles spécifiées pour mettre à jour
   et sérialiser la représentation du message. Si *policy* n'est pas
   défini, utilise les règles "compat32", qui maintient la
   rétrocompatibilité avec la version Python 3.2 du paquet de
   messagerie. Pour plus d'informations, consultez la documentation
   "policy".

   Modifié dans la version 3.3: l'argument nommé *policy* a été
   ajouté.

   as_string(unixfrom=False, maxheaderlen=0, policy=None)

      Renvoie le message entier aplati sous forme de chaîne. Lorsque
      l'option *unixfrom* est vraie, l'en-tête de l'enveloppe est
      inclus dans la chaîne renvoyée. *unixfrom* par défaut est
      "False". Pour des raisons de compatibilité descendante,
      *maxheaderlen* est par défaut à "0", donc si vous voulez une
      valeur différente, vous devez la remplacer explicitement (la
      valeur spécifiée pour *max_line_length* dans la politique sera
      ignorée par cette méthode). L'argument *policy* peut être
      utilisé pour remplacer les règles par défaut obtenues à partir
      de l'instance de message. Cela peut être utilisé pour contrôler
      une partie du formatage produit par la méthode, puisque la
      *policy* spécifiée est transmise au "Generator".

      L'aplatissement du message peut déclencher des changements dans
      "Message" si les valeurs par défaut doivent être renseignées
      pour terminer la transformation en chaîne (par exemple, les
      limites MIME peuvent être générées ou modifiées).

      Notez que cette méthode est fournie à titre de commodité et peut
      ne pas toujours formater le message comme vous le souhaitez. Par
      exemple, par défaut, elle ne reformate pas les lignes qui
      commencent par "From" qui est requis par le format *mbox* Unix.
      Pour plus de flexibilité, instanciez une instance "Generator" et
      utilisez sa méthode "flatten()" directement. Par exemple :

         from io import StringIO
         from email.generator import Generator
         fp = StringIO()
         g = Generator(fp, mangle_from_=True, maxheaderlen=60)
         g.flatten(msg)
         text = fp.getvalue()

      Si l'objet message contient des données binaires qui ne sont pas
      encodées selon les normes RFC, les données non conformes seront
      remplacées par des points de code Unicode « caractère inconnu »
      (voir aussi "as_bytes()" et "BytesGenerator").

      Modifié dans la version 3.4: l'argument nommé *policy* a été
      ajouté.

   __str__()

      Équivalent à "as_string()". Permet à "str(msg)" de produire une
      chaîne contenant le message formaté.

   as_bytes(unixfrom=False, policy=None)

      Renvoie le message entier aplati en tant qu'objet bytes. Lorsque
      l'option *unixfrom* est vraie, l'en-tête de l'enveloppe est
      inclus dans la chaîne renvoyée. *unixfrom* par défaut est
      "False". L'argument *policy* peut être utilisé pour remplacer
      les règles par défaut obtenues à partir de l'instance de
      message. Cela peut être utilisé pour contrôler une partie du
      formatage produit par la méthode, puisque la *policy* spécifiée
      est passée au "BytesGenerator".

      L'aplatissement du message peut déclencher des changements dans
      "Message" si les valeurs par défaut doivent être renseignées
      pour terminer la transformation en chaîne (par exemple, les
      limites MIME peuvent être générées ou modifiées).

      Notez que cette méthode est fournie à titre de commodité et peut
      ne pas toujours formater le message comme vous le souhaitez. Par
      exemple, par défaut, elle ne reformate pas les lignes qui
      commencent par "From" qui est requis par le format *mbox* Unix.
      Pour plus de flexibilité, instanciez une instance
      "BytesGenerator" et utilisez sa méthode "flatten()" directement.
      Par exemple :

         from io import BytesIO
         from email.generator import BytesGenerator
         fp = BytesIO()
         g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
         g.flatten(msg)
         text = fp.getvalue()

      Added in version 3.4.

   __bytes__()

      Équivalent à "as_bytes()". Permet à "bytes(msg)" de produire un
      objet bytes contenant le message formaté.

      Added in version 3.4.

   is_multipart()

      Renvoie "True" si la charge utile du message est une liste
      d'objets sous-"Message", sinon renvoie "False". Lorsque
      "is_multipart()" renvoie "False", la charge utile doit être un
      objet chaîne (qui peut être une charge utile binaire encodée
      CTE). (Notez que "is_multipart()" renvoyant "True" ne signifie
      pas nécessairement que "msg.get_content_maintype() ==
      'multipart'" renvoie "True". Par exemple, "is_multipart" renvoie
      "True" lorsque le "Message" est de type "message/rfc822".)

   set_unixfrom(unixfrom)

      Définit l'en-tête de l'enveloppe du message sur *unixfrom*, qui
      doit être une chaîne.

   get_unixfrom()

      Renvoie l'en-tête de l'enveloppe du message. La valeur par
      défaut est "None" si l'en-tête de l'enveloppe n'a jamais été
      défini.

   attach(payload)

      Ajoute le *payload* donné à la charge utile actuelle, qui doit
      être "None" ou une liste d'objets "Message" avant l'appel. Après
      l'appel, la charge utile sera toujours une liste d'objets
      "Message". Si vous souhaitez définir la charge utile sur un
      objet scalaire (par exemple, une chaîne), utilisez
      "set_payload()" à la place.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage"
      sa fonctionnalité est remplacée par "set_content()" et les
      méthodes associées "make" et "add".

   get_payload(i=None, decode=False)

      Renvoie la charge utile actuelle, qui est une liste d'objets
      "Message" lorsque "is_multipart()" est "True", ou une chaîne
      lorsque "is_multipart()" est "False". Si la charge utile est une
      liste et que vous modifiez l'objet liste, vous modifiez la
      charge utile du message « sur place ».

      Avec l'argument optionnel *i*, "get_payload()" renvoie le
      *i*^ème élément de la charge utile, en partant de zéro, si
      "is_multipart()" vaut "True". Une "IndexError" est levée si *i*
      est inférieur à 0 ou supérieur ou égal au nombre d'éléments dans
      la charge utile. Si la charge utile est une chaîne (c'est-à-dire
      que "is_multipart()" est "False") et que *i* est donné, une
      "TypeError" est levée.

      *decode* est un indicateur facultatif indiquant si la charge
      utile doit être décodée ou non, selon l'en-tête *Content-
      Transfer-Encoding*. Lorsqu'il vaut "True" et que le message
      n'est pas en plusieurs parties, la charge utile est décodée si
      la valeur de cet en-tête est "quoted-printable" ou "base64". Si
      un autre encodage est utilisé, ou si l'en-tête *Content-
      Transfer-Encoding* est manquant, la charge utile est renvoyée
      telle quelle (non décodée). Dans tous les cas, la valeur
      renvoyée est une donnée binaire. Si le message est en plusieurs
      parties et que l'indicateur *decode* est "True", alors "None"
      est renvoyé. Si la charge utile est en base64 et qu'elle n'a pas
      été parfaitement formée (remplissage manquant, caractères en
      dehors de l'alphabet base64), alors un défaut approprié est
      ajouté à la propriété de défaut du message
      ("InvalidBase64PaddingDefect" ou
      "InvalidBase64CharactersDefect", respectivement).

      Lorsque *decode* est "False" (valeur par défaut), le corps est
      renvoyé sous forme de chaîne sans décoder le *Content-Transfer-
      Encoding*. Cependant, pour un *Content-Transfer-Encoding* de 8
      bits, une tentative est faite pour décoder les octets d'origine
      en utilisant le "charset" spécifié par l'en-tête *Content-Type*,
      en utilisant le gestionnaire d'erreurs "replace". Si aucun
      "charset" n'est spécifié, ou si le "charset" donné n'est pas
      reconnu par le paquet de messagerie, le corps est décodé en
      utilisant le jeu de caractères ASCII par défaut.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage"
      sa fonctionnalité est remplacée par "get_content()" et
      "iter_parts()".

   set_payload(payload, charset=None)

      Définit la charge utile de l'objet message entier à *payload*.
      Il est de la responsabilité du client de s'assurer des
      invariants de la charge utile. Le *charset* facultatif définit
      le jeu de caractères par défaut du message ; voir
      "set_charset()" pour plus de détails.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage"
      sa fonctionnalité est remplacée par "set_content()".

   set_charset(charset)

      Définit le jeu de caractères de la charge utile à *charset*, qui
      peut être soit une instance de "Charset" (voir "email.charset"),
      une chaîne nommant un jeu de caractères ou "None". S'il s'agit
      d'une chaîne, elle est convertie en une instance "Charset". Si
      *charset* est "None", le paramètre "charset" est supprimé de l
      'en-tête *Content-Type* (le message n'est pas modifié
      autrement). Tout le reste lève une "TypeError".

      S'il n'y a pas d'en-tête *MIME-Version* existant, un en-tête est
      ajouté. S'il n'y a pas d'en-tête *Content-Type*, un en-tête est
      ajouté avec une valeur de *text/plain*. Que l'en-tête *Content-
      Type* existe déjà ou non, son paramètre "charset" est défini sur
      *charset.output_charset*. Si *charset.input_charset* et
      *charset.output_charset* diffèrent, la charge utile est
      ré-encodée dans le *output_charset*. S'il n'y a pas d'en-tête
      *Content-Transfer-Encoding* existant, alors la charge utile est
      encodée par transfert, si nécessaire, en utilisant le "Charset"
      spécifié et un en-tête avec cette valeur est ajouté. Si un en-
      tête *Content-Transfer-Encoding* existe déjà, la charge utile
      est supposée être déjà correctement encodée à l'aide de cet en-
      tête *Content-Transfer-Encoding* et n'est pas modifiée.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage"
      sa fonctionnalité est remplacée par le paramètre *charset* de la
      méthode "email.emailmessage.EmailMessage.set_content()".

   get_charset()

      Renvoie l'instance "Charset" associée à la charge utile du
      message.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage",
      elle renvoie toujours "None".

   Les méthodes suivantes implémentent une interface de type
   correspondance pour accéder aux en-têtes **RFC 2822** du message.
   Notez qu'il existe des différences sémantiques entre ces méthodes
   et une interface de correspondance normale (c'est-à-dire un
   dictionnaire). Par exemple, dans un dictionnaire, il n'y a pas de
   clés en double, mais ici, il peut y avoir des en-têtes de message
   en double. De plus, dans les dictionnaires, il n'y a pas d'ordre
   garanti pour les clés renvoyées par "keys()", mais dans un objet
   "Message", les en-têtes sont toujours renvoyés dans l'ordre dans
   lequel ils sont apparus dans le message d'origine, ou ont été
   ajoutés au message plus tard. Tout en-tête supprimé puis rajouté
   est toujours ajouté à la fin de la liste des en-têtes.

   Ces différences sémantiques sont intentionnelles et visent une
   commodité maximale.

   Notez que dans tous les cas, tout en-tête d'enveloppe présent dans
   le message n'est pas inclus dans l'interface de correspondance.

   Dans un modèle généré à partir d'octets, toutes les valeurs d'en-
   tête qui (en violation des RFC) contiennent des octets non-ASCII
   sont, lorsqu'elles sont récupérées via cette interface,
   représentées comme des objets "Header" avec un *charset* à
   "unknown-8bit".

   __len__()

      Renvoie le nombre total d'en-têtes, y compris les doublons.

   __contains__(name)

      Renvoie "True" si l'objet message a un champ nommé *name*. La
      correspondance est insensible à la casse et *name* ne doit pas
      inclure les deux-points à la fin. Utilisé pour l'opérateur "in",
      par exemple :

         if 'message-id' in myMessage:
            print('Message-ID:', myMessage['message-id'])

   __getitem__(name)

      Renvoie la valeur du champ d'en-tête désigné. *name* ne doit pas
      inclure le séparateur de champ deux-points. Si l'en-tête est
      manquant, "None" est renvoyé ; "KeyError" n'est jamais levée.

      Notez que si le champ désigné apparaît plus d'une fois dans les
      en-têtes du message, la valeur exacte renvoyée n'est pas
      définie. Utilisez la méthode "get_all()" pour obtenir les
      valeurs de tous les en-têtes existants.

   __setitem__(name, val)

      Ajoute un en-tête au message avec le nom de champ *name* et la
      valeur *val*. Le champ est ajouté à la fin des champs existants
      du message.

      Notez que cela n'écrase *pas* ou ne supprime aucun en-tête
      existant portant le même nom. Si vous voulez vous assurer que le
      nouvel en-tête est le seul présent dans le message avec le nom
      de champ *name*, supprimez d'abord le champ, par exemple :

         del msg['subject']
         msg['subject'] = 'Python roolz!'

   __delitem__(name)

      Supprime toutes les occurrences du champ portant le nom *name*
      des en-têtes du message. Aucune exception n'est levée si le
      champ désigné n'est pas présent dans les en-têtes.

   keys()

      Renvoie une liste de tous les noms de champs d'en-tête du
      message.

   values()

      Renvoie une liste de toutes les valeurs de champ du message.

   items()

      Renvoie une liste de couples contenant tous les en-têtes et
      valeurs de champs associées du message.

   get(name, failobj=None)

      Return the value of the named header field.  This is identical
      to "__getitem__()" except that optional *failobj* is returned if
      the named header is missing (defaults to "None").

   Voici quelques méthodes supplémentaires utiles :

   get_all(name, failobj=None)

      Renvoie la liste de toutes les valeurs du champ nommé *name*.
      S'il n'y a pas d'en-têtes de ce nom dans le message, *failobj*
      est renvoyé (la valeur par défaut est "None").

   add_header(_name, _value, **_params)

      Définition de paramètres d'en-têtes étendus. Cette méthode est
      similaire à "__setitem__()" sauf que des paramètres d'en-tête
      supplémentaires peuvent être fournis en tant qu'arguments
      nommés. *_name* est le champ d'en-tête à ajouter et *_value* est
      la valeur *primaire* de l'en-tête.

      Pour chaque élément du dictionnaire d'arguments nommés
      *_params*, la clé est prise comme nom de paramètre, avec des
      traits de soulignement convertis en tirets (puisque les tirets
      sont illégaux dans les identifiants Python). Normalement, le
      paramètre est ajouté en tant que "key="value"" sauf si la valeur
      est "None", auquel cas seule la clé est ajoutée. Si la valeur
      contient des caractères non-ASCII, elle peut être spécifiée sous
      la forme d'un triplet au format "(CHARSET, LANGUAGE, VALUE)", où
      "CHARSET" est une chaîne nommant le jeu de caractères à utiliser
      pour coder la valeur, "LANGUAGE" peut généralement être défini
      sur "None" ou la chaîne vide (voir la **RFC 2231** pour d'autres
      possibilités), et "VALUE" est la valeur de chaîne contenant des
      points de code non-ASCII. Si un triplet n'est pas passé et que
      la valeur contient des caractères non-ASCII, elle est
      automatiquement encodée au format **RFC 2231** en utilisant un
      "CHARSET" à "utf-8" et un "LANGUAGE" à "None".

      Voici un exemple :

         msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

      Cela ajoute un en-tête qui ressemble à :

         Content-Disposition: attachment; filename="bud.gif"

      Un exemple avec des caractères non-ASCII :

         msg.add_header('Content-Disposition', 'attachment',
                        filename=('iso-8859-1', '', 'Fußballer.ppt'))

      qui produit :

         Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"

   replace_header(_name, _value)

      Remplace un en-tête. Remplace le premier en-tête trouvé dans le
      message qui correspond à *_name*, en conservant l'ordre des en-
      têtes et la casse des noms de champs. Si aucun en-tête
      correspondant n'a été trouvé, une "KeyError" est levée.

   get_content_type()

      Renvoie le type de contenu du message. La chaîne renvoyée est
      convertie en minuscules sous la forme *maintype/subtype*. S'il
      n'y avait pas d'en-tête *Content-Type* dans le message, le type
      par défaut tel qu'indiqué par "get_default_type()" est renvoyé.
      Puisque selon la **RFC 2045**, les messages ont toujours un type
      par défaut, "get_content_type()" renvoie toujours une valeur.

      La **RFC 2045** définit le type par défaut d'un message comme
      étant *text/plain* sauf s'il apparaît dans un conteneur
      *multipart/digest*, auquel cas ce serait *message/rfc822*. Si l
      'en-tête *Content-Type* a une spécification de type invalide, la
      **RFC 2045** exige que le type par défaut soit *text/plain*.

   get_content_maintype()

      Renvoie le type de contenu principal du message. C'est la partie
      *maintype* de la chaîne renvoyée par "get_content_type()".

   get_content_subtype()

      Renvoie le type de sous-contenu du message. C'est la partie
      *subtype* de la chaîne renvoyée par "get_content_type()".

   get_default_type()

      Renvoie le type de contenu par défaut. La plupart des messages
      ont un type de contenu par défaut de *text/plain*, à l'exception
      des messages qui sont des sous-parties des conteneurs
      *multipart/digest*. Ces sous-parties ont un type de contenu par
      défaut de *message/rfc822*.

   set_default_type(ctype)

      Définit le type de contenu par défaut. *ctype* doit être
      *text/plain* ou *message/rfc822*, bien que cela ne soit pas
      appliqué. Le type de contenu par défaut n'est pas stocké dans l
      'en-tête *Content-Type*.

   get_params(failobj=None, header='content-type', unquote=True)

      Renvoie les paramètres *Content-Type* du message, sous forme de
      liste. Les éléments de la liste renvoyée sont des couples
      clé-valeur, ayant été séparés sur le signe "'='". Le côté gauche
      du "'='" est la clé, tandis que le côté droit est la valeur.
      S'il n'y a pas de signe "'='" dans le paramètre, la valeur est
      la chaîne vide, sinon la valeur est telle que décrite dans
      "get_param()" et n'est pas entre guillemets si l'option
      *unquote* est "True" (la valeur par défaut).

      *failobj* (facultatif) est l'objet à renvoyer s'il n'y a pas d
      'en-tête *Content-Type*. *header* (facultatif) est l'en-tête à
      rechercher au lieu de *Content-Type*.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage",
      sa fonctionnalité est remplacée par la propriété *params* des
      objets d'en-tête individuels renvoyés par les méthodes d'accès
      aux en-têtes.

   get_param(param, failobj=None, header='content-type', unquote=True)

      Renvoie la valeur du paramètre *param* de l'en-tête *Content-
      Type* sous forme de chaîne. Si le message n'a pas d'en-tête
      *Content-Type* ou s'il n'y a pas un tel paramètre, alors
      *failobj* est renvoyé (par défaut à "None").

      *header* s'il est fourni, spécifie l'en-tête de message à
      utiliser à la place de *Content-Type*.

      Les clés en paramètre sont toujours comparées sans tenir compte
      de la casse. La valeur de retour peut être soit une chaîne, soit
      un triplet si le paramètre a été encodé selon la **RFC 2231**.
      Lorsqu'il s'agit d'un triplet, les éléments de la valeur sont de
      la forme "(CHARSET, LANGUAGE, VALUE)". Notez que "CHARSET" et
      "LANGUAGE" peuvent être "None", vous devriez alors considérer
      que "VALUE" est encodé dans le jeu de caractères "us-ascii".
      Vous pouvez généralement ignorer "LANGUAGE".

      Si votre application ne se soucie pas de savoir si le paramètre
      a été encodé conformément à la **RFC 2231**, vous pouvez réduire
      la valeur du paramètre en appelant
      "email.utils.collapse_rfc2231_value()", en transmettant la
      valeur de retour de "get_param()". Cela renverra une chaîne
      Unicode convenablement décodée lorsque la valeur est un
      *n*-uplet, ou la chaîne d'origine sans guillemets si ce n'est
      pas le cas. Par exemple :

         rawparam = msg.get_param('foo')
         param = email.utils.collapse_rfc2231_value(rawparam)

      Dans tous les cas, la valeur du paramètre (soit la chaîne
      renvoyée, soit l'élément "VALUE" dans le triplet) est toujours
      sans guillemets, sauf si *unquote* est défini sur "False".

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage",
      sa fonctionnalité est remplacée par la propriété *params* des
      objets d'en-tête individuels renvoyés par les méthodes d'accès
      aux en-têtes.

   set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)

      Définit un paramètre dans l'en-tête *Content-Type*. Si le
      paramètre existe déjà dans l'en-tête, sa valeur est remplacée
      par *value*. Si l'en-tête *Content-Type* n'a pas encore été
      défini pour ce message, il est défini à *text/plain* et la
      nouvelle valeur du paramètre est ajoutée conformément à la **RFC
      2045**.

      L'option *header* spécifie un en-tête alternatif à *Content-
      Type*, et tous les paramètres seront entre guillemets si
      nécessaire sauf si l'option *requote* est "False" (la valeur par
      défaut est "True").

      Si *charset* est spécifié, le paramètre est encodé selon la
      **RFC 2231**. *language* (facultatif) spécifie la langue RFC
      2231, par défaut c'est la chaîne vide. *charset* et *language*
      doivent être des chaînes.

      Si *replace* est "False" (valeur par défaut), l'en-tête est
      déplacé à la fin de la liste des en-têtes. Si *replace* est
      "True", l'en-tête est mis à jour « sur place ».

      Modifié dans la version 3.4: l'argument nommé "replace" a été
      ajouté.

   del_param(param, header='content-type', requote=True)

      Supprime complètement le paramètre donné de l'en-tête *Content-
      Type*. L'en-tête est réécrit « sur place » sans le paramètre ou
      sa valeur. Toutes les valeurs seront entre guillemets si
      nécessaire sauf si *requote* est "False" (la valeur par défaut
      est "True"). L'option *header* spécifie une alternative à
      *Content-Type*.

   set_type(type, header='Content-Type', requote=True)

      Définit le type principal et le sous-type de l'en-tête *Content-
      Type*. *type* doit être une chaîne sous la forme
      *maintype/subtype*, sinon une "ValueError" est levée.

      Cette méthode remplace l'en-tête *Content-Type*, en gardant tous
      les paramètres en place. Si *requote* est "False", cela laisse
      les guillemets de l'en-tête existant tels quels, sinon les
      paramètres sont mis entre guillemets (par défaut).

      Un en-tête alternatif peut être spécifié dans l'argument
      *header*. Lorsque l'en-tête *Content-Type* est défini, un en-
      tête *MIME-Version* est également ajouté.

      Il s'agit d'une ancienne méthode. Dans la classe "EmailMessage"
      sa fonctionnalité est remplacée par les méthodes "make_" et
      "add_".

   get_filename(failobj=None)

      Renvoie la valeur du paramètre "filename" de l'en-tête *Content-
      Disposition* du message. Si l'en-tête n'a pas de paramètre
      "filename", cette méthode revient à rechercher le paramètre
      "name" dans l'en-tête *Content-Type*. Si aucun n'est trouvé, ou
      si l'en-tête est manquant, alors *failobj* est renvoyé. La
      chaîne renvoyée est toujours sans guillemets comme indiqué par
      "email.utils.unquote()".

   get_boundary(failobj=None)

      Renvoie la valeur du paramètre "boundary" de l'en-tête *Content-
      Type* du message, ou *failobj* si l'en-tête est manquant ou n'a
      pas de paramètre "boundary". La chaîne renvoyée est toujours
      sans guillemets comme indiqué par "email.utils.unquote()".

   set_boundary(boundary)

      Définit le paramètre "boundary" de l'en-tête *Content-Type* sur
      *boundary*. "set_boundary()" met toujours *boundary* entre
      guillemets si nécessaire. Une "HeaderParseError" est levée si
      l'objet message n'a pas d'en-tête *Content-Type*.

      Notez que l'utilisation de cette méthode est légèrement
      différente de la suppression de l'ancien en-tête *Content-Type*
      et de l'ajout d'un nouveau avec la nouvelle limite via
      "add_header()", car "set_boundary()" préserve l'ordre des en-
      têtes *Content-Type* dans la liste des en-têtes. Cependant, elle
      ne conserve *pas* les lignes de continuation qui auraient pu
      être présentes dans l'en-tête original *Content-Type*.

   get_content_charset(failobj=None)

      Renvoie le paramètre "charset" de l'en-tête *Content-Type*, mis
      en minuscules. S'il n'y a pas d'en-tête *Content-Type*, ou si
      cet en-tête n'a pas de paramètre "charset", *failobj* est
      renvoyé.

      Notez que cette méthode diffère de "get_charset()" qui renvoie
      l'instance "Charset" avec l'encodage par défaut du corps du
      message.

   get_charsets(failobj=None)

      Renvoie une liste contenant les noms des jeux de caractères dans
      le message. Si le message est un *multipart*, alors la liste
      contient un élément pour chaque sous-partie dans la charge
      utile, sinon, c'est une liste de longueur 1.

      Chaque élément de la liste est une chaîne qui est la valeur du
      paramètre "charset" dans l'en-tête *Content-Type* pour la sous-
      partie représentée. Cependant, si la sous-partie n'a pas d'en-
      tête *Content-Type*, pas de paramètre "charset", ou n'est pas du
      type MIME principal *text*, alors cet élément dans la liste
      renvoyée est *failobj*.

   get_content_disposition()

      Renvoie la valeur en minuscules (sans paramètres) de l'en-tête
      *Content-Disposition* du message s'il en a un, ou "None". Les
      valeurs possibles pour cette méthode sont *inline*, *attachment*
      ou "None" si le message suit la **RFC 2183**.

      Added in version 3.5.

   walk()

      La méthode "walk()" est un générateur polyvalent qui peut être
      utilisé pour itérer sur toutes les parties et sous-parties d'une
      arborescence d'objets de message, dans l'ordre de parcours en
      profondeur d'abord. Vous utiliserez généralement "walk()" comme
      itérateur dans une boucle "for" ; chaque itération renvoie la
      sous-partie suivante.

      Voici un exemple qui imprime le type MIME de chaque partie d'une
      structure de message en plusieurs parties :

         >>> for part in msg.walk():
         ...     print(part.get_content_type())
         multipart/report
         text/plain
         message/delivery-status
         text/plain
         text/plain
         message/rfc822
         text/plain

      "walk" itère sur les sous-parties de toute partie où
      "is_multipart()" renvoie "True", même si
      "msg.get_content_maintype() == 'multipart'" peut renvoyer
      "False". Nous pouvons le voir dans notre exemple en utilisant la
      fonction d'aide au débogage "_structure" :

         >>> for part in msg.walk():
         ...     print(part.get_content_maintype() == 'multipart',
         ...           part.is_multipart())
         True True
         False False
         False True
         False False
         False False
         False True
         False False
         >>> _structure(msg)
         multipart/report
             text/plain
             message/delivery-status
                 text/plain
                 text/plain
             message/rfc822
                 text/plain

      Ici, les parties "message" ne sont pas des "multiparts", mais
      elles contiennent des sous-parties. "is_multipart()" renvoie
      "True" et "walk" descend dans les sous-parties.

   Les objets "Message" peuvent aussi éventuellement contenir deux
   attributs d'instance, qui peuvent être utilisés lors de la
   génération du texte brut d'un message MIME.

   preamble

      Le format d'un document MIME permet d'insérer du texte entre la
      ligne vide suivant les en-têtes et la première chaîne de
      délimitation en plusieurs parties. Normalement, ce texte n'est
      jamais visible dans un lecteur de courrier compatible MIME car
      il ne fait pas partie du cadre MIME standard. Toutefois, lors de
      l'affichage du texte brut du message ou lors de l'affichage du
      message dans un lecteur non compatible MIME, ce texte peut
      devenir visible.

      L'attribut *preamble* contient ce texte hors-cadre de tête pour
      les documents MIME. Lorsque "Parser" découvre du texte après les
      en-têtes mais avant la première chaîne de délimitation, il
      attribue ce texte à l'attribut *preamble* du message. Lorsque
      "Generator" écrit la représentation en texte brut d'un message
      MIME, et qu'il trouve que le message a un attribut *preamble*,
      il écrit ce texte dans la zone entre les en-têtes et la première
      frontière. Voir "email.parser" et "email.generator" pour plus de
      détails.

      Notez que si l'objet message n'a pas de préambule, l'attribut
      *preamble* est "None".

   epilogue

      L'attribut *epilogue* agit de la même manière que l'attribut
      *preamble*, sauf qu'il contient du texte qui apparaît entre la
      dernière limite et la fin du message.

      Vous n'avez pas besoin de définir l'épilogue sur la chaîne vide
      pour que "Generator" imprime une nouvelle ligne à la fin du
      fichier.

   defects

      L'attribut *defects* contient une liste de tous les problèmes
      rencontrés lors de l'analyse de ce message. Voir "email.errors"
      pour une description détaillée des défauts d'analyse possibles.
