关于邮件发送,只看这一篇就够了!!!
邮件发送:使用smtplib、email库来发送邮件
1.发送邮件的步骤:
2.具体步骤实施
1.以qq邮箱为例,先来看第0步:连接服务器。
连接服务器需要用到smtplib
库。为什么叫这个名字呢?其实,SMTP
代表简单邮件传输协议,相当于一种计算机之间发邮件的约定。具体怎么用smtplib
库来连接服务器:
import smtplib
#smtplib是python的一个内置库,所以不需要用pip安装
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上,地址需要是字符串的格式。
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号
-
解释一下:第1行代码是引入库,第5行代码"mailhost='smtp.qq.com'"是qq邮箱的服务器地址,这个地址是可以通过搜索引擎查到的。
-
第9行代码"qqmail = smtplib.SMTP()"是实例化了一个
smtplib
里的SMTP
对象; -
第13行代码"qqmail.connect(mailhost,25)"是用SMTP对象的
connect()
方法连接服务器,第一个参数是获取到的服务器地址,第二个参数是SMTP端口号——25
。
端口号的选择不是唯一的,但是25
是一个最简单、最基础的端口号,所以我们填25
。
2.使用邮箱账号密码登录
通过账号和密码登录邮箱;填写收件人
-
来看登录邮箱的代码:
import smtplib #smtplib是python的一个内置库,所以不需要用pip安装 mailhost='smtp.qq.com' #把qq邮箱的服务器地址赋值到变量mailhost上 qqmail = smtplib.SMTP() #实例化一个smtplib模块里的SMTP类的对象,这样就可以SMTP对象的方法和属性了 qqmail.connect(mailhost,25) #连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号。 sender = input('请输入你的邮箱:') #获取邮箱账号 password = input('请输入你的密码:') #获取邮箱密码 qqmail.login(sender,password) #登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码 receiver=input('请输入收件人的邮箱:') #获取收件人的邮箱
-
解释一下从14行新增的代码"sender = input('请输入你的邮箱:')":第14行是用
input()
获取邮箱账号。第17行是用input()
获取邮箱密码,但注意了,这里可不是你平时登录邮箱的密码!这个密码需要我们去到这里获取:请打开https://mail.qq.com/,登录你的邮箱。然后点击位于顶部的【设置】按钮,选择【账户设置】,然后下拉到这个位置。
-
就像上面的一样,把首个SMTP服务开启。这时,QQ邮箱会提供给你一个授权码,注意保护好你的授权码:
接下来,在你使用SMTP服务登录邮箱时,就可以输入这个授权码作为密码登录了。
3.填写收件人、主题、撰写正文
填写主题和撰写正文,在这里需要用到email
库。来看用法:
from email.mime.text import MIMEText
from email.header import Header
#引入Header和MIMEText模块
content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#用input()获取邮件主题
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边,是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']
解释一下:
- 第1行和第3行代码是引入了
email
库中的MIMEText
模块和Header
模块。 - 第9行代码"content=input('请输入邮件正文:')"是用
input()
函数获取邮件正文,第13行代码是实例化一个MIMEText
的邮件对象,这样我们就构造了一个纯文本邮件了。 - 这个
MIMEText
对象有三个参数,一个是邮件正文;另一个是文本格式,一般设置为plain
纯文本格式(当然如果邮件内容中带有格式,例如表格,添加一些代码就可以了);最后一个是编码,设置为utf-8
,因为utf-8是最流行的万国码。 - 第17行代码"subject = input('请输入你的邮件主题:')",是用
input()
函数获取邮件主题,第21行代码"message['Subject'] = Header(subject, 'utf-8')"比较重要,我们仔细讲解一下:message['Subject'] = Header(subject, 'utf-8')
,等号右边是实例化了一个Header
邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码。等号左边的message['Subject']
的变量是一个a['b']
的代码形式,它长得特别像字典根据键取值的表达,但是这里的message
是一个MIMEText
类的对象,并不是一个字典,那message['Subject']
是什么意思呢?其实,字典和类在结构上,有相似之处。请看下图:
字典里面的元素是【键】和【值】一一对应,而类里面的【属性名】和【属性】也是一一对应的。我们可以根据字典里的【键】取到对应的【值】,同样的,也可以根据类里面的【属性名】取到【属性】。所以message['Subject']
就代表着根据MIMEText类里面的Subject
的属性名取到该属性。需要注意的是,不是每一个类都可以这样访问其属性的,之所以能这样访问是因为这个MIMEText
的类实现了这个功能。所以,message['Subject'] = Header(subject, 'utf-8')
就是在为message['Subject']
这个属性赋值
4.发送邮件和退出邮箱
import smtplib
#smtplib是python的一个内置库,所以不需要用pip安装
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号
#以上,皆为连接服务器的代码
sender = input('请输入你的邮箱:')
#获取邮箱账号
password = input('请输入你的密码:')
#获取邮箱密码
qqmail.login(sender,password)
#登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
receiver=input('请输入收件人的邮箱:')
#获取收件人的邮箱
from email.mime.text import MIMEText
from email.header import Header
#引入Header和MIMEText模块
content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#用input()获取邮件主题
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边,是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']
qqmail.sendmail(sender, receiver, message.as_string())
#发送邮件,调用了sendmail()方法,写入三个参数,分别是发件人,收件人,和字符串格式的正文
qqmail.quit()
#退出邮箱
解释一下:
-
第65行代码"qqmail.sendmail(sender, receiver, message.as_string())"的意思是调用
sendmail()
发送邮件,括号里面有三个参数,第1个是发件人的邮箱地址,第2个是收件人的邮箱地址,第3个是正文,但必须是字符串格式,所以用as_string()
函数转换了一下。 -
但是我们希望发送成功后能显示“邮件发送成功”,失败的时候能提示我们“邮件发送失败”,可以使用
try
语句来实现。 -
try: qqmail.sendmail(sender, receiver, message.as_string()) print ('邮件发送成功') except: print ('邮件发送失败') qqmail.quit()
5.完整的代码
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#引入smtplib、MIMETex和Header
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上,地址应为字符串格式
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以调用SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号。
#以上,皆为连接服务器。
sender = input('请输入你的邮箱:')
#获取邮箱账号,为字符串格式
password = input('请输入你的密码:')
#获取邮箱密码,为字符串格式
qqmail.login(sender,password)
#登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
#以上,皆为登录邮箱。
receiver=input('请输入收件人的邮箱:')
#获取收件人的邮箱。
content=input('请输入邮件正文:')
#输入你的邮件正文,为字符串格式
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#输入你的邮件主题,为字符串格式
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']。
#以上,为填写主题和正文。
try:
qqmail.sendmail(sender, receiver, message.as_string())
print ('邮件发送成功')
except:
print ('邮件发送失败')
qqmail.quit()
#以上为发送邮件和退出邮箱