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图片。