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