关于邮件发送,只看这一篇就够了!!!

关于邮件发送,只看这一篇就够了!!!

邮件发送:使用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.使用邮箱账号密码登录

通过账号和密码登录邮箱;填写收件人

  1. 来看登录邮箱的代码:

    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()

#以上为发送邮件和退出邮箱
posted @ 2020-07-28 20:47  Miss诗和远方的高山  阅读(1266)  评论(2编辑  收藏  举报