Enviando correo electrónico HTML usando Python

¿Cómo puedo enviar el contenido HTML en un correo electrónico usando Python? Puedo enviar texto simple.

De la documentación de Python v2.7.14 – 18.1.11. correo electrónico: Ejemplos :

Este es un ejemplo de cómo crear un mensaje HTML con una versión alternativa de texto plano:

#! /usr/bin/python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # me == my email address # you == recipient's email address me = "my@email.com" you = "your@email.com" # Create message container - the correct MIME type is multipart/alternative. msg = MIMEMultipart('alternative') msg['Subject'] = "Link" msg['From'] = me msg['To'] = you # Create the body of the message (a plain-text and an HTML version). text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org" html = """\    

Hi!
How are you?
Here is the link you wanted.

""" # Record the MIME types of both parts - text/plain and text/html. part1 = MIMEText(text, 'plain') part2 = MIMEText(html, 'html') # Attach parts into message container. # According to RFC 2046, the last part of a multipart message, in this case # the HTML message, is best and preferred. msg.attach(part1) msg.attach(part2) # Send the message via local SMTP server. s = smtplib.SMTP('localhost') # sendmail function takes 3 arguments: sender's address, recipient's address # and message to send - here it is sent as one string. s.sendmail(me, you, msg.as_string()) s.quit()

Puedes intentar usar mi módulo de correo .

 from mailer import Mailer from mailer import Message message = Message(From="me@example.com", To="you@example.com") message.Subject = "An HTML Email" message.Html = """

Hi!
How are you?
Here is the link you wanted.

""" sender = Mailer('smtp.example.com') sender.send(message)

Aquí hay una implementación de Gmail de la respuesta aceptada:

 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # me == my email address # you == recipient's email address me = "my@email.com" you = "your@email.com" # Create message container - the correct MIME type is multipart/alternative. msg = MIMEMultipart('alternative') msg['Subject'] = "Link" msg['From'] = me msg['To'] = you # Create the body of the message (a plain-text and an HTML version). text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org" html = """\    

Hi!
How are you?
Here is the link you wanted.

""" # Record the MIME types of both parts - text/plain and text/html. part1 = MIMEText(text, 'plain') part2 = MIMEText(html, 'html') # Attach parts into message container. # According to RFC 2046, the last part of a multipart message, in this case # the HTML message, is best and preferred. msg.attach(part1) msg.attach(part2) # Send the message via local SMTP server. mail = smtplib.SMTP('smtp.gmail.com', 587) mail.ehlo() mail.starttls() mail.login('userName', 'password') mail.sendmail(me, you, msg.as_string()) mail.quit()

Aquí hay una forma sencilla de enviar un correo electrónico HTML, simplemente especificando el encabezado Content-Type como ‘text / html’:

 import email.message import smtplib msg = email.message.Message() msg['Subject'] = 'foo' msg['From'] = 'sender@test.com' msg['To'] = 'recipient@test.com' msg.add_header('Content-Type','text/html') msg.set_payload('Body of message') # Send the message via local SMTP server. s = smtplib.SMTP('localhost') s.starttls() s.login(email_login, email_passwd) s.sendmail(msg['From'], [msg['To']], msg.as_string()) s.quit() 

Aquí está el código de ejemplo. Esto está inspirado en el código que se encuentra en el sitio de Python Cookbook (no se puede encontrar el enlace exacto)

 def createhtmlmail (html, text, subject, fromEmail): """Create a mime-message that will render HTML in popular MUAs, text in better ones""" import MimeWriter import mimetools import cStringIO out = cStringIO.StringIO() # output buffer for our message htmlin = cStringIO.StringIO(html) txtin = cStringIO.StringIO(text) writer = MimeWriter.MimeWriter(out) # # set up some basic headers... we put subject here # because smtplib.sendmail expects it to be in the # message body # writer.addheader("From", fromEmail) writer.addheader("Subject", subject) writer.addheader("MIME-Version", "1.0") # # start the multipart section of the message # multipart/alternative seems to work better # on some MUAs than multipart/mixed # writer.startmultipartbody("alternative") writer.flushheaders() # # the plain text section # subpart = writer.nextpart() subpart.addheader("Content-Transfer-Encoding", "quoted-printable") pout = subpart.startbody("text/plain", [("charset", 'us-ascii')]) mimetools.encode(txtin, pout, 'quoted-printable') txtin.close() # # start the html subpart of the message # subpart = writer.nextpart() subpart.addheader("Content-Transfer-Encoding", "quoted-printable") # # returns us a file-ish object we can write to # pout = subpart.startbody("text/html", [("charset", 'us-ascii')]) mimetools.encode(htmlin, pout, 'quoted-printable') htmlin.close() # # Now that we're done, close our writer and # return the message body # writer.lastpart() msg = out.getvalue() out.close() print msg return msg if __name__=="__main__": import smtplib html = 'html version' text = 'TEST VERSION' subject = "BACKUP REPORT" message = createhtmlmail(html, text, subject, 'From Host ') server = smtplib.SMTP("smtp_server_address","smtp_port") server.login('username', 'password') server.sendmail('sender@host.com', 'target@otherhost.com', message) server.quit() 

En realidad, Yagmail tomó un enfoque un poco diferente.

Por defecto enviará HTML, con respaldo automático para lectores de correo electrónico incapaces. Ya no es el siglo XVII.

Por supuesto, se puede anular, pero aquí va:

 import yagmail yag = yagmail.SMTP("me@example.com", "mypassword") html_msg = """

