smtplib & email
■ 概述
发邮件主要用到smtplib以及email模块。stmplib用于邮箱和服务器间的连接,发送的步骤。email模块主要用于处理编码,邮件内容等等。主要是参考了那个发报表的脚本,简单记录了下最简单的用法,没啥参考价值= =
■ smtplib基本用法
smtp = smtplib.SMTP() #建立smtp对象 smtp.connect('server',port) #建立与smtp服务器的连接 smtp.login('user','password') smtp.sendmail('sender','receiver','content') smtp.quit()
*在sendmail中,sender只是名义上的发送人,只是上っ面的な东西。当sender和user不一致的时候,邮件里就会显示邮件有sender转发。
*sender要老老实实写xxxx@xx.xx的格式。receiver可以有多个,以一个列表形式传入参数即可。content这里若不是MIME对象而是单纯的字符串的话不会报错,但是服务器也不会发邮件的。
*receiver是收件邮箱(当多个收件人时应该是各个收件地址组成的列表)
*content就是email模块做文章的地方了
■ email模块基本用法
email模块主要用到了email.mime.text.MIMEText , email.mime.multipart.MIMEMultipart , email.mime.image.MIMEImage等 *一些python版本中也有from email import MIMEText,中间没有mime
对于文本类型的文件:
msg = MIMEText('some content','plain','编码') msg['Subject'] = '...' msg['From'] = '...' #这里可以瞎填,可以认为是内容的一部分,不影响发送操作本身,但是有一些邮件服务提供商可能会因为识别垃圾邮件等策略上的原因而不发送没通过验证的From项。 msg['To'] = '...' #接收方有多个是可用逗号分隔开
额外提一下,msg['From']这里的话建议写成"Some_Alias<realaddress@domain.com>"这样的形式,这样的话大多邮件服务器都可以把alias(发送人的别名)和真的发送地址给分别解析出来。
msg['To']中将多个收件人通过英文逗号分开可以在邮件中正确显示多个收件人。但是实际是发送给几个收件人并不是这里决定,而是sendmail方法的receiver参数决定,那个参数需要是个列表。也就是msg['To'].split(',')
最后,在sendmail中参数要的是string或者buffer,所以最后传给它的参数不是msg本身而是msg.as_string()
*如果要发html的话就把MIMEText的参数plain换成html就好了
如果要添加附件,那么就要把上面的msg创建为MIMEMultipart(),然后用msg.attach(...)方法来附上包括附件在内的各个元素,包括文本,附件文件,图片等
attach的参数是attachment,其创建方法如下:
attachment = MIMEText(open("附件文件","rb").read(),'base64','utf-8') attachment.add_header('Content-Disposition','attachment',filename='...') #这一步不能少,否则看邮件大小附件被包括进去了但是附件显示不出来。Content-Disposition和attachment两个暂时そのまま不要动。。 msg.attach(attachment) msg.attach(MIMEText('...','plain','utf-8')) #添加邮件的文本部分
同时也别忘了设置msg[那几个属性]以及最后要msg.as_string()用于发出邮件
需要注意,add_header中的几个参数尽量保证是str类型的,包括带有中文的文件名,可能的话尽量转化成utf-8格式的字符串,否则发出的邮件附件名可能不符合预期