Python发送HTML格式、带附件的电子邮件和发送图片(第2节)


1、Python发送HTML格式的邮件

在上一节教程中,我们已经介绍了使用Python成功发送一个纯文本格式的电子邮件。使用Python发送邮件的内容不仅仅是文字,它还可以包含HTML格式的丰富文本,只要将MIMEText()函数的第二个参数改为“html”就可以。例如:

动手练一练:

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

# 发件人邮箱账号
from_addres = "5********8@qq.com"
# 发件人邮箱密码,即配置生成的授权码
password = "m***********b"
# 收件人邮箱账号,你可以填任意想要发送的邮箱,也可以发送给自己
to_addres = "5********8@qq.com"
# html内容
text = """
    <h1>学会Python编程,月薪过万不是梦! </h1>
    <p><a href="https://www.pyhint.com">在线学习Python编程,进入www.pyhint.com</a></p>
    <p>
    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
    <img src="cid:img01">
    </p>
    """
# 指定消息体使用纯文本格式
message = MIMEText(text, "html", "utf-8")
# 发件人显式的名字
message["From"] = formataddr(["Python编程教学", from_addres])
# 收件人显式的名字
message["To"] = formataddr(["在线编程学习", to_addres]) 
# 邮件标题
message["Subject"] = "Python邮件发送测试"

try:
    # QQ邮箱SMTP服务器,端口是25
    server = smtplib.SMTP_SSL("smtp.qq.com",)
    # 登录
    server.login(from_addres, password)
    # 发送
    server.sendmail(from_addres, to_addres, message.as_string())
    print("QQ邮件发送成功!")
    # 退出服务器
    server.quit()
except smtplib.SMTPException as e:
    print("QQ邮件发送失败!", e)

执行以上代码,输出结果为:

QQ邮件发送成功

2、Python发送带附件的邮件

目前,电子邮件发送带附件的邮件是许多商业和个人用户的常见需求。Python发送带附件的邮件,同样可以简单实现。Python的email模块提供了构建复杂邮件消息体的支持,其中MIMEMultipart类用于创建包含多个部分(如文本、附件等)的邮件。例如:

动手练一练:

from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.utils import formataddr
import smtplib

# 发件人邮箱账号
from_addres = "5********8@qq.com"
# 发件人邮箱密码,即配置生成的授权码
password = "m***********b"
# 收件人邮箱账号,你可以填任意想要发送的邮箱,也可以发送给自己
to_addres = "5********8@qq.com"
# html内容
text = """
    <h1>学会Python编程,月薪过万不是梦! </h1>
    <p><a href="https://www.pyhint.com">在线学习Python编程,进入www.pyhint.com</a></p>
    <p>
    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
    <img src="cid:img01">
    </p>
    """
# 创建MIMEMultipart实例
message = MIMEMultipart()
# 发件人显式的名字
message["From"] = formataddr(["Python编程教学", from_addres])
# 收件人显式的名字
message["To"] = formataddr(["在线编程学习", to_addres]) 
# 邮件标题
message["Subject"] = "Python发送带附件的邮件测试"

# 添加邮件正文MIMEText
message.attach(MIMEText(text, "html", "utf-8"))

# 添加附件就是加上一个MIMEBase,从本地读取一个word文档
with open("D:\\test.txt","rb") as f:
    # 设置附件的MIME和文件名,这里是docx类型
    mimebase = MIMEBase("我的测试文档","docx")
    # 加上必要的头信息
    mimebase.add_header("Content-Disposition", "attachment", filename="test.txt")
    mimebase.add_header("Content-ID", "<0>")
    mimebase.add_header("X-Attachment-Id", "0")
    # 把附件的内容读进来
    mimebase.set_payload(f.read())
    # 用Base64编码
    encoders.encode_base64(mimebase)
    # 添加到MIMEMultipart中
    message.attach(mimebase)

try:
    # QQ邮箱SMTP服务器,端口是25
    server = smtplib.SMTP_SSL("smtp.qq.com",)
    # 登录
    server.login(from_addres, password)
    # 发送
    server.sendmail(from_addres, to_addres, message.as_string())
    print("QQ邮件发送成功!")
    # 退出服务器
    server.quit()
except smtplib.SMTPException as e:
    print("QQ邮件发送失败!", e)

执行以上代码,输出结果为:

QQ邮件发送成功

上面的例子中,附件路径是“D:\test.txt”,所以我们必须先在D盘文件夹内创建一个test.txt文件,然后输入任意内容再保存。我们先使用MIMEMultipart创建实例,然后通过把邮件正文和邮件附件分别添加到attach()函数里面即可,因为MIMEBase可以表示任何对象,所以此处使用它存储邮件附件。

3、将图片嵌入到邮件正文

我们都知道在邮件营销活动中,在邮件中添加图片可以吸引用户的眼球,提高邮件营销的效果。因此许多企业为了方便编辑,在发送邮件内容时添加大量图片,由于图片容易携带木马程序或病毒,许多邮件服务商在默认状态下都会拦截邮件中的图片,导致收件人无法看到图片,而是大片的空白。这时需要收件人点击“显示图片”或点击“信任”此发件人的图片,图片才会显示出来。

那么怎样发送图片,才不会被拦截呢?只需要把图片作为附件添加到邮件消息体中,然后在html格式的img标签的src属性中给图片设置一个src="cid:img01"即可。例如:

动手练一练:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.utils import formataddr

# 发件人邮箱账号
from_addres = "5********8@qq.com"
# 发件人邮箱密码,即配置生成的授权码
password = "m***********b"
# 收件人邮箱账号,你可以填任意想要发送的邮箱,也可以发送给自己
to_addres = "5********8@qq.com"
# html内容
text = """
    <h1>学会Python编程,月薪过万不是梦! </h1>
    <p><a href="https://www.pyhint.com">在线学习Python编程,进入www.pyhint.com</a></p>
    <p>
    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
    <img src="cid:img01">
    </p>
    """
# 利用related定义内嵌资源的邮件体
message = MIMEMultipart("related")
# 发件人显式的名字
message["From"] = formataddr(["Python编程教学", from_addres])
# 收件人显式的名字
message["To"] = formataddr(["在线编程学习", to_addres]) 
# 邮件标题
message["Subject"] = "Python发送带附件的邮件测试"

# 添加邮件正文MIMEText
message.attach(MIMEText(text, "html", "utf-8"))

# 添加图片
with open("D:\\test.jpg", "rb") as f:
    img01 = MIMEImage(f.read())
# 定义资源的名字为img01
img01.add_header("Content-ID", "img01")
# 邮件附加图片
message.attach(img01)

try:
    # QQ邮箱SMTP服务器,端口是25
    server = smtplib.SMTP_SSL("smtp.qq.com",)
    # 登录
    server.login(from_addres, password)
    # 发送
    server.sendmail(from_addres, to_addres, message.as_string())
    print("QQ邮件发送成功!")
    # 退出服务器
    server.quit()
except smtplib.SMTPException as e:
    print("QQ邮件发送失败!", e)

执行以上代码,输出结果为:

邮件发送成功

上面的例子中,图片路径是“D:\test.jpg”,所以我们必须先在D盘存放一张test.jpg图片。