script library example enviar con adjunto python html-email

library - send email python gmail



Enviando correo electrónico HTML usando Python (9)

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


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 <[email protected]>'') server = smtplib.SMTP("smtp_server_address","smtp_port") server.login(''username'', ''password'') server.sendmail(''[email protected]'', ''[email protected]'', message) server.quit()


Aquí está mi respuesta para AWS usando boto3

subject = "Hello" html = "<b>Hello Consumer</b>" 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 <[email protected]>'', Destination={''ToAddresses'': [email]}, Message={ ''Subject'': {''Data'': subject}, ''Body'': { ''Html'': {''Data'': html} } }


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''] = ''[email protected]'' msg[''To''] = ''[email protected]'' msg.add_header(''Content-Type'',''text/html'') msg.set_payload(''Body of <b>message</b>'') s = smtplib.SMTP(mailmerge_conf.smtp_server) s.starttls() s.login(email_login, email_passwd) s.sendmail(msg[''From''], [msg[''To'']], msg.as_string())


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 = "[email protected]" you = "[email protected]" # 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 = """/ <html> <head></head> <body> <p>Hi!<br> How are you?<br> Here is the <a href="http://www.python.org">link</a> you wanted. </p> </body> </html> """ # 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()


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 = "[email protected]" you = "[email protected]" # 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 = """/ <html> <head></head> <body> <p>Hi!<br> How are you?<br> Here is the <a href="http://www.python.org">link</a> you wanted. </p> </body> </html> """ # 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()


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("[email protected]", "mypassword") html_msg = """<p>Hi!<br> How are you?<br> Here is the <a href="http://www.python.org">link</a> you wanted.</p>""" yag.send("[email protected]", "the subject", html_msg)

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


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 = "[email protected]" 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'': ''[email protected]'', ''email_cc'': ''[email protected]'', ''email_bcc'': ''[email protected]'', ''email_subject'': ''Test message from python library'', ''email_body'': ''<h1>Hello World</h1>'' } for t in [''plain'', ''html'']: send_mail(params, t)


Puedes intentar usar mi módulo de mailer .

from mailer import Mailer from mailer import Message message = Message(From="[email protected]", To="[email protected]") message.Subject = "An HTML Email" message.Html = """<p>Hi!<br> How are you?<br> Here is the <a href="http://www.python.org">link</a> you wanted.</p>""" sender = Mailer(''smtp.example.com'') sender.send(message)


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 = """ <html> <head> <title></title> </head> <body> {} </body> </html> """ 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 marco de datos convertido a html Table, que se está inyectando en html_template