smtplib – Cliente de protocolo SMTP¶

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 selfhostport.

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_respdoes_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 EHLOprimero.

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 SMTPAUTH 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-MD5PLAIN, y LOGIN; se llaman SMTP.auth_cram_md5SMTP.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 \ry \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 recipientsatributo 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 Nonesend_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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *