python自动化——SMTP库实现邮件发送

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:925篇文章
  • 发布时间:2023年12月10日 21:50:27
  • 所属分类:python3
  • 阅读次数:191次阅读
  • 标签:

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

image.png

2.发送HTML格式的内容

发送html格式的邮件:与文本邮件发送形式类似,
只是邮件正文内容的变化与设置的变化即可发送成。

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

image.png

3.发送附件格式的内容

发送带有附件的邮件内容,需要注意附件的发送与普通html和文本邮件发送会有不同,附件也可以添加多个,每个附件的添加调用的方法和内容都是一样的。

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.配置文件的定义和使用

配置项文件可以这样写(主要用于管理发件人和收件人):

image.png

配置文件的内容读取,一般会通过定义函数的形式来实现,这样可以提高代码的复用性:

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

3.通过pathlib库解决配置文件的路径问题

pathlib库可以获取当前文件的路径,使用方法如下

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)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!