第11章:python自动化——SMTP库实现邮件发送

目录

一、SMTPLIB服务配置

二、各类邮件发送实现

1.发送文本格式的内容 

2.发送HTML格式的内容

3.发送附件格式的内容

三、配置项设置

1.配置文件的定义和使用

2.解决配置文件的路径问题

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

四、总结


一、SMTPLIB服务配置

本章以QQ邮箱为例,其他类型的邮箱都可以参照QQ邮箱的模式,但是设置上需要自行网上查询一下即可。

开启流程:

进入邮箱——进入设置——找到第三方服务——将IMAP/SMTP服务开启(需要验证码进行验证)——生成授权码(开启服务后默认会生成授权码)

开启服务,获得授权码之后,才可以通过代码的形式来进行邮件的发送

二、各类邮件发送实现

SMTPLIB是在python中实现邮件的编码形态发送的库。可以通过代码直接连接到指定邮箱,进行各类邮件的发送。SMTPLIB也是官方自带库,直接导入使用即可。

1.发送文本格式的内容 

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服务时返回的字符串

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

发送效果如下:

2.发送HTML格式的内容

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

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服务时返回的字符串

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

发送的效果如下:

3.发送附件格式的内容

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

import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 1. 配置邮箱信息
sender = '2314419713@qq.com'  # 发件人
receiver = '2314419713@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()

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文件所在的路径。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值