Objetos SMTP¶
Una instancia SMTP
tiene los siguientes métodos:
SMTP.
set_debuglevel
(level)¶
Establezca el nivel de salida de depuración. Un valor de 1 o True
para el nivel resulta en mensajes de depuración para la conexión y para todos los mensajes enviados y recibidos del servidor. Un valor de 2 para el nivel da como resultado que estos mensajes tengan una marca de tiempo.
Cambiado en la versión 3.5: Se ha añadido el nivel de depuración 2.
SMTP.
docmd
(cmd, args=»)
Envía un comando cmd al servidor. El argumento opcional args está simplementeconcatenado al comando, separado por un espacio.
Esto devuelve una 2tupla compuesta por un código de respuesta numérico y la línea de respuesta real (las respuestas multilínea se unen en una línea larga.)
En la operación normal no debería ser necesario llamar a este método explícitamente.Se utiliza para implementar otros métodos y puede ser útil para probar extensiones privadas.
Si se pierde la conexión con el servidor mientras se espera la respuesta,SMTPServerDisconnected
se levantará.
SMTP.
connect
(host=’localhost’, port=0)¶
Conecta con un host en un puerto determinado. Por defecto se conecta al localhost en el puerto SMTP estándar (25). Si el nombre del host termina con dos puntos (':'
)seguido de un número, ese sufijo será eliminado y el número será interpretado como el número de puerto a utilizar. Este método es invocado automáticamente por el constructor si se especifica un host durante la instanciación. Devuelve una2-tupla del código de respuesta y el mensaje enviado por el servidor en su respuesta de conexión.
Lanza un evento de auditoría smtplib.connect
con argumentos self
host
port
.
SMTP.
helo
(name=»)
Identifícate ante el servidor SMTP utilizando HELO
. El argumento hostnamedebe ser por defecto el nombre de dominio completo del host local.El mensaje devuelto por el servidor se almacena como el atributo helo_resp
del objeto.
En el funcionamiento normal no debería ser necesario llamar a este método explícitamente.Será llamado implícitamente por el sendmail()
cuando sea necesario.
SMTP.
ehlo
(name=»)
Identifíquese en un servidor ESMTP utilizando EHLO
. El argumento hostname es por defecto el nombre de dominio completo del host local. Examina la respuesta para la opción ESMTP y la almacena para su uso por has_extn()
.También establece varios atributos informativos: el mensaje devuelto por el servidor se almacena como el atributo ehlo_resp
does_esmtp
se establece como verdadero o falso dependiendo de si el servidor soporta ESMTP, yesmtp_features
será un diccionario que contiene los nombres de las extensiones de servicioSMTP que este servidor soporta, y sus parámetros (si los hay).
A menos que desee utilizar has_extn()
antes de enviar el correo, no debería ser necesario llamar a este método explícitamente. Será llamado implícitamente porsendmail()
cuando sea necesario.
SMTP.
ehlo_or_helo_if_needed
()
Este método llama a ehlo()
y/o helo()
si no ha habido ningún comando EHLO
o HELO
anterior en esta sesión. Intenta ESMTP EHLO
primero.
SMTPHeloError
El servidor no ha respondido correctamente al HELO
saludo.
SMTP.
has_extn
(nombre)¶
Devuelve True
si nombre está en el conjunto de extensiones de servicio SMTP devueltas por el servidor, False
en caso contrario. Se ignora el caso.
SMTP.
verify
(dirección)
Comprueba la validez de una dirección en este servidor usando SMTP VRFY
. Devuelve untuple consistente en el código 250 y una dirección RFC 822 completa (incluyendo humanname) si la dirección del usuario es válida. En caso contrario, devuelve un código de error SMTP 400 o superior y una cadena de error.
Nota
Muchos sitios desactivan el SMTP VRFY
para evitar a los spammers.
SMTP.
login
(user, password, *, initial_response_ok=True)¶
Entrar en un servidor SMTP que requiera autenticación. Los argumentos son elnombre de usuario y la contraseña para autenticarse. Si no ha habido ningún comando anteriorEHLO
o HELO
en esta sesión, este método intenta primero ESMTP EHLO
. Este método devolverá normalmente si la autenticación fue exitosa, opuede lanzar las siguientes excepciones:
SMTPHeloError
El servidor no respondió correctamente al HELO
saludo.
SMTPAuthenticationError
El servidor no aceptó la combinación de nombre de usuario y contraseña.
SMTPNotSupportedError
El comando AUTH
no es compatible con el servidor.
SMTPException
No se ha encontrado ningún método de autenticación adecuado.
Cada uno de los métodos de autenticación soportados por smtplib
se intenta a su vez si se anuncian como soportados por el servidor. Ver auth()
para una lista de métodos de autenticación soportados. initial_response_ok se pasa a auth()
.
El argumento de palabra clave opcional initial_response_ok especifica si, para los métodos de autenticación que lo soportan, se puede enviar una «respuesta inicial» como se especifica en el RFC 4954 junto con el comando AUTH
, en lugar de requerir un reto/respuesta.
Cambiado en la versión 3.5: SMTPNotSupportedError
puede ser levantado, y se agregó el parámetroinitial_response_ok.
SMTP.
auth
(mechanism, authobject, *, initial_response_ok=True)¶
Emiten un SMTP
AUTH
comando para el mecanismo de autenticación especificado, y manejan la respuesta de desafío mediante authobject.
mechanism especifica qué mecanismo de autenticación se va a utilizar como argumento del comando AUTH
; los valores válidos son los enumerados en el elemento auth
de esmtp_features
.
authobject debe ser un objeto invocable que tome un único argumento opcional:
data = authobject(challenge=None)
Si el argumento opcional initial_response_ok es verdadero,authobject()
se llamará primero sin argumento. Puede devolver la «respuesta inicial» ASCII de la RFC 4954 str
que será codificada y enviada con el comando AUTH
como se indica a continuación. Si el authobject()
no admite una respuesta inicial (por ejemplo, porque requiere un reto), debe devolverNone
cuando se llame con challenge=None
. Si initial_response_ok esfalse, entonces authobject()
no se llamará primero con None
.
Si la comprobación de la respuesta inicial devuelve None
, o si initial_response_ok esfalse, se llamará a authobject()
para procesar la respuesta de desafío del servidor; el argumento de desafío que se le pase será un bytes
. Debe devolver datos ASCII str
que serán codificados en base64 y enviados al servidor.
La clase SMTP
proporciona authobjects
para los mecanismos CRAM-MD5
PLAIN
, y LOGIN
; se llaman SMTP.auth_cram_md5
SMTP.auth_plain
, y SMTP.auth_login
respectivamente. Todos ellos requieren que las propiedades user
y password
de la instancia SMTP
se establezcan con los valores adecuados.
El código de usuario normalmente no necesita llamar a auth
directamente, sino que puede llamar al método login()
, que probará cada uno de los mecanismos anteriores, en el orden indicado. auth
se expone para facilitar la implementación de métodos de autenticación no soportados (o aún no soportados) directamente por smtplib
.
Nuevo en la versión 3.0.5.
SMTP.
starttls
(keyfile=None, certfile=None, context=None)¶
Pone la conexión SMTP en modo TLS (Transport Layer Security). Todos los comandos SMTP que siguen serán encriptados. A continuación, debe llamar ehlo()
de nuevo.
Si se proporciona keyfile y certfile, se utilizan para crear unssl.SSLContext
.
El parámetro de contexto opcional es un objeto ssl.SSLContext
; Esta es una alternativa al uso de un keyfile y un certfile y si se especifica tanto el keyfile como el certfile deben ser None
.
Si no ha habido ningún comando EHLO
o HELO
anterior en esta sesión, este método intenta primero el EHLO
ESMTP.
Depreciado desde la versión 3.0.6: keyfile y certfile están obsoletos en favor del contexto.Por favor, utilice ssl.SSLContext.load_cert_chain()
en su lugar, o deje quessl.create_default_context()
seleccione los CAcertificados de confianza del sistema por usted.
SMTPHeloError
El servidor no ha respondido correctamente al HELO
saludo.
SMTPNotSupportedError
El servidor no soporta la extensión STARTTLS.
RuntimeError
El soporte de SSL/TLS no está disponible para tu intérprete de Python.
Cambiado en la versión 3.3: se ha añadido el contexto.
Cambiado en la versión 3.4: El método ahora soporta la comprobación del nombre de host conSSLContext.check_hostname
y el indicador de nombre de servidor (verHAS_SNI
).
Cambiado en la versión 3.45: El error planteado por falta de soporte de STARTTLS es ahora laSMTPNotSupportedError
subclase en lugar de la baseSMTPException
.
SMTP.
sendmail
(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())¶
Envía correo. Los argumentos requeridos son una cadena de dirección de origen RFC 822, una lista de cadenas de dirección de destino RFC 822 (una cadena vacía será tratada como una lista con 1 dirección), y una cadena de mensaje. La persona que llama puede pasar una lista de opciones ESMTP (como 8bitmime
) para ser utilizadas en los comandos MAIL FROM
como mail_options.Las opciones ESMTP (como los comandos DSN
) que deben utilizarse con todos los comandos RCPT
pueden pasarse como rcpt_options. (Si necesitas usar diferentes ESMTPoptions a diferentes destinatarios tienes que usar los métodos de bajo nivel comomail()
rcpt()
y data()
para enviar el mensaje.)
Nota
Los parámetros from_addr y to_addrs se utilizan para construir el sobre del mensaje utilizado por los agentes de transporte. sendmail
no modifica las cabeceras de los mensajes de ninguna manera.
msg puede ser una cadena que contenga caracteres en el rango ASCII, o una cadena de bytes. Una cadena se codifica en bytes utilizando el códec ascii, y los caracteres solitarios \r
y \n
se convierten en caracteres \r\n
. Una cadena de bytes no se modifica.
Si no ha habido ningún comando EHLO
o HELO
anterior en esta sesión, este método intenta primero ESMTP EHLO
. Si el servidor hace ESMTP, se le pasará el tamaño del mensaje y cada una de las opciones especificadas (si la opción está en el conjunto de características que el servidor anuncia). Si EHLO
falla, HELO
se intentará y se suprimirán las opciones de ESMTP.
Este método devolverá normalmente si el correo es aceptado para al menos un destinatario. En caso contrario, lanzará una excepción. Es decir, si este método no lanza una excepción, entonces alguien debería recibir su correo. Si este método no lanza una excepción, devuelve un diccionario, con una entrada para cada destinatario que fue rechazado. Cada entrada contiene una tupla del código de error SMTP y el mensaje de error adjunto enviado por el servidor.
Si SMTPUTF8
se incluye en mail_options, y el servidor lo soporta, from_addr y to_addrs pueden contener caracteres no ASCII.
Este método puede lanzar las siguientes excepciones:
SMTPRecipientsRefused
Todos los destinatarios fueron rechazados. Nadie recibió el correo. El recipients
atributo del objeto de excepción es un diccionario con información sobre los destinatariosfundidos (como el que se devuelve cuando al menos un destinatario fueaceptado).
SMTPHeloError
El servidor no ha respondido correctamente al HELO
saludo.
SMTPSenderRefused
El servidor no ha aceptado el from_addr.
SMTPDataError
El servidor ha respondido con un código de error inesperado (distinto al rechazo de arecipiente).
SMTPNotSupportedError
SMTPUTF8
se ha dado en las mail_options pero no es soportado por el servidor.
A menos que se indique lo contrario, la conexión estará abierta incluso después de que se lance una excepción.
Cambiado en la versión 3.2: msg puede ser una cadena de bytes.
Cambiado en la versión 3.5: SMTPUTF8
soporte añadido, y SMTPNotSupportedError
puede beraised si SMTPUTF8
se especifica pero el servidor no lo soporta.
SMTP.
send_message
(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())
Este es un método conveniente para llamar a sendmail()
con el mensaje representado por un objeto email.message.Message
. Los argumentos tienen el mismo significado que para sendmail()
, excepto que msg es un objeto Message
.
Si from_addr es None
o to_addrs es None
send_message
rellena esos argumentos con direcciones extraídas de las cabeceras de msg como se especifica en el RFC 5322: from_addr se establece en el campo Sender si está presente, y en caso contrario en el campo From.to_addrs combina los valores (si los hay) de los campos To, Cc y Bcc del msg. Si el mensaje contiene exactamente un conjunto de cabeceras Resent-*, se ignoran las cabeceras normales y se utilizan las cabeceras Resent-*. Si el mensaje contiene más de un conjunto de cabeceras Resent-*, se genera un ValueError
, ya que no hay forma de detectar inequívocamente el conjunto más reciente de cabeceras Resent-*.
send_message
serializa el msg utilizandoBytesGenerator
con \r\n
como linesep, yllama a sendmail()
para transmitir el mensaje resultante. Independientemente de los valores de from_addr y to_addrs, send_message
no transmite ninguna cabeceraBcc o Resent-Bcc que pueda aparecer en el msg. Si alguna de las direcciones de from_addr y to_addrs contiene caracteres no ASCII y el servidor no anuncia el soporte de SMTPUTF8
, se produce un error SMTPNotSupported
. En caso contrario, el Message
se serializa con un clon de su policy
con el atributo utf8
establecido en True
, ySMTPUTF8
y BODY=8BITMIME
se añaden a mail_options.
Nuevo en la versión 3.2.
Nuevo en la versión 3.5: Soporte para direcciones internacionalizadas (SMTPUTF8
).
SMTP.
quit