用Python来发送邮件还是蛮有趣的一件事,python为我们提供了这样一个模块,可以方便的发送电子邮件,先来总结一下
1. SMTP和HTTP类似。都是头里面有一些相关信息,content-type ,encoding等。Message是基类。用字典映射的方式可以读取和设置head中选项的值。MIMEText,MIMEImage,MIMEAudio等MIME类型继承自MIMEBase,MIMEBase继承自Message。他们都没有自己定义方法,都是用Message的。MIMEMultipart可以通过attach添加多个MIME的文件。所以用它添加附件
2. 不同附件文件类型不同,head里面有个Content-Disposition的选项,可以设置文件类型。要上传不同文件类型,就要让python通过mimestypes.guess_type()识别文件类型
3. 读取二进制文件的时候,打开方式要为"rb",因为可能会有和EOF编码相同的字节。这样python认为找到了文件的结尾,停止读入。
4. lambda: 随时定义一个函数,避免许多单行的函数定义
下面看代码吧
__author__ = 'MrChen'
import smtplib, mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
msg = MIMEMultipart('alternative')
msg['From'] = "xxxxxxxx@163.com"
msg['To'] = 'xxxxxxxx@qq.com'
msg['Subject'] = 'Email for testing'
#添加邮件内容
text = MIMEText('content')
msg.attach(text)
#添加二进制附件
fileName = r'C:\Users\a\Pictures\lovewallpaper\001.jpg'#选择你自己的文件
fileType, encoding = mimetypes.guess_type(fileName)
if fileType is None or encoding is not None:
fileType = 'application/octet-stream'
print(fileType, encoding)
maintype, subtype = fileType.split('/', 1)
att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype)
#发送的文件名需要把路径去掉,给别人的邮件没必要让别人看到