记住用户名密码
一、SMTPLIB服务配置
本章以QQ邮箱为例,其他类型的邮箱都可以参照QQ邮箱的模式,但是设置上需要自行网上查询一下即可。
开启流程:
进入邮箱——进入设置——找到第三方服务——将IMAP/SMTP服务开启(需要验证码进行验证)——生成授权码(开启服务后默认会生成授权码)
开启服务,获得授权码之后,才可以通过代码的形式来进行邮件的发送
二、各类邮件发送实现
SMTPLIB是在python中实现邮件的编码形态发送的库。可以通过代码直接连接到指定邮箱,进行各类邮件的发送。SMTPLIB也是官方自带库,直接导入使用即可。
1.发送文本格式的内容
import smtplib from email.header import Header from email.mime.text import MIMEText # 1. 配置邮箱信息 sender = '333333@qq.com' # 发件人 receiver = '333333@qq.com' # 收件人 pass_code = 'vtukpynskaeaeaff' # 授权码:是发件人的授权码,也就是你之前开启SMTP服务时返回的字符串 # 2. 邮箱服务连接 conn = smtplib.SMTP('smtp.qq.com', 25) # qq邮箱的smtp服务地址:smtp.qq.com,默认端口:25 # 3. 邮件内容的定义 text = '这是一封普通的文本邮件' # 邮件正文,信 content = MIMEText(text, 'plain', 'utf-8') # 实现邮件发送的内容定义,信封 # 4. 定义收件人与发件人,邮件主题等相关信息 content['From'] = sender # 发件人 content['To'] = receiver # 收件人 # 添加邮件的主体 email_theme = '这是这份信的主题' content['Subject'] = Header(email_theme, 'utf-8') # 实现邮件主题的添加。 # 5. 发送邮件 conn.login(sender, pass_code) # 登录smtp服务,是用账号与授权码,而不是账号与密码。 conn.sendmail(sender, receiver, content.as_string()) # 邮件发送 # 6.关闭smtp服务 conn.close()
import smtplib from email.header import Header from email.mime.text import MIMEText # 1. 配置邮箱信息 sender = '333333@qq.com' # 发件人 receiver = '333333@qq.com' # 收件人 pass_code = 'vtukpynskaeaeaff' # 授权码:是发件人的授权码,也就是你之前开启SMTP服务时返回的字符串 # 2. 邮箱服务连接 conn = smtplib.SMTP('smtp.qq.com', 25) # qq邮箱的smtp服务地址:smtp.qq.com,默认端口:25 # 3. 邮件内容的定义 # 邮件正文,html内容 html = ''' <p>这是hzp的html邮件内容</p> <p><a href="http://www.baidu.com">百度地址</a></p> rel="nofollow" ''' content = MIMEText(html, 'html', 'utf-8') # 实现邮件发送的内容定义,信封,因为是html内容,所以将plain改为html # 4. 定义收件人与发件人,邮件主题等相关信息 content['From'] = sender # 发件人 content['To'] = receiver # 收件人 # 添加邮件的主题 email_theme = '这是这份信的主题' content['Subject'] = Header(email_theme, 'utf-8') # 实现邮件主题的添加。 # 5. 发送邮件 conn.login(sender, pass_code) # 登录smtp服务,是用账号与授权码,而不是账号与密码。 conn.sendmail(sender, receiver, content.as_string()) # 邮件发送 # 6.关闭smtp服务 conn.close()
import smtplib from email.header import Header from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 1. 配置邮箱信息 sender = '333333@qq.com' # 发件人 receiver = '333333@qq.com' # 收件人 pass_code = 'vtukpynskaeaeaff' # 授权码:是发件人的授权码,也就是你之前开启SMTP服务时返回的字符串 # 2. 邮箱服务连接 conn = smtplib.SMTP('smtp.qq.com', 25) # qq邮箱的smtp服务地址:smtp.qq.com,默认端口:25 # 3. 邮件内容的定义 # 创建一个带有附件的邮件对象:相当于快递箱子 email = MIMEMultipart() # 邮件正文 html = '这是带有附件的邮件内容' content = MIMEText(html, 'plain', 'utf-8') # 实现邮件发送的内容定义,信封 # 将邮件正文添加到邮件中 email.attach(content) # 附件的定义:通过附件对象来设置,如果附件对象的设置不完整,会出现文件内容乱码以及文件名称乱码的情况。filename指的是在邮件中,附件的名字。 att = MIMEText(open('./attach/1.png', 'rb').read(), 'base64', 'utf-8') att.add_header('Content-Type', 'octet-stream') att.add_header('Content-Disposition', 'attachment', filename='hzp.png') # 将附件添加到邮件中 email.attach(att) # 4. 定义收件人与发件人,邮件主题等相关信息 email['From'] = sender # 发件人 email['To'] = receiver # 收件人 # 添加邮件的主题 email_theme = '这是这份信的主题' email['Subject'] = Header(email_theme, 'utf-8') # 实现邮件主题的添加。 # 5. 发送邮件 conn.login(sender, pass_code) # 登录smtp服务,是用账号与授权码,而不是账号与密码。 conn.sendmail(sender, receiver, email.as_string()) # 邮件发送:发的是快递,和上面不同 # 6.关闭smtp服务 conn.close()
可以发送多个附件 ,每个附件的发送方式都是一样的,将att这一块复制一下,取个其他的名字,就可以实现多个附件的发送。
在实际的测试工作之中,为了实现不同的场景的应用,上面的三种发送邮件的方式可以进行封装成三个函数的形式,这样在使用的时候就不会这么麻烦。
三、配置项设置
除了日志文件的配置内容以外,其余的配置都可以写到一个配置文件中,这样方便进行管理。
读取配置项通过configparser()来实现,解决路径问题可以通过pathlib库实现。
关于文件路径的问题,可以全部通过pathlib库来实现,相对而言会更加的方便。不用再考虑去计算当前运行文件的路径关系了。
1.配置文件的定义和使用
配置项文件可以这样写(主要用于管理发件人和收件人):
配置文件的内容读取,一般会通过定义函数的形式来实现,这样可以提高代码的复用性:
import configparser def read_conf(): # 创建conf对象 conf = configparser.ConfigParser() # 指定ini文件,进行内容的读取 conf.read('./email_conf.ini') # 通过items将内容一次性全部获取,默认是list格式,每一组数据都是元组。为了方便操作可以转型为字典格式 values = dict(conf.items('email')) return values
然后通过调用函数,里实现文本邮件的发送:
import smtplib from email.header import Header from email.mime.text import MIMEText # 1. 配置邮箱信息 # sender = '2314419713@qq.com' # 发件人 # receiver = '2314419713@qq.com' # 收件人 # pass_code = 'vtukpynskaeaeaff' # 授权码:是发件人的授权码,也就是你之前开启SMTP服务时返回的字符串 # 通过调用函数来实现文本邮件的发送 data = read_conf() sender = data['sender'] #发件人 receiver = data['receiver'] #收件人 pass_code = 'vtukpynskaeaeaff' # 授权码 # 2. 邮箱服务连接 conn = smtplib.SMTP('smtp.qq.com', 25) # qq邮箱的smtp服务地址:smtp.qq.com,默认端口:25 # 3. 邮件内容的定义 text = '这是一封普通的文本邮件' # 邮件正文,信 content = MIMEText(text, 'plain', 'utf-8') # 实现邮件发送的内容定义,信封 # 4. 定义收件人与发件人,邮件主题等相关信息 content['From'] = sender # 发件人 content['To'] = receiver # 收件人 # 添加邮件的主体 email_theme = '这是这份信的主题' content['Subject'] = Header(email_theme, 'utf-8') # 实现邮件主题的添加。 # 5. 发送邮件 conn.login(sender, pass_code) # 登录smtp服务,是用账号与授权码,而不是账号与密码。 conn.sendmail(sender, receiver, content.as_string()) # 邮件发送 # 6.关闭smtp服务 conn.close()
当需要修改任何的发件人或者收件人的时候,
只需要将配置文件email_conf.ini中的sender和receiver进行修改即可
2.解决配置文件的路径问题
当运行的py文件和配置文件不在同一个路径下的时候后,在封装的函数read_conf()中的这个地方就会报错:conf.read('./email_conf.ini')
最简单的的方式,就是将这个路径变为一个参数path
import configparser def read_conf(path): # 创建conf对象 conf = configparser.ConfigParser() # 指定ini文件,进行内容的读取 conf.read(path) # 通过items将内容一次性全部获取,默认是list格式,每一组数据都是元组。为了方便操作可以转型为字典格式 values = dict(conf.items('email')) return values
然后在运行文件中,直接传入path的值就可以了,例如:
import smtplib from email.header import Header from email.mime.text import MIMEText # 1. 配置邮箱信息 # sender = '2314419713@qq.com' # 发件人 # receiver = '2314419713@qq.com' # 收件人 # pass_code = 'vtukpynskaeaeaff' # 授权码:是发件人的授权码,也就是你之前开启SMTP服务时返回的字符串 # 通过调用函数来实现文本邮件的发送 data = read_conf('../email_conf.ini') # 这个地方调用的时候传入路径值,就可以解决路径问题 sender = data['sender'] #发件人 receiver = data['receiver'] #收件人 pass_code = 'vtukpynskaeaeaff' # 授权码 # 2. 邮箱服务连接 conn = smtplib.SMTP('smtp.qq.com', 25) # qq邮箱的smtp服务地址:smtp.qq.com,默认端口:25 # 3. 邮件内容的定义 text = '这是一封普通的文本邮件' # 邮件正文,信 content = MIMEText(text, 'plain', 'utf-8') # 实现邮件发送的内容定义,信封 # 4. 定义收件人与发件人,邮件主题等相关信息 content['From'] = sender # 发件人 content['To'] = receiver # 收件人 # 添加邮件的主体 email_theme = '这是这份信的主题' content['Subject'] = Header(email_theme, 'utf-8') # 实现邮件主题的添加。 # 5. 发送邮件 conn.login(sender, pass_code) # 登录smtp服务,是用账号与授权码,而不是账号与密码。 conn.sendmail(sender, receiver, content.as_string()) # 邮件发送 # 6.关闭smtp服务 conn.close()
import pathlib file_path = pathlib.Path(__file__)
整体代码如下:
import configparser import pathlib def read_conf(): # 获取当前文件的路径 file_path = pathlib.Path(__file__) # pathlib.Path(__file__)等同于D:\pyworkspace\python_class_hcc_v1\class10\email_conf.ini # 获取当前文件的上级目录,通过parents属性来获取上级目录,想要获得哪一个层级,则通过下标来指示,0为上一级,1为上一级的上一级,以此类推 dir = file_path.parents[0].resolve() # path是路径对象,不是字符串,所以想要在原有的路径上进行增加,则直接添加路径即可 # 因为是路径对象,所以想要指定文件来获取,则直接在路径对象后添加路径即可,注意,这里不是字符串 path = dir / 'email_conf.ini' # 创建conf对象 conf = configparser.ConfigParser() # 指定ini文件,进行内容的读取 conf.read(path) # 完整路径应该是python_class_hcc_v1/class10/email_conf.ini # 通过get来获取配置文件中的内容,需要传入section和option两个参数 # value = conf.get('email', 'sender') # value1 = conf.get('email', 'receiver') # 通过items将内容一次性全部获取,默认是list格式,每一组数据都是元组。为了方便操作可以转型为字典格式 values = dict(conf.items('email')) return values
四、总结
本章主要学习了通过python中的SMTPLIB库来发送邮件的三种场景,分别是发送文本信息、发送html、发送附件这三种。
在发送邮件之前,可以进行配置文件的设置,便于管理发件人和收件人信息。将读取配置文件的过程进行函数的封装,然后直接再直接调用函数进行发送邮件。
在发送的过程中可能会因为ini文件的所在位置问题,导致封装的函数在读取路径的时候出现识别不到配置文件的问题,所以这里提供了两个解决方法:
方法一:将封装的函数中的路径,改为path变量。然后调用封装的函数的时候,直接传入一个路径的参数,完美解决此问题。
方法二:使用python自带的官方库pathlib库,调用pathlib.Path(__file__)这个方法获取当前文件的绝对路径。然后通过parents属性来获取上级目录,想要获得哪一个层级,则通过下标来指示,0为上一级,1为上一级的上一级,以此类推。然后在后面加上路径/ 'email_conf.ini',即可生成ini文件所在的路径。
————————————————
版权声明:本文为CSDN博主「测试小咖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huang_zp123/article/details/130178543
目前有 0 条留言 其中:访客:0 条, 博主:0 条