Hola a todos: Una tarea común para los administradores y desarrolladores de sistemas es usar scripts para enviar correos electrónicos si ocurre un error. Entonces este video es útil para realizar ese tipo de tareas.
En este video, expliqué cómo enviar un correo electrónico del remitente al identificador del receptor con la ayuda de Python.
Cómo enviar correos electrónicos usando Python
Probablemente hayas encontrado este tutorial porque quieres enviar correos electrónicos usando Python. Quizás desee recibir recordatorios por correo electrónico de su código, enviar un correo electrónico de confirmación a los usuarios cuando crean una cuenta o enviar correos electrónicos a los miembros de su organización para recordarles que paguen sus cuotas. Enviar correos electrónicos manualmente es una tarea que consume mucho tiempo y es propensa a errores, pero es fácil de automatizar con Python.
En este tutorial aprenderá a :
- Configurar un conexión segura utilizando
SMTP_SSL()
y.starttls()
- Utilice la función integrada de Python
smtplib
biblioteca para enviar correos electrónicos básicos - Envíe correos electrónicos con Contenido HTML y archivos adjuntos utilizando el
email
paquete - Enviar múltiples correos electrónicos personalizados usando un archivo CSV con datos de contacto
- Utilizar el Yagmail paquete para enviar correo electrónico a través de su cuenta de Gmail utilizando solo unas pocas líneas de código
Encontrará algunos servicios de correo electrónico transaccional al final de este tutorial, que le resultarán útiles cuando desee enviar una gran cantidad de correos electrónicos.
Tabla de contenido
- Empezando
- Opción 1: configurar una cuenta de Gmail para el desarrollo
- Opción 2: configuración de un servidor SMTP local
- Envío de un correo electrónico de texto sin formato
- Inicio de una conexión SMTP segura
- Envío de su correo electrónico de texto sin formato
- Envío de correos electrónicos elegantes
- Incluyendo contenido HTML
- Agregar archivos adjuntos mediante el paquete de correo electrónico
- Envío de varios correos electrónicos personalizados
- Crear un archivo CSV con información personal relevante
- Recorra filas para enviar varios correos electrónicos
- Contenido personalizado
- Ejemplo de código
- Yagmail
- Servicios de correo electrónico transaccional
- Ejemplo de código de Sendgrid
- Conclusión
Empezando
Python viene con el incorporado |_+_| módulo para enviar correos electrónicos utilizando el Protocolo simple de transferencia de correo (SMTP). smtplib
usa el RFC 821 protocolo para SMTP. Los ejemplos de este tutorial utilizarán el servidor SMTP de Gmail para enviar correos electrónicos, pero los mismos principios se aplican a otros servicios de correo electrónico. Aunque la mayoría de los proveedores de correo electrónico utilizan los mismos puertos de conexión que los de este tutorial, puede ejecutar una búsqueda de Google para confirmar el tuyo.
Opción 1: configurar una cuenta de Gmail para el desarrollo
Si decide utilizar una cuenta de Gmail para enviar sus correos electrónicos, le recomiendo que configure una cuenta desechable para el desarrollo de su código. Esto se debe a que tendrá que ajustar la configuración de seguridad de su cuenta de Gmail para permitir el acceso desde su código Python, y porque existe la posibilidad de que exponga accidentalmente sus datos de inicio de sesión. Además, descubrí que la bandeja de entrada de mi cuenta de prueba se llenó rápidamente de correos electrónicos de prueba, razón suficiente para configurar una nueva cuenta de Gmail para el desarrollo.
Una característica interesante de Gmail es que puede utilizar el smtplib
firmar para agregar modificadores a su dirección de correo electrónico, justo antes de +
firmar. Por ejemplo, correo enviado a @
y my+person1@gmail.com
ambos llegarán a my+person2@gmail.com
. Al probar la funcionalidad del correo electrónico, puede usar esto para emular varias direcciones que apuntan a la misma bandeja de entrada.
Para configurar una dirección de Gmail para probar su código, haga lo siguiente:
ver-subir imagen
- Crea una nueva cuenta de Google .
- Girar Permitir aplicaciones menos seguras para SOBRE . Tenga en cuenta que esto facilita que otros accedan a su cuenta.
Si no desea reducir la configuración de seguridad de su cuenta de Gmail, consulte la documentación sobre cómo obtener credenciales de acceso para su secuencia de comandos de Python, utilizando el marco de autorización OAuth2.
Opción 2: configuración de un servidor SMTP local
Puede probar la funcionalidad del correo electrónico ejecutando un servidor de depuración SMTP local, utilizando my@gmail.com
módulo que viene preinstalado con Python. En lugar de enviar correos electrónicos a la dirección especificada, los descarta e imprime su contenido en la consola. Ejecutar un servidor de depuración local significa que no es necesario lidiar con el cifrado de mensajes o usar credenciales para iniciar sesión en un servidor de correo electrónico.
Puede iniciar un servidor de depuración SMTP local escribiendo lo siguiente en el símbolo del sistema:
|_+_|En Linux, use el mismo comando precedido por smtpd
.
Cualquier correo electrónico enviado a través de este servidor se descartará y se mostrará en la ventana del terminal como un |_+_| objeto para cada línea:
|_+_|Para el resto del tutorial, asumiré que estás usando una cuenta de Gmail, pero si estás usando un servidor de depuración local, asegúrate de usar python -m smtpd -c DebuggingServer -n localhost:1025
como su servidor SMTP y use el puerto 1025 en lugar del puerto 465 o 587. Además de esto, no necesitará usar sudo
o cifrar la comunicación mediante SSL / TLS.
Envío de un correo electrónico de texto sin formato
Antes de sumergirnos en el envío de correos electrónicos con contenido HTML y archivos adjuntos, aprenderá a enviar correos electrónicos de texto sin formato con Python. Estos son correos electrónicos que puede escribir en un editor de texto simple. No hay cosas sofisticadas como formato de texto o hipervínculos. Lo aprenderás un poco más tarde.
Inicio de una conexión SMTP segura
Cuando envíe correos electrónicos a través de Python, debe asegurarse de que su conexión SMTP esté encriptada, de modo que otras personas no puedan acceder fácilmente a su mensaje y a sus credenciales de inicio de sesión. SSL (Secure Sockets Layer) y TLS (Transport Layer Security) son dos protocolos que se pueden utilizar para cifrar una conexión SMTP. No es necesario utilizar ninguno de estos cuando se utiliza un servidor de depuración local.
Hay dos formas de iniciar una conexión segura con su servidor de correo electrónico:
- Inicie una conexión SMTP que esté protegida desde el principio mediante
bytes
. - Inicie una conexión SMTP no segura que luego pueda encriptarse usando
---------- MESSAGE FOLLOWS ---------- b'X-Peer: ::1' b'' b'From: my@address.com' b'To: your@address.com' b'Subject: a local test mail' b'' b'Hello there, here is a test email' ------------ END MESSAGE ------------
.
En ambos casos, Gmail cifrará los correos electrónicos mediante TLS, ya que es el sucesor más seguro de SSL. Según Python Consideraciones de Seguridad , se recomienda encarecidamente que utilice localhost
desde el |_+_| módulo. Esto cargará los certificados de CA de confianza del sistema, habilitará la verificación del nombre de host y la validación del certificado, e intentará elegir un protocolo y una configuración de cifrado razonablemente seguros.
Si desea verificar el cifrado de un correo electrónico en su bandeja de entrada de Gmail, vaya a Más → Mostrar original para ver el tipo de cifrado que aparece debajo de Recibió encabezamiento.
|_+_| es el módulo integrado de Python para enviar correos electrónicos a cualquier máquina de Internet con un demonio de escucha SMTP o ESMTP.
Te mostraré cómo usar login()
primero, ya que instancia una conexión que es segura desde el principio y es un poco más concisa que SMTP_SSL()
alternativa. Tenga en cuenta que Gmail requiere que se conecte al puerto 465 si usa .starttls()
y al puerto 587 cuando usa create_default_context()
.
reaccionar-twitter-widgets
Opción 1: Uso de ssl
El siguiente ejemplo de código crea una conexión segura con el servidor SMTP de Gmail, utilizando el smtplib
de SMTP_SSL()
para iniciar una conexión encriptada TLS. El contexto predeterminado de .starttls()
valida el nombre de host y sus certificados y optimiza la seguridad de la conexión. Asegúrese de ingresar su propia dirección de correo electrónico en lugar de SMTP_SSL()
:
Utilizando .starttls()
se asegura de que la conexión se cierre automáticamente al final del bloque de código sangrado. Si SMTP_SSL()
es cero, o no se especifica, SMTP_SSL()
utilizará el puerto estándar para SMTP sobre SSL (puerto 465).
No es una práctica segura almacenar su contraseña de correo electrónico en su código, especialmente si tiene la intención de compartirla con otras personas. En su lugar, utilice smtplib
para permitir que el usuario escriba su contraseña al ejecutar el script, como en el ejemplo anterior. Si no desea que su contraseña se muestre en la pantalla cuando la escriba, puede importar la |_+_| módulo y uso ssl
en lugar de ingresar a ciegas su contraseña.
Opción 2: Uso de my@gmail.com
En lugar de utilizar import smtplib, ssl port = 465 # For SSL password = input('Type your password and press enter: ') # Create a secure SSL context context = ssl.create_default_context() with smtplib.SMTP_SSL('smtp.gmail.com', port, context=context) as server: server.login('my@gmail.com', password) # TODO: Send email here
Para crear una conexión segura desde el principio, podemos crear una conexión SMTP no segura y cifrarla usando with smtplib.SMTP_SSL() as server:
.
Para hacer esto, cree una instancia de port
, que encapsula una conexión SMTP y le permite acceder a sus métodos. Recomiendo definir su servidor y puerto SMTP al comienzo de su secuencia de comandos para configurarlos fácilmente.
El siguiente fragmento de código utiliza la construcción .SMTP_SSL()
, en lugar del formato input()
que usamos en el ejemplo anterior. Para asegurarse de que su código no se bloquee cuando algo sale mal, coloque su código principal en un getpass
bloque, y sea .getpass()
bloque imprime cualquier mensaje de error en .starttls()
:
Para identificarse ante el servidor, .SMTP_SSL()
(SMTP) o .starttls()
(ESMTP) se debe llamar después de crear un smtplib.SMTP
objeto, y de nuevo después de server = SMTP()
. Esta función es llamada implícitamente por with SMTP() as server:
y try
si es necesario, así que a menos que desee comprobar las extensiones de servicio SMTP del servidor, no es necesario utilizar except
o stdout
explícitamente.
Envío de su correo electrónico de texto sin formato
Después de iniciar una conexión SMTP segura utilizando cualquiera de los métodos anteriores, puede enviar su correo electrónico utilizando import smtplib, ssl smtp_server = 'smtp.gmail.com' port = 587 # For starttls sender_email = 'my@gmail.com' password = input('Type your password and press enter: ') # Create a secure SSL context context = ssl.create_default_context() # Try to log in to server and send email try: server = smtplib.SMTP(smtp_server,port) server.ehlo() # Can be omitted server.starttls(context=context) # Secure the connection server.ehlo() # Can be omitted server.login(sender_email, password) # TODO: Send email here except Exception as e: # Print any error messages to stdout print(e) finally: server.quit()
, que prácticamente hace lo que dice en la lata:
myprepaidcenter com para activar|_+_|
Recomiendo definir las direcciones de correo electrónico y el contenido del mensaje en la parte superior de su secuencia de comandos, después de las importaciones, para que pueda cambiarlos fácilmente:
|_+_|El .helo()
la cadena comienza con .ehlo()
seguido de dos nuevas líneas (.SMTP()
). Esto asegura .starttls()
aparece como el asunto del correo electrónico, y el texto que sigue a las nuevas líneas se tratará como el cuerpo del mensaje.
El siguiente ejemplo de código envía un correo electrónico de texto sin formato usando .starttls()
:
A modo de comparación, aquí hay un ejemplo de código que envía un correo electrónico de texto sin formato a través de una conexión SMTP protegida con .sendmail()
. El .helo()
las líneas se pueden omitir, ya que son llamadas implícitamente por .ehlo()
y .sendmail()
, si es necesario:
Envío de correos electrónicos elegantes
Incorporado en Python server.sendmail(sender_email, receiver_email, message)
El paquete le permite estructurar correos electrónicos más sofisticados, que luego se pueden transferir con sender_email = 'my@gmail.com' receiver_email = 'your@gmail.com' message = ''' Subject: Hi there This message is sent from Python.''' # Send email here
como ya lo has hecho. A continuación, aprenderá a utilizar message
paquete para enviar correos electrónicos con contenido HTML y archivos adjuntos.
Incluyendo contenido HTML
Si desea formatear el texto de su correo electrónico ( negrita , cursiva , etc.), o si desea agregar imágenes, hipervínculos o contenido receptivo, HTML es muy útil. El tipo de correo electrónico más común en la actualidad es el correo electrónico multiparte MIME (Extensiones multipropósito de correo de Internet), que combina HTML y texto sin formato. Los mensajes MIME son manejados por Python 'Subject: Hi there'
módulo. Para obtener una descripción detallada, consulte la documentación .
Como no todos los clientes de correo electrónico muestran contenido HTML de forma predeterminada, y algunas personas eligen recibir solo mensajes de correo electrónico de texto sin formato por razones de seguridad, es importante incluir una alternativa de texto sin formato para los mensajes HTML. Como el cliente de correo electrónico representará primero el último archivo adjunto de varias partes, asegúrese de agregar el mensaje HTML después de la versión de texto sin formato.
En el siguiente ejemplo, nuestro
Los objetos contendrán las versiones HTML y de texto sin formato de nuestro mensaje, y el Hi there
instancia los combina en un solo mensaje con dos opciones de representación alternativas:
En este ejemplo, primero define el mensaje HTML y de texto sin formato como cadenas literales y luego los almacena como SMTP_SSL()
/ import smtplib, ssl port = 465 # For SSL smtp_server = 'smtp.gmail.com' sender_email = 'my@gmail.com' # Enter your address receiver_email = 'your@gmail.com' # Enter receiver address password = input('Type your password and press enter: ') message = ''' Subject: Hi there This message is sent from Python.''' context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message)
.starttls()
objetos. A continuación, se pueden añadir en este orden al server.ehlo()
mensaje y enviado a través de su conexión segura con el servidor de correo electrónico. Recuerde agregar el mensaje HTML después de la alternativa de texto sin formato, ya que los clientes de correo electrónico intentarán representar primero la última subparte.
Adición de archivos adjuntos mediante .starttls()
Paquete
Para enviar archivos binarios a un servidor de correo electrónico que está diseñado para trabajar con datos textuales, deben codificarse antes del transporte. Esto se hace más comúnmente usando |_+_| , que codifica datos binarios en caracteres ASCII imprimibles.
El siguiente ejemplo de código muestra cómo enviar un correo electrónico con un archivo PDF como archivo adjunto:
|_+_|El .sendmail()
mensaje acepta parámetros en forma de RFC5233 pares clave / valor de estilo, que se almacenan en un diccionario y se pasan al import smtplib, ssl port = 587 # For starttls smtp_server = 'smtp.gmail.com' sender_email = 'my@gmail.com' receiver_email = 'your@gmail.com' password = input('Type your password and press enter:') message = ''' Subject: Hi there This message is sent from Python.''' context = ssl.create_default_context() with smtplib.SMTP(smtp_server, port) as server: server.ehlo() # Can be omitted server.starttls(context=context) server.ehlo() # Can be omitted server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message)
método de El |_+_| clase base.
Revisar la documentación para Python email
módulo para aprender más sobre el uso de clases MIME.
Envío de varios correos electrónicos personalizados
Imagine que desea enviar correos electrónicos a los miembros de su organización para recordarles que paguen sus cuotas de contribución. O tal vez desee enviar a los estudiantes de su clase correos electrónicos personalizados con las calificaciones de su tarea reciente. Estas tareas son muy sencillas en Python.
Crear un archivo CSV con información personal relevante
Un punto de partida sencillo para enviar varios correos electrónicos personalizados es crear un archivo CSV (valores separados por comas) que contenga toda la información personal necesaria. (Asegúrese de no compartir la información privada de otras personas sin su consentimiento). Un archivo CSV puede considerarse como una tabla simple, donde la primera línea a menudo contiene los encabezados de las columnas.
A continuación se muestran los contenidos del archivo smtplib
, que guardé en la misma carpeta que mi código Python. Contiene los nombres, direcciones y calificaciones de un conjunto de personas ficticias. Usé email
construcciones para asegurarme de que todos los correos electrónicos terminen en mi propia bandeja de entrada, que en este ejemplo es my@gmail.com :
reaccionar biblioteca de animación nativa|_+_|
Al crear un archivo CSV, asegúrese de separar sus valores con una coma, sin espacios en blanco alrededor.
Recorra filas para enviar varios correos electrónicos
El siguiente ejemplo de código muestra cómo abrir un archivo CSV y recorrer sus líneas de contenido (omitiendo la fila del encabezado). Para asegurarme de que el código funcione correctamente antes de enviar correos electrónicos a todos sus contactos, imprimí email.mime
para cada contacto, que luego podemos reemplazar con una funcionalidad que realmente envía correos electrónicos:
En el ejemplo anterior, el uso de Hi, MIMEText()
asegura que su archivo se cierre al final del bloque de código. MIMEMultipart('alternative')
facilita la lectura de un archivo CSV línea por línea y extrae sus valores. El import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart sender_email = 'my@gmail.com' receiver_email = 'your@gmail.com' password = input('Type your password and press enter:') message = MIMEMultipart('alternative') message['Subject'] = 'multipart test' message['From'] = sender_email message['To'] = receiver_email # Create the plain-text and HTML version of your message text = ''' Hi, How are you? Real Python has many great tutorials: www.realpython.com''' html = '''
línea omite la fila de encabezado, de modo que la siguiente línea
How are you?
Real Python has many great tutorials. plain
divide las filas siguientes en cada coma y almacena los valores resultantes en las cadenas html
, MIMEText
y MIMEMultipart('alternative')
para el contacto actual.
Si los valores en su archivo CSV contienen espacios en blanco en uno o ambos lados, puede eliminarlos usando email
método.
Contenido personalizado
Puede poner contenido personalizado en un mensaje usando base64
para rellenar los marcadores de posición con corchetes. Por ejemplo, import email, smtplib, ssl from email import encoders from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText subject = 'An email with attachment from Python' body = 'This is an email with attachment sent from Python' sender_email = 'my@gmail.com' receiver_email = 'your@gmail.com' password = input('Type your password and press enter:') # Create a multipart message and set headers message = MIMEMultipart() message['From'] = sender_email message['To'] = receiver_email message['Subject'] = subject message['Bcc'] = receiver_email # Recommended for mass emails # Add body to email message.attach(MIMEText(body, 'plain')) filename = 'document.pdf' # In same directory as script # Open PDF file in binary mode with open(filename, 'rb') as attachment: # Add file as application/octet-stream # Email client can usually download this automatically as attachment part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) # Encode file in ASCII characters to send by email encoders.encode_base64(part) # Add header as key/value pair to attachment part part.add_header( 'Content-Disposition', f'attachment; filename= {filename}', ) # Add attachment to message and convert message to string message.attach(part) text = message.as_string() # Log in to server using secure context and send email context = ssl.create_default_context() with smtplib.SMTP_SSL('smtp.gmail.com', 465, context=context) as server: server.login(sender_email, password) server.sendmail(sender_email, receiver_email, text)
te dará MIMEultipart()
.
A partir de Python 3.6, el formateo de cadenas se puede realizar de manera más elegante utilizando cadenas f, pero estas requieren que los marcadores de posición se definan antes que la cadena f en sí. Para definir el mensaje de correo electrónico al principio de la secuencia de comandos y completar los marcadores de posición de cada contacto al recorrer el archivo CSV, el .add_header
más antiguo | se utiliza el método.
Con esto en mente, puede configurar un cuerpo de mensaje general, con marcadores de posición que se pueden adaptar a las personas.
Ejemplo de código
El siguiente ejemplo de código le permite enviar correos electrónicos personalizados a varios contactos. Recorre un archivo CSV con Message
para cada contacto.
El mensaje general se define al principio del script, y para cada contacto en el archivo CSV su email.mime
y contacts_file.csv
Se completan los marcadores de posición y se envía un correo electrónico personalizado a través de una conexión segura con el servidor de Gmail, como vio antes:
Yagmail
Hay varias bibliotecas diseñadas para facilitar el envío de correos electrónicos, como Sobres , Flanker y Yagmail . Yagmail está diseñado para funcionar específicamente con Gmail y simplifica enormemente el proceso de envío de correos electrónicos a través de una API amigable, como puede ver en el ejemplo de código a continuación:
|_+_|Al configurar Yagmail, puede agregar sus validaciones de Gmail al llavero de su sistema operativo, como se describe en la documentación . Si no lo hace, Yagmail le pedirá que ingrese su contraseña cuando sea necesario y la guardará en el llavero automáticamente.
Servicios de correo electrónico transaccional
Si planea enviar un gran volumen de correos electrónicos, desea ver estadísticas de correo electrónico y desea garantizar una entrega confiable, puede valer la pena buscar en los servicios de correo electrónico transaccional. Aunque todos los siguientes servicios tienen planes pagos para enviar grandes volúmenes de correos electrónicos, también vienen con un plan gratuito para que pueda probarlos. Algunos de estos planes gratuitos son válidos indefinidamente y pueden ser suficientes para sus necesidades de correo electrónico.
Puedes ejecutar un búsqueda de Google para ver qué proveedor se adapta mejor a sus necesidades, o simplemente pruebe algunos de los planes gratuitos para ver con qué API le gusta trabajar más.
Ejemplo de código de Sendgrid
A continuación, se muestra un ejemplo de código para enviar correos electrónicos con Sendgrid para darle una idea de cómo usar un servicio de correo electrónico transaccional con Python:
|_+_|Para ejecutar este código, primero debe:
argv(0 pitón)
- Regístrese para obtener una cuenta Sendgrid (gratuita)
- Solicita una clave de API para la validación del usuario
- Agregue su clave API escribiendo
my+modifier@gmail.com
en el símbolo del sistema (para almacenar esta clave de API de forma permanente) oname,email,grade Ron Obvious,my+ovious@gmail.com,B+ Killer Rabbit of Caerbannog,my+rabbit@gmail.com,A Brian Cohen,my+brian@gmail.com,C
para almacenarlo solo para la sesión actual del cliente
Puede encontrar más información sobre cómo configurar Sendgrid para Mac y Windows en el archivo README del repositorio en Github .
Conclusión
¡Ahora puede iniciar una conexión SMTP segura y enviar múltiples correos electrónicos personalizados a las personas en su lista de contactos!
Ha aprendido a enviar un correo electrónico HTML con una alternativa de texto sin formato y adjuntar archivos a sus correos electrónicos. los Yagmail paquete simplifica todas estas tareas cuando utiliza una cuenta de Gmail. Si planea enviar grandes volúmenes de correo electrónico, vale la pena considerar los servicios de correo electrónico transaccional.
#python # desarrollo web
www.youtube.com
Script de Python para enviar correos electrónicos
En este tutorial de Python, aprenderá a enviar correos electrónicos con Python. Secuencia de comandos de Python para enviar correos electrónicos: una tarea común para los administradores y desarrolladores del sistema es utilizar secuencias de comandos para enviar correos electrónicos si se produce un error