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èglescompat32
, qui maintient la rétrocompatibilité avec la version Python 3.2 du paquet de messagerie. Pour plus d'informations, consultez la documentationpolicy
.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 auGenerator
.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 instanceGenerator
et utilisez sa méthodeflatten()
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()
etBytesGenerator
).Modifié dans la version 3.4: l'argument nommé policy a été ajouté.
- __str__()¶
Equivalent to
as_string()
. Allowsstr(msg)
to produce a string containing the formatted message.
- 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 auBytesGenerator
.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 instanceBytesGenerator
et utilisez sa méthodeflatten()
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__()¶
Equivalent to
as_bytes()
. Allowsbytes(msg)
to produce a bytes object containing the formatted message.Ajouté dans la version 3.4.
- is_multipart()¶
Renvoie
True
si la charge utile du message est une liste d'objets sous-Message
, sinon renvoieFalse
. Lorsqueis_multipart()
renvoieFalse
, la charge utile doit être un objet chaîne (qui peut être une charge utile binaire encodée CTE). (Notez queis_multipart()
renvoyantTrue
ne signifie pas nécessairement quemsg.get_content_maintype() == 'multipart'
renvoieTrue
. Par exemple,is_multipart
renvoieTrue
lorsque leMessage
est de typemessage/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'objetsMessage
avant l'appel. Après l'appel, la charge utile sera toujours une liste d'objetsMessage
. Si vous souhaitez définir la charge utile sur un objet scalaire (par exemple, une chaîne), utilisezset_payload()
à la place.Il s'agit d'une ancienne méthode. Dans la classe
EmailMessage
sa fonctionnalité est remplacée parset_content()
et les méthodes associéesmake
etadd
.
- get_payload(i=None, decode=False)¶
Renvoie la charge utile actuelle, qui est une liste d'objets
Message
lorsqueis_multipart()
estTrue
, ou une chaîne lorsqueis_multipart()
estFalse
. 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, siis_multipart()
vautTrue
. UneIndexError
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 queis_multipart()
estFalse
) et que i est donné, uneTypeError
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 estquoted-printable
oubase64
. 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 estTrue
, alorsNone
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
ouInvalidBase64CharactersDefect
, 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 lecharset
spécifié par l'en-tête Content-Type, en utilisant le gestionnaire d'erreursreplace
. Si aucuncharset
n'est spécifié, ou si lecharset
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 parget_content()
etiter_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 parset_content()
.
- set_charset(charset)¶
Définit le jeu de caractères de la charge utile à charset, qui peut être soit une instance de
Charset
(voiremail.charset
), une chaîne nommant un jeu de caractères ouNone
. S'il s'agit d'une chaîne, elle est convertie en une instanceCharset
. Si charset estNone
, le paramètrecharset
est supprimé de l'en-tête Content-Type (le message n'est pas modifié autrement). Tout le reste lève uneTypeError
.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 leCharset
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éthodeemail.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 toujoursNone
.
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 objetMessage
, 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érateurin
, 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 toNone
).
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 estNone
, 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 surNone
ou la chaîne vide (voir la RFC 2231 pour d'autres possibilités), etVALUE
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 unCHARSET
àutf-8
et unLANGUAGE
à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 dansget_param()
et n'est pas entre guillemets si l'option unquote estTrue
(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 queCHARSET
etLANGUAGE
peuvent êtreNone
, vous devriez alors considérer queVALUE
est encodé dans le jeu de caractèresus-ascii
. Vous pouvez généralement ignorerLANGUAGE
.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 deget_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 surFalse
.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 estTrue
).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 estTrue
, 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 estTrue
). 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éthodesmake_
etadd_
.
- 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ètrefilename
, cette méthode revient à rechercher le paramètrename
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é paremail.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ètreboundary
. La chaîne renvoyée est toujours sans guillemets comme indiqué paremail.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. UneHeaderParseError
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()
, carset_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ètrecharset
, failobj est renvoyé.Notez que cette méthode diffère de
get_charset()
qui renvoie l'instanceCharset
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ètrecharset
, 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 ouNone
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éralementwalk()
comme itérateur dans une bouclefor
; 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()
renvoieTrue
, même simsg.get_content_maintype() == 'multipart'
peut renvoyerFalse
. 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 desmultiparts
, mais elles contiennent des sous-parties.is_multipart()
renvoieTrue
etwalk
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. LorsqueGenerator
é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. Voiremail.parser
etemail.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.