# `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()

    Ajouté dans la version 3.4.

  __bytes__()

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

    Ajouté dans la 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.

    Ajouté dans la 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.