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

时间:2024-01-27 10:28:37

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

邮件发送:使用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()

#以上为发送邮件和退出邮箱