• Linux
  • apache
  • centos
  • Git版本管理
  • Linux基本命令
  • linux配置与优化
  • Nginx
  • PHP
  • Redis
  • Supervisor
  • Swoole
  • windows
  • THINKPHP
  • 开发者手册
  • Chat GPT / Open Ai
  • python自动化——SMTP库实现邮件发送

    全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:925篇文章
  • 发布时间:2023年12月10日 21:50:27
  • 所属分类:python3
  • 阅读次数:192次阅读
  • 标签:
  • 一、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> 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()

    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 条

    给我留言

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