使用python从文件发送HTMLbody



我可以发送纯文本,但不能以html格式发送html文本。

import email, smtplib, ssl
import os
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
body = """
this is first mail by using python
"""
port_email = 587
smtp_server = "smtp.gmail.com"
password = "your password"

subject = "An email with attachment from Python"
sender_email = "sender@gmail.example.com"
receiver_email = "receiver@example.net"
# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email  # Recommended for mass emails
# Add body to email
message.attach(MIMEText(body, "plain"))
filename = "file name"  # In same directory as script
with open(filename.html, 'r', encoding="utf-8") as attachment:
part1 = attachment.read()
part2 = MIMEText(part1, "html")
message.attach(part2)
text = message.as_string()
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, 465 , context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, text)

这将发送附加文件,但我想在电子邮件正文中看到html文本。filename是内容html表,所以代码应该发送html文本,该文本将自动在html表的html正文中可用。

如果不是你想要的,你为什么要传递一个假的身体?

您的代码似乎是为Python 3.5或更早版本编写的。email库在3.6中进行了大修,现在变得更加通用和逻辑。可能会抛弃现有内容,从email文档中的示例开始。

下面是一个简短的尝试。

from email.message import EmailMessage
... 
message = EmailMessage()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
# No point in using Bcc if the recipient is already in To:
with open(filename) as fp:
message.set_content(fp.read(), 'html')
# no need for a context if you are just using the default SSL
with smtplib.SMTP_SSL(smtp_server, 465) as server:
server.login(sender_email, password)
# Prefer the modern send_message method
server.send_message(message)

如果您想用纯文本和HTML发送消息,链接的示例将向您展示如何调整代码以实现这一点,但实际上,text/plain正文部分实际上应该包含一个有用的消息,而不仅仅是一个占位符。

正如代码中所评论的,如果您已经在To:标头中指定了收件人,则没有理由使用Bcc:。如果您想使用Bcc:,则必须在To:标头中放入其他内容,通常是您自己的地址或类似:undisclosed-recipients;的地址列表

切向地说,当打开一个文件时,Python(或者实际上是操作系统(会检查用户的当前工作目录,而不是加载Python脚本的目录。也许还可以看看当前的工作目录到底是什么?

Mime有多种格式。默认情况下,MIMEMultipart构建一个多部分/混合消息,这意味着一个简单的文本正文和一堆附件。

当您想要正文的HTML表示时,您需要多部分/可选消息:

...
message = MIMEMultipart('alternative')
...

但是您使用的是旧的compat32 API。由于Python 3.6,您最好使用email.message.EmailMessage。。。

相关内容

  • 没有找到相关文章

最新更新