本文链接:http://www.juzicode.com/archives/1381
在《Python进阶教程m9–网络通信–socket通信》中介绍了在Python中利用socket模块实现tcp或者udp方式进行网络通信的方法,socket模块可以看做在TCP/IP协议中传输层提供了编程接口,应用层的协议需要自己进行定义,比如在《Python进阶教程m9–网络通信–socket通信》一文中客户端和服务端互发消息的例子中,客户端每次发送消息给服务端,服务端又将该消息返回,就是是一种应用层协议。虽然使用socket编程相对来说比较灵活,但是需要用户设计应用层协议。
好在Python的标准库里已经造好了很多可用的“轮子”,我们直接拿来用就行了,比如常用的ftp,telnet,smtp等都有现成的库,不需要我们自己重头开始写。这类库文件可以看做在TCP/IP的应用层为我们提供了网络编程接口,这篇文章我们就来介绍下smtplib库怎么发送邮件。
1、准备
用Python发送邮件,需要用到email模块来构造邮件,注意email模块仅仅只是用来构造邮件,并不能发送邮件,而是使用smtplib发送邮件。
我们可以借助现有的邮箱实现smtp发送邮件,这里以163邮箱为例,进入到163邮箱的设置页面,开启stmp功能,并且设置好授权码,这个授权码就是利用smtp发送邮件的密码。
需要导入的模块有emai和smtplib,都已集成在Python标准库中:
from email.header import Header
from email.utils import parseaddr, formataddr
from email.mime.text import MIMEText
import smtplib
2、利用email构造邮件内容
首先用input命令输入发件人、发件人邮件密码、收件人:
#设置邮箱地址、密码
from_addr = input('输入发件人: ')
password = input('发件人邮箱密码: ')
to_addr = input('输入收件人: ')
然后利用email模块构造邮件内容,首先利用MIMEText()构造email实例,其中第1个入参为邮件内容,_subtype可以使用默认的‘plain’,_charset=‘utf-8’设置使用的字符集:
mail_cont='你好Tom, 学习Python推荐你关注桔子code公众号'
mime = MIMEText(mail_cont, _subtype='plain', _charset='utf-8')
利用email模块的Hearder()构造邮件主题:
mime['Subject'] = Header('欢迎关注公众号: 桔子code', 'utf-8').encode()
然后利用email模块的parseaddr()和formataddr()方法构造邮件收发人信息,
name, addr = parseaddr('Jerry <%s>' % from_addr)
mime['From'] = formataddr((Header(name, 'utf-8').encode(), addr))
name, addr = parseaddr('Tom <%s>' % to_addr)
mime['To'] = formataddr((Header(name, 'utf-8').encode(), addr))
3、利用smtplib发送邮件
首先在163邮箱中找到smtp服务器名称:
#设置163邮箱smtp服务器
smtp_server = 'smtp.163.com'
然后创建smtp实例,第一个入参为smtp服务器地址,第2个入参为smtp默认使用的端口号;同时可以设置调试信息等级,等级越高在命令行看到的调试信息越多:
#创建smtp服务实例
smtp = smtplib.SMTP(smtp_server, 25)
smtp.set_debuglevel(2)
最后就是登录邮箱、发送邮件、关闭连接:
#登录
smtp.login(from_addr, password)
#发送邮件
smtp.sendmail(from_addr, [to_addr], mime.as_string())
#关闭
smtp.quit()
至此一封纯文本邮件就发送出去了,进入到收件人邮箱,看到的效果是这样的:
这篇文件介绍了如何利用email模块构造邮件,并使用smtplib模块发送邮件的步骤。接收邮件则会用到poplib模块,同时使用email解析邮件内容。
梳理的简单明了,先够造邮件内容再发送邮件