Python发送多附件邮件的基本思路,首先就是用MIMEMultipart()方法来表示这个邮件由多个部分组成。然后再通过attach()方法将各部分内容分别加入到MIMEMultipart容器中。MIMEMultipart有attach()方法,而MIMENouMultipart没有,只能被attach。
python中MIME各对象的继承关系如下:
MIME有很多种类型,如果附件是文本格式,就是MIMEText;如果是图片格式就行MIMEImage
;如果是音频格式就用MIMEAudio
,如果是其他类型的格式例如pad,word、Excel等类型的,就很难确定用那种MIME了,此时可以使用MIMEApplication()
方法。MIMEApplication
默认子类型是application/octet-stream
,表明“这是个二进制,不知道文件的下载类型”,客户端收到这个声明后,根据文件后的扩展名进行处理。
import smtplib
import unittest
import HTMLTestRunner
import os,time,datetime
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header
# 定义发送邮箱和接收邮箱
sender = 'XXX@qq.com'
receivers = ['XXX@qq.com']
# 多附件邮件基本思路,首先用MIMEMultipart()来标识这个邮件由多个部分组成
# 然后通过Header方法,定义邮件的发送人、接收人、邮件标题;MIMEtext构造邮件正文
# 然后再用attach()方法将各部分内容分别加入到MIMEMultipart容器内
message = MIMEMultipart()
message['From'] = Header("python程序", 'utf-8')
message['To'] = Header("丑小鸭", 'utf-8')
message['Subject'] = Header('带附件的邮件测试', 'utf-8')
message.attach(MIMEText('这是用Python编写的邮件发送程序……', 'plain', 'utf-8'))
#通过MIMEApplication构造附件1
att1=MIMEApplication(open('E:\\Path\\fliename','rb').read())
att1["Content-Type"]='application/octet-stream'
#att1["Content-Disposition"] = 'attachment; filename="test1.html"'
att1.add_header('content-disposition', 'attachment', filename='fujian1.html')
message.attach(att1)
#通过MIMEText构造附件2文本
#Content-Type(内容类型)定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
#[Content-Type介绍](https://www.runoob.com/http/http-content-type.html)
#application/octet-stream:二进制流数据(如常见的文件下载)
# Content-Disposition激活附件下载对话框。Content-Disposition有两种属性:inline 和 attachment
# inline:默认值,将文件内容直接显示在页面;
# attachment:弹出对话框,让用户下载
# filename:定义下载文件的文件名。
att2=MIMEText(open('E:\\Path\\filename.txt','rb').read(),'base64','utf-8')
att2["Content-Type"]='application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="fujian2.txt"'
message.attach(att2)
#通过MIMEImage构造附件3图片
att3=MIMEImage(open('E:\\path\\filename.jpg','rb').read())
att3["Content-Type"]='application/octet-stream'
att3["Content-Disposition"] = 'attachment; filename="fujian3.jpg"'
message.attach(att3)
#通过MIMEAudio构造附件4。MEMEAudio需要定义音频类型
#[不同音频对应的类型参考]( )
att4=MIMEAudio(open('E:\\path\\filename.mp3','rb').read(),'audio')
att4["Content-Type"]='application/octet-stream'
att4["Content-Disposition"] = 'attachment; filename="fujian4.mp3"'
message.attach(att4)
# 链接SMTP服务器
#[开通QQ邮箱SMTP服务,获取授权码]()
smtp = smtplib.SMTP()
smtp.connect('smtp.qq.com')
smtp.login('XXXX@qq.com', '授权码')
smtp.sendmail(sender, receivers, message.as_string())
print ("邮件发送成功!!!")
smtp.quit()
运行后,查看对应的测试结果: