Ya no tienes que buscar más por todo internet ya que has llegado al espacio justo, contamos con la solución que buscas y sin liarte.
Código fuente:Lib / smtplib.py
los smtplib
El módulo define un objeto de sesión de cliente SMTP que se puede utilizar para enviar correo a cualquier máquina de Internet con un demonio de escucha SMTP o ESMTP. Para obtener detalles sobre el funcionamiento de SMTP y ESMTP, consulte RFC 821 (Protocolo simple de transferencia de correo) y RFC 1869 (Extensiones de servicio SMTP).
class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)
-
Un
SMTP
instancia encapsula una conexión SMTP. Tiene métodos que admiten un repertorio completo de operaciones SMTP y ESMTP. Si se proporcionan los parámetros de puerto y host opcionales, el SMTPconnect()
se llama al método con esos parámetros durante la inicialización. Si se especifica, nombre_host_local se utiliza como FQDN del host local en el comando HELO / EHLO. De lo contrario, el nombre de host local se encuentra usandosocket.getfqdn()
. Si elconnect()
La llamada devuelve cualquier cosa que no sea un código de éxito, unSMTPConnectError
es elevado. El opcional se acabó el tiempo El parámetro especifica un tiempo de espera en segundos para bloquear operaciones como el intento de conexión (si no se especifica, se utilizará la configuración de tiempo de espera predeterminada global). Si el tiempo de espera expira,socket.timeout
es elevado. El parámetro opcional source_address permite la vinculación a alguna dirección de origen específica en una máquina con múltiples interfaces de red y / oa algún puerto TCP de origen específico. Se necesita una tupla de 2 (host, puerto), para que el socket se vincule como su dirección de origen antes de conectarse. Si se omite (o si el host o el puerto están''
y / o 0 respectivamente) se utilizará el comportamiento predeterminado del sistema operativo.Para un uso normal, solo debe requerir la inicialización / conexión,
sendmail()
, ySMTP.quit()
métodos. A continuación se incluye un ejemplo.los
SMTP
la clase apoya elwith
declaración. Cuando se usa así, el SMTPQUIT
El comando se emite automáticamente cuando elwith
salidas de declaración. P.ej:>>>from smtplib import SMTP >>>with SMTP("domain.org")as smtp:... smtp.noop()...(250,b'Ok')>>>
Todos los comandos levantarán un evento de auditoría
smtplib.SMTP.send
con argumentosself
ydata
, dóndedata
son los bytes que se van a enviar al host remoto.Modificado en la versión 3.3: Soporte para el
with
Se agregó una declaración.Modificado en la versión 3.3: Se agregó el argumento source_address.
Nuevo en la versión 3.5: La extensión SMTPUTF8 (RFC 6531) ahora es compatible.
Modificado en la versión 3.9: Si el se acabó el tiempo el parámetro se establece en cero, generará un
ValueError
para evitar la creación de un enchufe sin bloqueo
class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None, [timeout, ]context=None, source_address=None)
-
Un
SMTP_SSL
instancia se comporta exactamente igual que las instancias deSMTP
.SMTP_SSL
debe usarse para situaciones en las que se requiere SSL desde el comienzo de la conexión y el usostarttls()
no es apropiado. Si anfitrión no se especifica, se utiliza el host local. Si Puerto es cero, se utiliza el puerto estándar SMTP sobre SSL (465). Los argumentos opcionales nombre_host_local, se acabó el tiempo y Dirección de la fuente tienen el mismo significado que en elSMTP
clase. contexto, también opcional, puede contener unSSLContext
y permite configurar varios aspectos de la conexión segura. Por favor lee Consideraciones de Seguridad para conocer las mejores prácticas.archivo de clave y certfile son una alternativa heredada a contexto, y puede apuntar a una clave privada con formato PEM y un archivo de cadena de certificados para la conexión SSL.
Modificado en la versión 3.3: contexto fue añadido.
Modificado en la versión 3.3: Se agregó el argumento source_address.
Modificado en la versión 3.4: La clase ahora admite la verificación del nombre de host con
ssl.SSLContext.check_hostname
y Indicación del nombre del servidor (verssl.HAS_SNI
).En desuso desde la versión 3.6: archivo de clave y certfile están en desuso a favor de contexto. Por favor use
ssl.SSLContext.load_cert_chain()
en su lugar, o dejarssl.create_default_context()
seleccione los certificados CA de confianza del sistema para usted.Modificado en la versión 3.9: Si el se acabó el tiempo el parámetro se establece en cero, generará un
ValueError
para evitar la creación de un enchufe sin bloqueo
class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None[, timeout])
-
El protocolo LMTP, que es muy similar a ESMTP, se basa en gran medida en el cliente SMTP estándar. Es común usar sockets Unix para LMTP, por lo que nuestro
connect()
El método debe ser compatible con eso, así como con un servidor host: puerto normal. Los argumentos opcionales local_hostname y source_address tienen el mismo significado que en elSMTP
clase. Para especificar un socket Unix, debe usar una ruta absoluta para anfitrión, comenzando con una ‘/’.Se admite la autenticación mediante el uso de SMTP mecanismo. Cuando se usa un socket Unix, LMTP generalmente no admite ni requiere autenticación, pero su millaje puede variar.
Modificado en la versión 3.9: El opcional se acabó el tiempo se agregó el parámetro.
También se define una buena selección de excepciones:
exception smtplib.SMTPException
-
Subclase de
OSError
esa es la clase de excepción base para todas las demás excepciones proporcionadas por este módulo.Modificado en la versión 3.4: SMTPException se convirtió en subclase de
OSError
exception smtplib.SMTPServerDisconnected
-
Esta excepción se genera cuando el servidor se desconecta inesperadamente o cuando se intenta utilizar el
SMTP
instancia antes de conectarlo a un servidor.
exception smtplib.SMTPResponseException
-
Clase base para todas las excepciones que incluyen un código de error SMTP. Estas excepciones se generan en algunos casos cuando el servidor SMTP devuelve un código de error. El código de error se almacena en el
smtp_code
atributo del error, y elsmtp_error
El atributo se establece en el mensaje de error.
exception smtplib.SMTPSenderRefused
-
Dirección del remitente rechazada. Además de los atributos establecidos por en todos
SMTPResponseException
excepciones, esto establece ‘remitente’ en la cadena que el servidor SMTP rechazó.
exception smtplib.SMTPRecipientsRefused
-
Todas las direcciones de los destinatarios se negaron. Los errores de cada destinatario son accesibles a través del atributo
recipients
, que es un diccionario exactamente del mismo tipo queSMTP.sendmail()
devoluciones.
exception smtplib.SMTPDataError
-
El servidor SMTP se negó a aceptar los datos del mensaje.
exception smtplib.SMTPConnectError
-
Se produjo un error durante el establecimiento de una conexión con el servidor.
exception smtplib.SMTPHeloError
-
El servidor rechazó nuestro
HELO
mensaje.
exception smtplib.SMTPNotSupportedError
-
El servidor no admite el comando o la opción que se intentó.
Nuevo en la versión 3.5.
exception smtplib.SMTPAuthenticationError
-
La autenticación SMTP salió mal. Lo más probable es que el servidor no aceptó la combinación de nombre de usuario y contraseña proporcionada.
Ver también
- RFC 821 – Protocolo simple de transferencia de correo
-
Definición de protocolo para SMTP. Este documento cubre el modelo, el procedimiento operativo y los detalles del protocolo para SMTP.
- RFC 1869 – Extensiones de servicio SMTP
-
Definición de las extensiones ESMTP para SMTP. Esto describe un marco para extender SMTP con nuevos comandos, que admite el descubrimiento dinámico de los comandos proporcionados por el servidor y define algunos comandos adicionales.
Objetos SMTP
Un SMTP
instancia tiene los siguientes métodos:
SMTP.set_debuglevel(level)
-
Establezca el nivel de salida de depuración. Un valor de 1 o
True
por nivel da como resultado mensajes de depuración para la conexión y para todos los mensajes enviados y recibidos desde el servidor. Un valor de 2 para nivel hace que estos mensajes tengan una marca de tiempo.Modificado en la versión 3.5: Se agregó el nivel de depuración 2.
SMTP.docmd(cmd, args='')
-
Enviar un comando cmd al servidor. El argumento opcional argumentos simplemente está concatenado al comando, separado por un espacio.
Esto devuelve una tupla de 2 compuestos por un código de respuesta numérico y la línea de respuesta real (las respuestas de varias líneas se unen en una línea larga).
En funcionamiento normal, no debería ser necesario llamar a este método explícitamente. Se utiliza para implementar otros métodos y puede resultar útil para probar extensiones privadas.
Si se pierde la conexión con el servidor mientras espera la respuesta,
SMTPServerDisconnected
se levantará.
SMTP.connect(host='localhost', port=0)
-
Conéctese a un host en un puerto determinado. Los valores predeterminados son conectarse al host local en el puerto SMTP estándar (25). Si el nombre de host termina con dos puntos (
':'
) seguido de un número, ese sufijo se eliminará y el número se interpretará como el número de puerto a utilizar. El constructor invoca automáticamente este método si se especifica un host durante la instanciación. Devuelve una tupla de 2 del código de respuesta y el mensaje enviado por el servidor en su respuesta de conexión.Plantea un evento de auditoría
smtplib.connect
con argumentosself
,host
,port
.
SMTP.helo(name='')
-
Identifíquese en el servidor SMTP utilizando
HELO
. El argumento del nombre de host tiene como valor predeterminado el nombre de dominio completo del host local. El mensaje devuelto por el servidor se almacena como elhelo_resp
atributo del objeto.En funcionamiento normal, no debería ser necesario llamar a este método explícitamente. Implícitamente será llamado por el
sendmail()
cuando sea necesario.
SMTP.ehlo(name='')
-
Identifíquese en un servidor ESMTP utilizando
EHLO
. El argumento del nombre de host tiene como valor predeterminado el nombre de dominio completo del host local. Examine la respuesta para la opción ESMTP y guárdelos para que los utilicehas_extn()
. También establece varios atributos informativos: el mensaje devuelto por el servidor se almacena comoehlo_resp
atributo,does_esmtp
se establece en verdadero o falso dependiendo de si el servidor admite ESMTP, yesmtp_features
será un diccionario que contiene los nombres de las extensiones del servicio SMTP que admite este servidor y sus parámetros (si los hubiera).A menos que desee utilizar
has_extn()
antes de enviar correo, no debería ser necesario llamar explícitamente a este método. Implícitamente será llamado porsendmail()
cuando sea necesario.
SMTP.ehlo_or_helo_if_needed()
-
Este método llama
ehlo()
y / ohelo()
si no ha habido previoEHLO
oHELO
comandar esta sesión. Prueba ESMTPEHLO
primero.SMTPHeloError
-
El servidor no respondió correctamente al
HELO
saludo.
SMTP.has_extn(name)
-
Regreso
True
si nombre está en el conjunto de extensiones de servicio SMTP devueltas por el servidor,False
de lo contrario. Se ignora el caso.
SMTP.verify(address)
-
Compruebe la validez de un dirección en este servidor usando SMTP
VRFY
. Devuelve una tupla que consta del código 250 y un RFC 822 dirección (incluido el nombre humano) si la dirección del usuario es válida. De lo contrario, devuelve un código de error SMTP de 400 o más y una cadena de error.Nota
Muchos sitios deshabilitan SMTP
VRFY
para frustrar a los spammers.
SMTP.login(user, password, *, initial_response_ok=True)
-
Inicie sesión en un servidor SMTP que requiera autenticación. Los argumentos son el nombre de usuario y la contraseña para autenticarse. Si no ha habido
EHLO
oHELO
comando esta sesión, este método prueba ESMTPEHLO
primero. Este método volverá normalmente si la autenticación fue exitosa, o puede generar 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
-
los
AUTH
El comando no es compatible con el servidor. SMTPException
-
No se encontró ningún método de autenticación adecuado.
Cada uno de los métodos de autenticación admitidos por
smtplib
se prueban a su vez si se anuncian como compatibles con el servidor. Verauth()
para obtener una lista de los métodos de autenticación admitidos. respuesta_inicial_ok se pasa a través deauth()
.Argumento de palabra clave opcional respuesta_inicial_ok especifica si, para los métodos de autenticación que lo admiten, una “respuesta inicial” como se especifica en RFC 4954 se puede enviar junto con el
AUTH
comando, en lugar de requerir un desafío / respuesta.Modificado en la versión 3.5:
SMTPNotSupportedError
puede ser elevado, y el respuesta_inicial_ok se agregó el parámetro.
SMTP.auth(mechanism, authobject, *, initial_response_ok=True)
-
Emitir un
SMTP
AUTH
comando para la autenticación especificada mecanismoy manejar la respuesta al desafío a través de autoría.mecanismo especifica qué mecanismo de autenticación se utilizará como argumento para la
AUTH
mando; los valores válidos son los enumerados en elauth
elemento deesmtp_features
.autoría debe ser un objeto invocable que tome un único argumento opcional:
datos = objeto de autor (desafío = Ninguno)
Si es un argumento de palabra clave opcional respuesta_inicial_ok es verdad,
authobject()
se llamará primero sin argumento. Puede devolver el RFC 4954 “Respuesta inicial” ASCIIstr
que se codificará y enviará con elAUTH
comando como se muestra a continuación. Si elauthobject()
no admite una respuesta inicial (por ejemplo, porque requiere un desafío), debe devolverNone
cuando se llama conchallenge=None
. Si respuesta_inicial_ok es falso, entoncesauthobject()
no se llamará primero conNone
.Si el cheque de respuesta inicial regresa
None
, o si respuesta_inicial_ok Es falso,authobject()
será llamado para procesar la respuesta de desafío del servidor; los desafío argumento que se pasa será unbytes
. Debería devolver ASCIIstr
datos que se codificará en base64 y se enviará al servidor.los
SMTP
la clase proporcionaauthobjects
Para elCRAM-MD5
,PLAIN
, yLOGIN
mecanismos; ellos son nombradosSMTP.auth_cram_md5
,SMTP.auth_plain
, ySMTP.auth_login
respectivamente. Todos requieren que eluser
ypassword
propiedades de laSMTP
instancia se establecen en los valores apropiados.El código de usuario normalmente no necesita llamar
auth
directamente, pero en su lugar puede llamar allogin()
método, que probará cada uno de los mecanismos anteriores a su vez, en el orden indicado.auth
está expuesto para facilitar la implementación de métodos de autenticación no (o aún no) apoyados directamente porsmtplib
.Nuevo en la versión 3.5.
SMTP.starttls(keyfile=None, certfile=None, context=None)
-
Ponga la conexión SMTP en modo TLS (Seguridad de la capa de transporte). Todos los comandos SMTP que siguen se cifrarán. Entonces deberías llamar
ehlo()
de nuevo.Si archivo de clave y certfile se proporcionan, se utilizan para crear un
ssl.SSLContext
.Opcional contexto el parámetro es un
ssl.SSLContext
objeto; Esta es una alternativa al uso de un archivo de claves y un archivo cert y, si se especifica, ambos archivo de clave y certfile debiera serNone
.Si no ha habido
EHLO
oHELO
comando esta sesión, este método prueba ESMTPEHLO
primero.En desuso desde la versión 3.6: archivo de clave y certfile están en desuso a favor de contexto. Por favor use
ssl.SSLContext.load_cert_chain()
en su lugar, o dejarssl.create_default_context()
seleccione los certificados CA de confianza del sistema para usted.SMTPHeloError
-
El servidor no respondió correctamente al
HELO
saludo. SMTPNotSupportedError
-
El servidor no admite la extensión STARTTLS.
RuntimeError
-
La compatibilidad con SSL / TLS no está disponible para su intérprete de Python.
Modificado en la versión 3.3: contexto fue añadido.
Modificado en la versión 3.4: El método ahora admite la verificación del nombre de host con
SSLContext.check_hostname
y Indicador de nombre de servidor (verHAS_SNI
).Modificado en la versión 3.5: El error generado por falta de soporte STARTTLS es ahora el
SMTPNotSupportedError
subclase en lugar de la baseSMTPException
.
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())
-
Enviar correo. Los argumentos requeridos son un RFC 822 cadena de dirección de origen, una lista de RFC 822 cadenas de dirección (una cadena simple se tratará como una lista con 1 dirección) y una cadena de mensaje. La persona que llama puede pasar una lista de opciones de ESMTP (como
8bitmime
) para ser utilizado enMAIL FROM
comandos como mail_options. Opciones de ESMTP (comoDSN
comandos) que deben usarse con todosRCPT
los comandos se pueden pasar como rcpt_options. (Si necesita usar diferentes opciones de ESMTP para diferentes destinatarios, debe usar los métodos de bajo nivel comomail()
,rcpt()
ydata()
para enviar el mensaje.)Nota
los from_addr y to_addrs Los parámetros se utilizan para construir el sobre del mensaje utilizado por los agentes de transporte.
sendmail
no modifica los encabezados 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 lone
r
yn
los caracteres se convierten arn
caracteres. Una cadena de bytes no se modifica.Si no ha habido
EHLO
oHELO
comando esta sesión, este método prueba ESMTPEHLO
primero. Si el servidor utiliza 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 funciones que anuncia el servidor). SiEHLO
fallaHELO
se probará y se suprimirán las opciones de ESMTP.Este método volverá normalmente si se acepta el correo para al menos un destinatario. De lo contrario, generará una excepción. Es decir, si este método no genera una excepción, alguien debería recibir su correo. Si este método no genera una excepción, devuelve un diccionario, con una entrada para cada destinatario rechazado. Cada entrada contiene una tupla del código de error SMTP y el mensaje de error adjunto enviado por el servidor.
Si
SMTPUTF8
está incluido en mail_optionsy el servidor lo admite, from_addr y to_addrs puede contener caracteres no ASCII.Este método puede generar las siguientes excepciones:
SMTPRecipientsRefused
-
Todos los destinatarios fueron rechazados. Nadie recibió el correo. los
recipients
El atributo del objeto de excepción es un diccionario con información sobre los destinatarios rechazados (como el que se devuelve cuando se aceptó al menos un destinatario). SMTPHeloError
-
El servidor no respondió correctamente al
HELO
saludo. SMTPSenderRefused
-
El servidor no aceptó el from_addr.
SMTPDataError
-
El servidor respondió con un código de error inesperado (que no sea el rechazo de un destinatario).
SMTPNotSupportedError
-
SMTPUTF8
fue dado en el mail_options pero no es compatible con el servidor.
A menos que se indique lo contrario, la conexión estará abierta incluso después de que se genere una excepción.
Modificado en la versión 3.2: msg puede ser una cadena de bytes.
Modificado en la versión 3.5:
SMTPUTF8
soporte agregado, ySMTPNotSupportedError
puede ser elevado siSMTPUTF8
se especifica pero el servidor no lo admite.
SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())
-
Este es un método conveniente para llamar
sendmail()
con el mensaje representado por unemail.message.Message
objeto. Los argumentos tienen el mismo significado que parasendmail()
, excepto eso msg es unMessage
objeto.Si from_addr es
None
o to_addrs esNone
,send_message
llena esos argumentos con direcciones extraídas de los encabezados de msg como se especifica en RFC 5322: from_addr está configurado en el Remitente campo si está presente, y de lo contrario al De campo. to_addrs combina los valores (si los hay) del Para, Cc, y Cco campos de msg. Si exactamente un juego de Resentirse de-* Los encabezados aparecen en el mensaje, los encabezados regulares se ignoran y el Resentirse de-* en su lugar se utilizan encabezados. Si el mensaje contiene más de un conjunto de Resentirse de-* encabezados, unValueError
se plantea, ya que no hay forma de detectar sin ambigüedades el conjunto más reciente de Resentirse de- encabezados.send_message
serializa msg utilizandoBytesGenerator
conrn
como el lineasepy llamasendmail()
para transmitir el mensaje resultante. Independientemente de los valores de from_addr y to_addrs,send_message
no transmite ninguna Cco o Resent-Cco encabezados que puede aparecer en msg. Si alguna de las direcciones en from_addr y to_addrs contienen caracteres que no son ASCII y el servidor no anunciaSMTPUTF8
apoyo, unSMTPNotSupported
se genera un error. De lo contrario, elMessage
se serializa con un clon de supolicy
con elutf8
atributo establecido enTrue
, ySMTPUTF8
yBODY=8BITMIME
se agregan a mail_options.Nuevo en la versión 3.2.
Nuevo en la versión 3.5: Soporte para direcciones internacionalizadas (
SMTPUTF8
).
SMTP.quit()
-
Termine la sesión SMTP y cierre la conexión. Devuelve el resultado del SMTP
QUIT
mando.
Métodos de bajo nivel correspondientes a los comandos estándar SMTP / ESMTP HELP
, RSET
, NOOP
, MAIL
, RCPT
, y DATA
también son compatibles. Normalmente, no es necesario llamarlos directamente, por lo que no se documentan aquí. Para más detalles, consulte el código del módulo.
Ejemplo de SMTP
Este ejemplo solicita al usuario las direcciones necesarias en el sobre del mensaje (direcciones ‘Para’ y ‘De’) y el mensaje que se entregará. Tenga en cuenta que los encabezados que se incluirán con el mensaje deben incluirse en el mensaje tal como se ingresaron; este ejemplo no realiza ningún procesamiento de la RFC 822 encabezados. En particular, las direcciones ‘Para’ y ‘De’ deben incluirse explícitamente en los encabezados de los mensajes.
import smtplib defprompt(prompt):returninput(prompt).strip() fromaddr = prompt("From: ") toaddrs = prompt("To: ").split()print("Enter message, end with ^D (Unix) or ^Z (Windows):")# Add the From: and To: headers at the start! msg =("From: %srnTo: %srnrn"%(fromaddr,", ".join(toaddrs)))whileTrue:try: line =input()except EOFError:breakifnot line:break msg = msg + line print("Message length is",len(msg)) server = smtplib.SMTP('localhost') server.set_debuglevel(1) server.sendmail(fromaddr, toaddrs, msg) server.quit()
Nota
En general, querrá utilizar el email
características del paquete para construir un mensaje de correo electrónico, que luego puede enviar a través de send_message()
; ver correo electrónico: Ejemplos.
Aquí puedes ver las comentarios y valoraciones de los usuarios
Si entiendes que te ha resultado de utilidad nuestro post, te agradeceríamos que lo compartas con el resto entusiastas de la programación de esta forma contrubuyes a difundir nuestro contenido.