上一篇文章《使用Python的smtplib模块发送简单邮件》介绍了调用smtplib模块发送包含简单内容的邮件,本文继续学习参考文献1中的发送带附件的邮件的示例代码,同时由于参考文献1中的带附件邮件中并没有邮件附件,而仅仅是邮件内容中关联的内嵌资源附件,本文结合参考文献2,实现发送带附件的电子邮件,代码主要参照参考文献1-2,里面有部分内容也不是太明白,只是记录测试过程及个人理解。
参考文献1中提供的发送带附件的邮件的示例代码及其程序运行效果如下所示,除了之前文章中用到的发送邮件所需的类及函数之外,代码中用到的类及函数的说明如下所示:
序号 | 类或函数 | 说明 |
---|---|---|
1 | MIMEMultipart | 用于定义邮件中不同类型的内容,根据参考文献3的介绍,MIMEMultipart(‘related’)类型除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中,而MIMEMultipart(‘alternative’)类型可以传送超文本内容 |
2 | attach | 将给定的 payload 添加到当前载荷中,本文中应该是指将带超文本内容的MIMEMultipart作为邮件主体内容加到邮件中。 |
3 | MIMEText | 用来创建主类型为 text 的 MIME 对象。 |
4 | open | 用于打开文件 |
5 | MIMEImage | 用于将实际图像数据编码以便传输 |
6 | add_header | 用于设置高级头字段 |
# coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
sender='XXXXXXXX@qq.com'
password='XXXXXXXX'
to='XXXXXXXX@qq.com'
def mail():
ret=True
try:
msg=MIMEMultipart('related')
msg['From']=sender
msg['To']=to
msg['Subject']='通过SMTP协议发送带附件邮件测试'
msgAlternative=MIMEMultipart('alternative')
msg.attach(msgAlternative)
mail_msg="""
<p>邮件测试</p>
<p><a ref="www.baidu.com">百度搜索</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg,'html','utf-8'))
fp=open('test.jpg','rb')
msgImage=MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID','<image1>')
msg.attach(msgImage)
server=smtplib.SMTP('smtp.qq.com')
server.login(sender,password)
server.sendmail(sender,to,msg.as_string())
print(msg.as_string())
server.quit()
except Exception as e:
ret=False
print(e)
return ret
if mail():
print('邮件发送成功')
else:
print('邮件发送失败')
上述程序代码中所用的图片只是作为内嵌资源用于在邮件主体内容中调用,并非是发邮件时附带的、可以下载的附件。为在邮件中增加附件,基于参考文献2中的代码,将其中夹带附件的代码内嵌到参考文献1的示例代码之中,主要增加的内容如下。:
att = MIMEBase("application", "octet-stream")
att.set_payload(open('test.jpg', "rb").read())
att1.add_header("Content-Disposition", "attachment", filename=Header("test.jpg", "utf-8").encode())
encoders.encode_base64(att)
msg.attach(att)
再调用发送邮件程序,即可将图片作为邮件附件一并发送,程序执行效果如下图所示:
参考文献:
[1]Python从菜鸟到高手
[2]https://blog.csdn.net/weixin_51424938/article/details/113795373
[3]https://blog.csdn.net/Winnycatty/article/details/84548381