Like the metting of the seagulls and the waves we meet and come near. The seagulls fly off, the waves roll away and we depart. 我们如海鸥之于波涛相遇似的,遇见了,走近了。海鸥飞去,波涛滚滚地流开,我们也分别了。
模块简介
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。这里发送邮件使用了 smtplib 和 email 两个模块。
发送邮件常用的模块:
import smtplibfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart
### 语法简介
smtplib 模块为发送邮件提供了一种很方便的途径,它对 SMTP 协议进行了简单的封装。其定义的 SMTP 客户端会话对象可使用 SMTP 或 ESMTP 侦听器守护程序向任何互联网机器发送邮件。
创建 smtp 对象的方法是smtp=smtplib.SMTP([host [, port [, local_hostname]]])
,简单粗暴
host:SMTP 服务器主机,可指定 IP 或 域名,可选。
port:一般情况下默认端口号为25.
local_hostname:如果 SMTP 服务器在本机上运行,则只需指定服务器地址为 localhost 即可。
smtp 对象使用 sendmail 方法发送邮件:smtp.sendmail(sender, receivers, msg.as_string())
sender:发件人邮箱,字符串
receivers:收件人邮箱,列表
msg:特定格式的邮件
注意: msg是字符串,表示邮件内容。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要指定msg的格式。这个格式就是smtp协议中定义的格式。
发送文本格式邮件
这里使用新浪邮箱示例,QQ邮箱登录需要16位授权码,而且验证还过不去(lll¬ω¬)
import smtplibfrom email.mime.text import MIMETextfrom email.header import Headermail_host="smtp.sina.com" mail_user="yuwancumiana@sina.cn" mail_pass="" sender = 'yuwancumiana@sina.cn' receivers = ['moeext@gmail.com' ] message = MIMEText('从windows发来的一封测试信' , 'plain' , 'utf-8' ) message['From' ] = "yuwancumiana@sina.cn" message['To' ] = "鱼丸粗面" subject = '测试' message['Subject' ] = Header(subject, 'utf-8' ) try : smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25 ) smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print u"邮件发送成功" except smtplib.SMTPException as e: print "Error: cannot send my email" print e
接收到的邮件如图:
发送附件
import smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextSMTP_SERVER = 'smtp.sina.com' SMTP_PORT = 25 sender = 'yuwancumiana@sina.cn' recipient = 'moeext@gmail.com' msg = MIMEMultipart() msg['Subject' ] = 'Python 附件' msg['To' ] = recipient msg['From' ] = sender subject = 'Python annex' img = MIMEImage(open (r'img/girl.jpg' , 'rb' ).read(), _subtype='jpg' ) img.add_header('Content-Disposition' , 'attachment' , filename = 'Girl.jpg' ) msg.attach(img) part = MIMEText(open ('test.txt' ,'rb' ).read(), 'plain' ) part["Content-Disposition" ] = 'attachment; filename="test.txt"' part.set_payload("text annex" ) msg.attach(part) try : session = smtplib.SMTP() session.connect(SMTP_SERVER, 25 ) ''' session.ehlo() session.starttls() 以TLS加密方式传输,可选 session.ehlo() ''' session.login(sender, 'mq2020.' ) session.sendmail(sender, recipient, msg.as_string()) print u'发送成功' session.quit() except smtplib.SMTPException,e: print e
效果图:
发送 HTML 附件
这里使用的 HTML 是一个小爬虫爬到的数据,经简单包装后返回一个字符串,把字符串作为附件发送。
import sys import smtplib import tracebackimport make_html_bsfrom email.header import Headerfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText reload(sys) sys.setdefaultencoding('utf-8' ) mail_host="smtp.sina.com" mail_user="yuwancumiana@sina.cn" mail_pass="" sender = 'yuwancumiana@sina.cn' receivers = ['yuwancumian666@gmail.com' ,'2535257276@qq.com' ,'635936876@qq.com' ] mail = MIMEMultipart("mixed" ) mail['From' ] = "yuwancumiana@sina.cn" mail['To' ] = "鱼丸粗面" mail['Subject' ] = Header('福利' ,'utf-8' ) message = MIMEText("今日福利(windows)" , 'plain' , 'utf-8' ) mail.attach(message) try : html = make_html_bs.get_html().encode('utf-8' ) except Exception as e: print traceback.print_exc() sys.exit(u"loading pages failed..." ) HTML = MIMEText(html, _subtype='html' , _charset='utf-8' ) mail.attach(HTML) try : smtp = smtplib.SMTP() smtp.connect(mail_host) smtp.login(mail_user, mail_pass) smtp.sendmail(sender, receivers, mail.as_string()) smtp.close() print u"send mail success" except smtplib.SMTPException,e: print e
结果(你猜猜内容是啥😄):
总结
因为发送邮件的方式(不加密、SSL、TLS、)和类型(附件类型、附件头,附件内容)多种多样,邮件服务器总结起来也非常他喵的麻烦。我之前是做了不少的测试脚本,最后挑了一个经常用的。我对于这个 python 邮件的想法是:能用就成~O(∩_∩)O