如何在 Python 中使用 smtplib 通过电子邮件发送 .html 文件
How to email a .html file using smtplib in Python
我一直在使用 Jupyter 制作 html 报告,我希望能够使用 smtplib 通过电子邮件发送这些报告。我已经能够成功发送电子邮件,但无法获得 html 报告以附加或嵌入电子邮件。
我一直在使用的代码如下所示...
fromaddr = "myemail@domain.com.au"
toaddr = "myfriendsemail@domain.com.au"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"
html = open("WeeklyReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("myemail@domain.com.au", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
我认为问题主要出在我从 https://docs.python.org/3.4/library/email-examples.html
中提取和修改的中间位
html = open("WeeklyPnlReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)
当我 运行 此代码时,我收到一封电子邮件,我在 Gmail 中打开它,它是空白的并且有一个名为 'noname' 的附件。预览它不起作用,下载它会导致我的电脑不知道用什么文件打开它。
如果我将中间位更改为:
part2 = MIMEText(html.read(), 'html')
我收到一封电子邮件,上面写着 "message clipped",然后当我单击 "view entire message" 时,会弹出一个新选项卡,其中包含报告的 html 文本。
如果我 运行 有:
part2 = MIMEText(html, 'html')
我收到错误消息“'_io.TextIOWrapper' 对象没有属性 'encode'”。
我目前完全不知道该做什么。我基本上只是希望 html 报告附在我的电子邮件中或在电子邮件中。我已经查看了 MIMEText 的文档,但它非常稀疏,而且让我头疼。我很想知道更多关于它是如何运作的,但更具体地说,如何让 html 文件嵌入到电子邮件中或附加到电子邮件中。
提前致谢。
不指定主要内容类型,只指定次要类型:不是text/html
,而是html
:
part2 = MIMEText(html.read(), 'html') # Note: no "text/"
您不需要 multipart
消息,除非您要发送多个部分。
如果您使用 multipart
,请指定次要内容类型。默认的多部分类型是 multipart/mixed
。你可能想要 multipart/alternative
:
msg = MIMEMultipart('alternative')
这可能对你有用:
from email.mime.text import MIMEText
import smtplib
fromaddr = "me@example.com"
toaddr = "myfriend@example.com"
html = open("WeeklyReport.html")
msg = MIMEText(html.read(), 'html')
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"
debug = False
if debug:
print(msg.as_string())
else:
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("me@example.com", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
我一直在使用 Jupyter 制作 html 报告,我希望能够使用 smtplib 通过电子邮件发送这些报告。我已经能够成功发送电子邮件,但无法获得 html 报告以附加或嵌入电子邮件。
我一直在使用的代码如下所示...
fromaddr = "myemail@domain.com.au"
toaddr = "myfriendsemail@domain.com.au"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"
html = open("WeeklyReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("myemail@domain.com.au", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
我认为问题主要出在我从 https://docs.python.org/3.4/library/email-examples.html
中提取和修改的中间位html = open("WeeklyPnlReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)
当我 运行 此代码时,我收到一封电子邮件,我在 Gmail 中打开它,它是空白的并且有一个名为 'noname' 的附件。预览它不起作用,下载它会导致我的电脑不知道用什么文件打开它。
如果我将中间位更改为:
part2 = MIMEText(html.read(), 'html')
我收到一封电子邮件,上面写着 "message clipped",然后当我单击 "view entire message" 时,会弹出一个新选项卡,其中包含报告的 html 文本。
如果我 运行 有:
part2 = MIMEText(html, 'html')
我收到错误消息“'_io.TextIOWrapper' 对象没有属性 'encode'”。
我目前完全不知道该做什么。我基本上只是希望 html 报告附在我的电子邮件中或在电子邮件中。我已经查看了 MIMEText 的文档,但它非常稀疏,而且让我头疼。我很想知道更多关于它是如何运作的,但更具体地说,如何让 html 文件嵌入到电子邮件中或附加到电子邮件中。
提前致谢。
不指定主要内容类型,只指定次要类型:不是text/html
,而是html
:
part2 = MIMEText(html.read(), 'html') # Note: no "text/"
您不需要 multipart
消息,除非您要发送多个部分。
如果您使用 multipart
,请指定次要内容类型。默认的多部分类型是 multipart/mixed
。你可能想要 multipart/alternative
:
msg = MIMEMultipart('alternative')
这可能对你有用:
from email.mime.text import MIMEText
import smtplib
fromaddr = "me@example.com"
toaddr = "myfriend@example.com"
html = open("WeeklyReport.html")
msg = MIMEText(html.read(), 'html')
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"
debug = False
if debug:
print(msg.as_string())
else:
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("me@example.com", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()