Hi!
How are you?
Here is the link you wanted.

""" yag.send("to@example.com", "the subject", html_msg)

Para obtener instrucciones de instalación y muchas otras características excelentes, echa un vistazo al github .

Este es un ejemplo smtplib para enviar correos electrónicos de texto plano y HTML desde Python usando smtplib junto con las opciones CC y BCC.

https://varunver.wordpress.com/2017/01/26/python-smtplib-send-plaintext-and-html-emails/

 #!/usr/bin/env python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def send_mail(params, type_): email_subject = params['email_subject'] email_from = "from_email@domain.com" email_to = params['email_to'] email_cc = params.get('email_cc') email_bcc = params.get('email_bcc') email_body = params['email_body'] msg = MIMEMultipart('alternative') msg['To'] = email_to msg['CC'] = email_cc msg['Subject'] = email_subject mt_html = MIMEText(email_body, type_) msg.attach(mt_html) server = smtplib.SMTP('YOUR_MAIL_SERVER.DOMAIN.COM') server.set_debuglevel(1) toaddrs = [email_to] + [email_cc] + [email_bcc] server.sendmail(email_from, toaddrs, msg.as_string()) server.quit() # Calling the mailer functions params = { 'email_to': 'to_email@domain.com', 'email_cc': 'cc_email@domain.com', 'email_bcc': 'bcc_email@domain.com', 'email_subject': 'Test message from python library', 'email_body': '

Hello World

' } for t in ['plain', 'html']: send_mail(params, t)

Aquí está mi respuesta para AWS usando boto3

  subject = "Hello" html = "Hello Consumer" client = boto3.client('ses', region_name='us-east-1', aws_access_key_id="your_key", aws_secret_access_key="your_secret") client.send_email( Source='ACME ', Destination={'ToAddresses': [email]}, Message={ 'Subject': {'Data': subject}, 'Body': { 'Html': {'Data': html} } } 

La solución más sencilla para enviar correos electrónicos desde una cuenta de organización en Office 365:

 from O365 import Message html_template = """      {}   """ final_html_data = html_template.format(df.to_html(index=False)) o365_auth = ('sender_username@company_email.com','Password') m = Message(auth=o365_auth) m.setRecipients('receiver_username@company_email.com') m.setSubject('Weekly report') m.setBodyHTML(final) m.sendMessage() 

Aquí df es un dataframe convertido a html Table, que se está inyectando en html_template