python的smtplib模块是一个强大的电子邮件处理模块,Python 2.3或更高版本默认自带smtplib模块,无需额外安装。
SMTP类定义:smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
,作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。host参数为远程smtp主机地址,比如smtp.163.com;port为连接端口,默认为25;local_hostname的作用是在本地主机的FQDN(完整的域名)发送HELO/EHLO(标识用户身份)指令,timeout为连接或尝试在多少秒超时。SMTP类具有如下方法:
SMTP.connect([host[, port]])
方法,连接远程smtp主机方法,host为远程主机地址,port为远程主机smtp端口,默认25,也可以直接使用host:port形式来表示,例如:SMTP.connect(“smtp.163.com”,“25”)。
SMTP.login(user, password)
方法,远程smtp主机的校验方法,参数为用户名与密码,如SMTP.login(“python_2014@163.com”,“sdjkg358”)。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
方法,实现邮件的发送功能,参数依次为是发件人、收件人、邮件内容,例如:SMTP.sendmail(“python_2014@163.com”,“demo@domail.com”,body)
,其中body内容自定义。
SMTP.starttls([keyfile[, certfile]])
方法,启用TLS(安全传输)模式,所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要启动此项才能正常发送邮件,如SMTP.starttls()。
SMTP.quit()
方法,断开smtp服务器的连接。
MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)
作为一种新的扩展邮件格式支持在邮件主体中会包含HTML、图像、声音以及附件格式等。
下面介绍几个Python中常用的MIME实现类:
email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
,作用是生成包含多个部分的邮件体的MIME对象,参数_subtype指定要添加到”Content-type:multipart/subtype”报头的可选的三种子类型,分别为mixed、related、alternative,默认值为mixed。定义mixed实现构建一个带附件的邮件体;定义related实现构建内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮件体。
email.mime.audio.MIMEAudio (_audiodata[, _subtype[, _encoder[, **_params]]])
,创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。
email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
,创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。
email.mime.text.MIMEText (_text[, _subtype[, _charset]])
,创建包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。
下面以示例进行说明,以下都是在python3下测试过:
1,纯文本格式的邮件
<code> #!/usr/bin/python #coding: utf-8 import smtplib from email.mime.text import MIMEText ''' 发送纯文本格式的邮件 www.tianfeiyu.com ''' From = 'xxxxxx@163.com' To = 'xxxxxx@qq.com' subject = 'python email test' username = 'xxxxxx@163.com' #邮箱用户名 password = 'xxxxxx' #邮箱密码 #邮件内容 msg = MIMEText(''' 你好, 这是一封自动发送的邮件。 www.tianfeiyu.com ''') msg['Subject'] = subject #邮件主题 msg['From'] = From #发件人,邮件头部可见 msg['To'] = To #收件人,邮件头部可见 try: smtp = smtplib.SMTP() #创建一个smtp对象 smtp.connect('smtp.163.com') #通过connect方法连接smtp主机 #smtp.starttls() #启动安全传输模式,使用gmail需要 #smtp.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息 smtp.login(username, password) #邮件账号登录校验 smtp.sendmail(From, To, msg.as_string()) #邮件发送 smtp.quit() #断开smtp连接 print('邮件发送成功!') except Exception as e: print('邮件发送失败!'+str(e)) </code>
2,html格式的邮件
<code> #!/usr/bin/python #coding: utf-8 import smtplib from email.mime.text import MIMEText ''' 定义html格式并进行邮件群发 www.tianfeiyu.com ''' From = 'xxxxxx@163.com' To = [ 'xxxxxx@qq.com', 'xxxxxx@qq.com' ] #定义群组 subject = 'python email test' username = 'xxxxxx@163.com' password = 'xxxxxx' msg = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8') #html格式 msg['Subject'] = subject msg['From'] = From for to in To: msg[to] = to try: smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(From, To, msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败!'+str(e)) </code>
3,带图片的邮件
<code> #!/usr/bin/python #coding: utf-8 ''' 带图片的邮件 www.tianfeiyu.com ''' import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage From = 'xxxxxx@163.com' To = 'xxxxxx@qq.com' subject = 'python email test' username = 'xxxxxx@163.com' password = 'xxxxxx' msg = MIMEMultipart('related') #默认为fixed,创建MIMEMutipart对象,采用related定义的内嵌资源的邮件体 msgtxt = MIMEText('</pre><h1>你好</h1><pre>','html','utf-8') msg.attach(msgtxt) msg['Subject'] = subject msg['From'] = From msg['To'] = To fp = open('/tmp/centos.jpg','rb') msgimage = MIMEImage(fp.read()) fp.close() msgimage.add_header('Content-ID','') #指定图片文件的Content-ID,<img>标签src用到,此处为空 msg.attach(msgimage) try: smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(From, To, msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败!'+str(e)) </code>
4,带附件的邮件
<code> #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage ''' 带附件(图片和文件)的邮件 www.tianfeiyu.com ''' From = 'xxxxxx@163.com' To = 'xxxxxx@qq.com' subject = 'python email test' username = 'xxxxxx@163.com' password = 'xxxxxx' msg = MIMEMultipart('related') #默认为fixed,创建MIMEMutipart对象,采用related定义的内嵌资源的邮件体 html = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8') #html格式 msg.attach(msgtxt) msg['Subject'] = subject msg['From'] = From msg['To'] = To image = MIMEText(open('/tmp/centos.jpg','rb').read(),'base64','utf-8') image["Content-Type"] = 'application/octet-stream' #指定文件格式类型 image["Content-Disposition"] = 'attachment; filename="centos.jpg"' #指定Content-Disposition值为 #attachment则出现下载保存对话框,保存的默认文件名使用 #filename指定 image["Content-Disposition"] = 'attachment; filename="file"' msg.attach(image) try: smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(From, To, msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败!'+str(e)) </code>
5,多种格式混合都包含的
<code> #!/usr/bin/python #coding:utf-8 ''' 包含各种元素的邮件 www.tianfeiyu.com ''' import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage From = 'xxxxxx@163.com' To = 'xxxxxx@qq.com' subject = 'python email test' username = 'xxxxxx@163.com' password = 'xxxxxx' msg = MIMEMultipart('alternative') text = MIMEText('你好,我是田飞雨! www.tianfeiyu.com','plain','utf-8') #文件格式 html = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8') #html格式 msg.attach(text) msg.attach(html) msg['From'] = From msg['To'] = To msg['subject'] = subject file = MIMEText(open('/tmp/file','rb').read(),'base64','utf-8') #文件附件 file['Content-Type'] = 'application/octet-stream' file['Content-Disposition'] = 'attachment;filename=file' image = MIMEImage(open('/tmp/centos.jpg','rb').read()) #图片 image.add_header('Content-ID','') msg.attach(file) msg.attach(image) try: smtp = smtplib.SMTP() smtp.connect('smtp.163.com','25') smtp.login(username,password) smtp.sendmail(From,To,msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败!'+str(e)) </code>