email.policy
: Policy Objects¶
Added in version 3.3.
Código fuente: Lib/email/policy.py
El enfoque principal del paquete email
es la gestión de mensajes de correo electrónico como se describe por los varios RFC de correos electrónicos y MIME. Sin embargo, el formato general de los mensajes de correo electrónico (un bloque de campos de cabecera cada uno consistiendo en un nombre seguido de dos puntos seguido de un valor, el bloque entero seguido por una línea blanca y un “cuerpo” arbitrario), es un formato que ha encontrado utilidad fuera del campo de correos electrónicos. Algunos de estos usos cumplen bastante cerca los RFC de correos electrónicos principales, alguno no. Incluso cuando se trabajo con correos electrónicos, hay veces cuando es deseable romper la estricta conformidad con los RFC, tal como generar correos electrónicos que se integran con servidores de correos electrónicos que no siguen los estándares, o que implementan extensiones que quieres usar en formas que violan los estándares.
Los objetos policy dan al paquete de correos electrónicos la flexibilidad de manejar todos estos casos de uso diversos.
Un objeto Policy
encapsula un conjunto de atributos y métodos que controlan el comportamiento de varios componentes del paquete de correos electrónicos durante el uso. Las instancias Policy
pueden ser pasadas a varias clases y métodos en el paquete de correos electrónicos para alterar el comportamiento por defecto. Los valores que se pueden configurar y sus valores por defecto se describen abajo.
Hay una policy por defecto usada por todas las clases en el paquete de correos electrónicos. Para todos las clases Parser
y las funciones de conveniencia relacionadas, y para la clase Message
, esta es una policy Compat32
, a través de sus correspondientes instancias compat32
pre-definidas. Esta política mantiene una compatibilidad (en algunos casos, compatibilidad con los bugs) con el paquete de correos electrónicos de las versiones anteriores de Python3.3.
El valor por defecto para la palabra clave policy de EmailMessage
es la policy EmailPolicy
, a través de su instancia pre-definida default
.
Cuando un objeto Message
o EmailMessage
es creado, adquiere un policy. Si el mensaje es creado por un parser
, un policy pasado al analizador será el policy usado por el mensaje que cree. Si el mensaje es creado por el programa, entonces el policy puede ser especificado cuando sea creado. Cuando un mensaje es pasado a un generator
, el generador usa el policy del mensaje por defecto, pero también puedes pasar un policy específico al generador que anulará el que está guardado en el objeto mensaje.
El valor por defecto del argumento por palabra clave policy para las clases email.parser
y las funciones de conveniencia del analizador se cambiarán en una futura versión de Python. Por consiguiente, siempre debes especificar explícitamente qué policy quieres usar cuando se llama a cualquiera de las clases y funciones descritas en el módulo parser
.
La primera parte de esta documentación cubre las características de Policy
, un abstract base class que define las características que son comunes a todos los objetos policy, incluyendo compat32
. Esto incluye ciertos métodos gancho (hook) que son llamados internamente por el paquete de correos electrónicos, que un policy personalizado puede invalidar para obtener un comportamiento diferente. La segunda parte describe las clases concretas EmailPolicy
y Compat32
, que implementan los ganchos (hooks) que proporcionan el comportamiento estándar y el comportamiento y características compatibles hacia atrás, respectivamente.
Las instancias Policy
son inmutables, pero pueden ser clonadas, aceptando los mismos argumentos de palabra clave que el constructor de clase y retorna una nueva instancia Policy
que es una copia del original pero con los valores de atributos específicos cambiados.
Como un ejemplo, el siguiente código puede ser usado para leer un mensaje de correo electrónico de un archivo en disco y pasarlo al programa de sistema sendmail
en un sistema Unix:
>>> from email import message_from_binary_file
>>> from email.generator import BytesGenerator
>>> from email import policy
>>> from subprocess import Popen, PIPE
>>> with open('mymsg.txt', 'rb') as f:
... msg = message_from_binary_file(f, policy=policy.default)
...
>>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)
>>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))
>>> g.flatten(msg)
>>> p.stdin.close()
>>> rc = p.wait()
Aquí le estamos diciendo a BytesGenerator
que use los caracteres de separación de línea correctos de RFC cuando crea la cadena binaria para alimentar a stding
de sendmail
(sendmails's
stdin
), donde el policy por defecto usaría separadores de línea \n
.
Algunos métodos del paquete de correos electrónicos aceptan un argumento de palabra clave policy, permitiendo que el policy pueda ser anulado para ese método. Por ejemplo, el siguiente código usa el método as_bytes()
del objeto msg del ejemplo anterior y escribe el mensaje en un archivo usando los separadores de línea nativos para la plataforma en el que esté corriendo:
>>> import os
>>> with open('converted.txt', 'wb') as f:
... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))
17
Los objetos policy puede ser combinados usando el operador de adición, produciendo un objeto policy cuya configuración es una combinación de los valores que de los objetos sumados:
>>> compat_SMTP = policy.compat32.clone(linesep='\r\n')
>>> compat_strict = policy.compat32.clone(raise_on_defect=True)
>>> compat_strict_SMTP = compat_SMTP + compat_strict
Esta operación no es conmutativa; es decir, el orden en el que los objetos son añadidos importa. Para ilustrar:
>>> policy100 = policy.compat32.clone(max_line_length=100)
>>> policy80 = policy.compat32.clone(max_line_length=80)
>>> apolicy = policy100 + policy80
>>> apolicy.max_line_length
80
>>> apolicy = policy80 + policy100
>>> apolicy.max_line_length
100
- class email.policy.Policy(**kw)¶
Este es el abstract base class para todas las clases policy. Proporciona las implementaciones por defecto para un par de métodos triviales, también como la implementación de las propiedades de inmutabilidad, el método
clone()
, y las semánticas del constructor.Se pueden pasar varios argumentos de palabra clave al constructor de una clase policy. Los argumentos que pueden ser especificados son cualquier propiedad que no sea método en esta clase, además de cualquier otra propiedad adicional que no sea método en la clase concreta. Un valor especificado en el constructor anulará el valor por defecto para los atributos correspondientes.
Esta clase define las siguientes propiedades, y por consiguiente los valores a continuación pueden ser pasados al constructor de cualquier clase policy:
- max_line_length¶
El tamaño máximo de cualquier línea en la salida serializada, sin contar el fin de la línea de carácter(res). Por defecto es 78, por el RFC 5322. Un valor de
0
oNone
indica que ningún envolvimiento de líneas puede ser hecha en lo más mínimo.
- linesep¶
La cadena de caracteres a ser usada para terminar las líneas en una salida serializada. El valor por defecto es
\n
porque esa es la disciplina del fin de línea interna usada por Python, aunque\r\n
es requerida por los RFCs.
- cte_type¶
Controla el tipo de Codificaciones de Transferencia de Contenido que pueden ser o son necesarios para ser usados. Los valores posibles son:
7bit
todos los datos deben ser «compatibles con 7 bit (7 bit clean)» (ASCII-only). Esto significa que donde sea necesario, los datos serán codificados usando o codificación imprimible entre comillas o base64.
8bit
los datos no son limitados a ser compatibles con 7 bits (7 bit clean). Se requiere que los datos en las cabeceras todavía sean sólo ASCII y por lo tanto estarán codificadas (véase
fold_binary()
yutf8
abajo por las excepciones), pero las partes del cuerpo pueden usar8bit
CTE.Un valor
cte_type
de`8bit
sólo trabaja conBytesGenerator
, noGenerator
, porque las cadenas no pueden contener datos binarios. Si unGenerator
está operando bajo un policy que especificacte_type=8bit
, actuará como sicte_type
fuese7bit
.
- raise_on_defect¶
Si es
True
, cualquier defecto encontrado será lanzado como error. Si esFalse
(el valor por defecto), los defectos serán pasados al métodoregister_defect()
.
- mangle_from_¶
Si es
True
, las líneas empezando con «From « en el cuerpo son saltados al poner un>
en frente de ellos. Este parámetro es usado cuando el mensaje está siendo serializado por un generador. El valor por defecto es:False
.Added in version 3.5.
- message_factory¶
Una función de fábrica para construir un nuevo objeto mensaje vacío. Usado por el analizador cuando construye mensajes. Por defecto es
None
, en cuyo casoMessage
es usado.Added in version 3.6.
- verify_generated_headers¶
If
True
(the default), the generator will raiseHeaderWriteError
instead of writing a header that is improperly folded or delimited, such that it would be parsed as multiple headers or joined with adjacent data. Such headers can be generated by custom header classes or bugs in theemail
module.As it’s a security feature, this defaults to
True
even in theCompat32
policy. For backwards compatible, but unsafe, behavior, it must be set toFalse
explicitly.Added in version 3.12.5.
El siguiente método de
Policy
está destinado a ser llamado por código usando la librería de correos electrónicos para crear instancias de policy con configuraciones personalizadas:- clone(**kw)¶
Retorna una nueva instancia de
Policy
cuyos atributos tienen los mismos valores que la instancia actual, excepto donde se le dan, a esos atributos, nuevos valores por los argumentos de palabra clave.
Los métodos de
Policy
restantes son llamados por el código de paquete de correos electrónicos, y no están destinados a ser llamados por una aplicación usando el paquete de correos electrónicos. Un policy personalizado debe implementar todos estos métodos.- handle_defect(obj, defect)¶
Trata un defect encontrado en obj. Cuando el paquete de correos electrónicos llama a este método, defect siempre será una subclase de
Defect
.La implementación por defecto verifica la bandera
raise_on_defect
. Si esTrue
, defect es lanzado como una excepción. Si esFalse
(el valor por defecto), obj y defect son pasados aregister_defect()
.
- register_defect(obj, defect)¶
Registra un defect en obj. En el paquete de correos electrónicos, defect será siempre una subclase de
Defect
.La implementación por defecto llama al método
append
del atributodefects
de obj. Cuando un paquete de correos electrónicos llama ahandle_defect
, obj normalmente tendrá un atributodefects
que tiene un métodoappend
. Los tipos de objetos personalizados usados con el paquete de correos electrónicos (por ejemplo, objetosMessage
personalizados) también deben proporcionar tal atributo, de otro modo, los defectos en los mensajes analizados levantarán errores no esperados.
- header_max_count(name)¶
Retorna el máximo número permitido de cabeceras llamadas name.
Llamado cuando una cabecera es añadida a un objeto
EmailMessage
oMessage
. Si el valor retornado no es0
oNone
, y ya hay un número de cabeceras con el nombre name mayor o igual que el valor retornado, unValueError
es lanzado.Porque el comportamiento por defecto de
Message.__setitem__
es agregar el valor a la lista de cabeceras, es fácil crear cabeceras duplicadas sin darse cuenta. Este método permite que ciertas cabeceras sean limitadas en el número de instancias de esa cabecera que puede ser agregada aMessage
programáticamente. (El límite no es observado por el analizador, que fielmente producirá tantas cabeceras como existen en el mensaje siendo analizado.)La implementación por defecto retorna
None
para todos los nombres de cabeceras.
- header_source_parse(sourcelines)¶
El paquete de correos electrónicos llama a este método con una lista de cadenas de caracteres, cada terminación de cadena con los caracteres de separación de línea encontrada en la fuente siendo analizada. La primera línea incluye el campo del nombre de cabecera y el separador. Todos los espacios en blanco en la fuente son preservados. El método debe retornar la tupla
(name,value)
que va a ser guardada en elMessage
para representar la cabecera analizada.Si una implementación desea mantener compatibilidad con los policy del paquete de correos electrónicos existentes, name debe ser el nombre con las letras preservadas (todos los caracteres hasta el separador “
:
”), mientras que value debe ser el valor desdoblado (todos los caracteres de separación de líneas eliminados, pero los espacios en blanco intactos), privado de espacios en blanco al comienzo.sourcelines puede contener datos binarios surrogateescaped.
No hay implementación por defecto
- header_store_parse(name, value)¶
El paquete de correos electrónicos llama a este método con el nombre y valor proporcionados por el programa de aplicación cuando la aplicación está modificando un
Message
programáticamente (en lugar de unMessage
creado por un analizador). El método debe retornar la tupla(name,value)
que va a ser almacenada en elMessage
para representar la cabecera.Si una implementación desea retener compatibilidad con los policy del paquete de correos electrónicos existentes, el name y value deben ser cadenas de caracteres o subclases de cadenas que no cambien el contenido de los pasados en los argumentos.
No hay implementación por defecto
- header_fetch_parse(name, value)¶
El paquete de correos electrónicos llama a este método con el name y valor actualmente guardados en
Message
(el mensaje) cuando la cabecera es solicitada por el programa de aplicación, y lo que sea que el método retorne es lo que es pasado de vuelta a la aplicación como el valor de la cabecera siendo recuperado. Note que puede haber más de una cabecera con el mismo nombre guardado enMessage
; el método es pasado al nombre específico y valor de la cabecera destinado a ser retornado a la aplicación.value puede contener datos binarios surrogateescaped. No debe haber datos binarios surrogateescaped en el valor retornado por el método.
No hay implementación por defecto
- fold(name, value)¶
El paquete de correos electrónicos llama a este método con los name y value actualmente guardados en
Message
para una cabecera dada. El método debe retornar una cadena de caracteres que represente esa cabecera «doblada» correctamente (de acuerdo a los ajustes del policy) al componer name con value e insertar caractereslinesep
en los lugares apropiados. Véase RFC 5322 para una discusión de las reglas para doblar cabeceras de correos electrónicos.value puede contener datos binarios surrogateescaped. No debe haber datos binarios surrogateescaped en la cadena de caracteres retornada por el método.
- class email.policy.EmailPolicy(**kw)¶
Este
Policy
concreto proporciona el comportamiento que sirve para cumplir con los RFCs actuales para correos electrónicos. Estos incluyen (pero no están limitados a) RFC 5322, RFC 2047, y los actuales RFCs MIME.Esta policy incorpora nuevos analizadores de cabeceras y algoritmos de doblado. En vez de cadenas de caracteres simples, las cabeceras son subclases de
str
con atributos que dependen del tipo del campo. El analizado y algoritmo de doblado implementan los RFC 2047 y RFC 5322 por completo.El valor por defecto para el atributo
message_factory
esEmailMessage
.Además de los atributos que se pueden configurar listados arriba que aplican a todas los policies, este policy añade los siguientes atributos adicionales:
Added in version 3.6: [1]
- utf8¶
Si es
False
, se sigue el RFC 5322, siendo compatible con caracteres non-ASCII en las cabeceras al codificarlas como «palabras codificadas». Si esTrue
, sigue el RFC 6532 y usa el formato de codificaciónutf-8
para las cabeceras. Los mensajes formateados de esta manera puede ser pasados a servidores SMTP que admitan la extensiónSMTPUTF8
(RFC 6531).
- refold_source¶
Si el valor para una cabecera en el objeto
Message
se originó de unparser
(en lugar de ser establecido por el programa), este atributo indica tanto si un generador debe redoblar ese valor cuando se transforma al mensaje de vuelta a la forma serializada o no. Los valores posibles son:none
todos los valores de la fuente usan el doblamiento original
long
los valores de la fuente que tengan una línea que sea más grande que
max_line_length
serán redobladosall
todos los valores son redoblados.
El valor por defecto es
long
.
- header_factory¶
Un invocable que toma dos argumentos,
name
yvalue
, dondename
es un nombre de campo de cabecera yvalue
es un valor del campo de la cabecera no doblado, y retorna una subclase de cadenas de caracteres que representan la cabecera. Un valor por defectoheader_factory
(véaseheaderregistry
) es proporcionado que admite el análisis personalizado para los varios tipos de cabecera RFC 5322 de direcciones y fechas, y los tipos del cabeceras MIME principales. La compatibilidad de analizadores personalizados adicionales será agregada en el futuro.
- content_manager¶
Un objeto con al menos dos métodos: get_content and set_content. Cuando los métodos
get_content()
oset_content()
del objetomessageEmailMessage
son llamados, llama al método correspondiente de este objeto, pasándole el mensaje objeto como su primer argumento, y cualquier argumento o palabra clave que fuese pasado como un argumento adicional. Por defectocontent_manager
se pone araw_data_manager
.Added in version 3.4.
La clase proporciona las siguientes implementaciones concretas de los métodos abstractos de
Policy
:- header_max_count(name)¶
Retorna el valor del atributo
max_count
de la clase especializada usada para representar la cabecera con el nombre dado.
- header_source_parse(sourcelines)¶
El nombre es analizado como todo hasta el “
:
” y retornado inalterado. El valor es determinado al remover los espacios en blanco al principio del resto de la primera línea, juntando todas las subsecuentes líneas, y removiendo cualquier carácter CR o LF.
- header_store_parse(name, value)¶
El nombre es retornado inalterado. Si el valor de la entrada tiene un atributo
name
y coincide con name ignorando mayúsculas y minúsculas, el valor es retornado inalterado. Si no, el name y value son pasados aheader_factory
, y el objeto cabecera resultante es retornado como el valor. En este caso unValueError
es lanzado si el valor de la entrada contiene caracteres CR o LF.
- header_fetch_parse(name, value)¶
Si el valor tiene un atributo
name
, es retornado inalterado. De otra manera el name, y el value con cualquier carácter CR o LF eliminado, son pasados a laheader_factory
, y el objeto cabecera resultante es retornado. Cualquier byte surrogateescaped es convertido al glifo de carácter desconocido de unicode.
- fold(name, value)¶
El doblamiento de la cabecera es controlado por la configuración de policy
refold_source
. Se considera que un valor es source value (valor fuente) si y sólo si no tiene un atributoname
(tener un atributoname
significa que es un objeto cabecera de algún tipo). Si un valor fuente necesita ser redoblado de acuerdo a la política, es convertido en un objeto cabecera al pasarle el name y value con cualquier carácter CR y LF eliminado alheader_factory
. El doblamiento de un objeto cabecera es hecho al llamar a su métodofold
con el policy actual.Los valores fuente son separadas en líneas usando el método
splitlines()
. Si el valor no va a ser redoblado, las líneas son unidas de nuevo usando ellinesep
del policy y retornadas. La excepción son las líneas que contienen datos binarios non-ascii. En ese caso el valor es redoblado a pesar de la configuración derefold_source
, que causa que los datos binarios sean codificados CTE usando el juego de caracteres (charset)unknown-8bit
.
- fold_binary(name, value)¶
Igual que
fold()
sicte_type
fuese7bit
, excepto que el valor retornado son bytes.Si
cte_type
es8bit
, los datos binarios non-ASCII son convertidos de vuelta a bytes. Las cabeceras con datos binarios son redoblados, sin considerar la configuración derefold_header
, ya que no hay forma de saber si los datos binarios consisten en caracteres de un sólo byte o caracteres con múltiples bytes.
Las siguientes instancias de EmailPolicy
proporcionan valores por defecto apropiados para dominios de aplicaciones específicas. Note que en el futuro el comportamiento de estas instancias (en particular la instancia HTTP
) puede ser ajustado para cumplir incluso más de cerca a los RFC relevantes a sus dominios.
- email.policy.default¶
Una instancia de
EmailPolicy
con todos los valores por defecto sin cambiar. Este policy usa la terminación de línea\n
estándar de Python en vez de correcto por el RFC\r\n
.
- email.policy.SMTP¶
Apropiado para la serialización de mensajes en cumplimiento con los RFC de correos electrónicos. Como
default
, pero conlinesep
puesto en\r\n
, que es conforme con el RFC.
- email.policy.SMTPUTF8¶
Igual que
SMTP
excepto queutf8
esTrue
. Útil para serializar mensajes a un almacén de mensajes sin usar palabras codificadas en las cabeceras. Sólo debe ser utilizada para transmisiones por SMTP si las direcciones del remitente o recipiente tienen caracteres non-ASCII (el métodosmtplib.SMTP.send_message()
gestiona esto automáticamente).
- email.policy.HTTP¶
Apropiado para serializar cabeceras con uso en tráfico de HTTP. Como
SMTP
excepto quemax_line_length
es puesto enNone
(ilimitado).
- email.policy.strict¶
Instancias de conveniencia. Igual que
default
excepto queraise_of_defect
es puesto enTrue
. Esto permite que cualquier policy sea hecho estricto al escribir:somepolicy + policy.strict
Con todos estos EmailPolicies
, el API efectivo del paquete de correos electrónicos es cambiado del API de Python 3.2 en las siguientes maneras:
Estableciendo una cabecera en una
Message
resulta en que la cabecera sea analizada y un objeto cabecera sea creado.Buscar una valor de cabecera de un
Message
resulta en que la cabecera sea analizada y un objeto cabecera sea creado y retornado.Cualquier objeto cabecera, o cualquier cabecera que sea redoblada debido a las configuraciones del policy, es doblado usando un algoritmo que implementa el algoritmo de doblado del RFC por completo, incluyendo saber dónde las palabras codificadas son requeridas y permitidas.
Desde la vista de la aplicación, significa que cualquier cabecera obtenida a través de EmailMessage
es un objeto cabecera con atributos extra, cuyo valor de cadena es el valor Unicode de la cabecera completamente decodificada. Asimismo, se le puede asignar un nuevo valor a una cabecera, o a una nueva cabecera creada, usando una cadena de caracteres Unicode, y el policy se ocupará de convertir la cadena Unicode en la forma decodificada correcta según el RFC.
Los objetos cabecera y sus atributos son descritos en headerrregistry
.
- class email.policy.Compat32(**kw)¶
Este
Policy
concreto es el policy compatible hacia atrás. Replica el comportamiento del paquete de correos electrónicos en Python 3.2. El módulopolicy
también define una instancia de esta clase,compat32
, que es usado como el policy por defecto. Por consiguiente, el comportamiento por defecto del paquete de correos electrónicos es mantener compatibilidad con Python 3.2.Los siguientes atributos tienen valores que son diferentes del
Policy
por defecto:- mangle_from_¶
El valor por defecto es
True
.
La clase proporciona las siguientes implementaciones concretas de los métodos abstractos de
Policy
:- header_source_parse(sourcelines)¶
El nombre es analizado como todo hasta el “
:
” y retornado inalterado. El valor es determinado al remover los espacios en blanco al principio del resto de la primera línea, juntando todas las subsecuentes líneas, y removiendo cualquier carácter CR o LF.
- header_store_parse(name, value)¶
El nombre y valor son retornados inalterados.
- header_fetch_parse(name, value)¶
Si el valor contiene datos binarios, es convertido a un objeto
Header
usando el juego de caracteres (charset)unknown-8bit
. De otro modo, es retornado sin modificar.
- fold(name, value)¶
Las cabeceras son dobladas usando el algoritmo de doblado de
Header
, lo que preserva los saltos de líneas existentes en el valor, y envuelve cada línea resultante hasta elmax_line_length
. Los datos binarios Non-ASCII son codificados por CTE usando el juego de caracteres (charset)unknown-8bit
.
- fold_binary(name, value)¶
Las cabeceras son dobladas usando el algoritmo de doblado
Header
, lo que preserva los saltos de línea existentes en el valor, y envuelve cada línea resultante hastamax_line_length
. Sicte_type
es7bit
, los datos binarios non-ascii son codificados por CTE usando el juego de caracteresunknown-8bit
. De otro modo, la cabecera fuente original es usada, con sus saltos de línea existentes y cualquier (inválido según el RFC) dato binario que puede contener.
- email.policy.compat32¶
Una instancia de
Compat32
, proporcionando compatibilidad hacia atrás con el comportamiento del paquete de correos electrónicos en Python 3.2.
Notas al pie de página