使用Python发送HTML电子邮件

如何使用Python在电子邮件中发送HTML内容? 我可以发简单的文字。

从Python v2.6.2文档 – 19.1.11。 电子邮件:例子 :

以下是如何使用替代纯文本版本创建HTML消息的示例:

#! /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 = """\ <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() 

您可以尝试使用我的邮件程序模块。

 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 = """<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) 

以下是接受的答案的Gmail实施:

 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 = """\ <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() 

下面是发送HTML电子邮件的简单方法,只需将Content-Type标头指定为“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 <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()) 

这里是示例代码。 这是从Python Cookbook网站上找到的代码所启发的(找不到确切的链接)

 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 <sender@host.com>') server = smtplib.SMTP("smtp_server_address","smtp_port") server.login('username', 'password') server.sendmail('sender@host.com', 'target@otherhost.com', message) server.quit() 

实际上, yagmail采取了一些不同的方法。

它将默认发送HTML,并为无法使用的电子邮件阅读器自动回退。 现在不是17世纪了。

当然,它可以被覆盖,但在这里:

 import yagmail yag = yagmail.SMTP("me@example.com", "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("to@example.com", "the subject", html_msg) 

有关安装说明和更多优秀功能,请参阅github 。

下面是一个运行示例,使用smtplib以及CC和BCC选项从Python发送纯文本和HTML电子邮件。

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': '<h1>Hello World</h1>' } for t in ['plain', 'html']: send_mail(params, t) 

这里是我使用boto3的AWS的答案

  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 <do-not-reply@acme.com>', Destination={'ToAddresses': [email]}, Message={ 'Subject': {'Data': subject}, 'Body': { 'Html': {'Data': html} } }