100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)

文章目录

  • 专栏导读
  • 案例说明
  • 一、smtplib模块是什么?
    • 1.1 模块介绍
    • 1.2 SMTP参数说明
    • 1.3 SMTP常用方法
  • 二、email模块是什么?
    • 1.1 模块介绍
    • 1.2 常用类说明
  • 三、案例实战
    • 3.1 获取授权码
    • 3.2 代码步骤
    • 3.3 发送文本格式邮件
    • 3.4 发送图片格式邮件
    • 3.5 发送指定文件夹下所有内容

专栏导读

本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

案例说明

SMTP是一种用于发送电子邮件的协议,Python从2.3版本开始内置了对SMTP的支持。Python的SMTP支持主要依赖于smtplibemail两个模块。其中,email模块负责构建邮件内容,包括邮件头部信息和正文部分;而smtplib模块则负责发送邮件,通过它我们可以连接到SMTP服务器,并发送邮件。

本文以QQ邮箱为例,介绍如何使用Python发送不同类型的邮件。

一、smtplib模块是什么?

1.1 模块介绍

  • smtplib模块是Python标准库中的一个模块,用于发送电子邮件。它提供了一个简单的接口,可以用来连接到邮件服务器并发送电子邮件。通过smtplib模块,你可以轻松地创建和发送包含文本或附件的电子邮件。
  • smtplib模块的主要功能包括连接到邮件服务器、发送邮件、设置邮件主题、收件人、抄送、密送等信息。它还支持使用SMTP身份验证来发送邮件,并可以处理各种邮件服务器的不同设置和要求。
  • 在使用smtplib模块发送邮件时,你需要提供邮件服务器的地址、端口号,以及可能的登录凭据等信息。一旦连接到邮件服务器,你可以使用smtplib模块提供的方法来构建和发送邮件。

Python 3.x 版本中,smtplib模块已经包含在标准库中,无需额外安装,你可以在Python脚本中直接导入smtplib模块并开始使用:

import smtplib

1.2 SMTP参数说明

SMTP类是Python的smtplib模块中的一个重要类,它提供了与SMTP服务器进行交互的方法和功能。

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

参数说明:

  • host: 可选参数,表示SMTP服务器的主机名。如果未提供此参数,将使用默认的本地主机名来连接 SMTP 服务器。

  • port: 可选参数,表示SMTP服务器的端口号。如果未提供此参数,将使用标准的 SMTP 端口号 25。

  • local_hostname: 可选参数,用于标识客户端的主机名。通常情况下,你不需要提供这个参数,SMTP 类会尝试自动确定本地主机名。

  • timeout: 可选参数,表示连接超时时间,以秒为单位。如果未提供此参数,将使用默认的超时时间。

这些参数用于初始化 SMTP 连接,当你实例化 SMTP 对象时,可以根据需要传递这些参数来连接到指定的 SMTP 服务器。

1.3 SMTP常用方法

下面是SMTP类的基本定义和一些常用方法:

class SMTP:
    def __init__(self, host='', port=0, local_hostname=None, timeout=None, source_address=None):
        """
        初始化SMTP连接
        :param host: SMTP服务器的主机名
        :param port: SMTP服务器的端口号
        :param local_hostname: 本地主机名
        :param timeout: 连接超时时间
        :param source_address: 发送源地址
        """

    def connect(self, host='localhost', port=0):
        """
        连接到SMTP服务器
        :param host: SMTP服务器的主机名
        :param port: SMTP服务器的端口号
        """

    def starttls(self, keyfile=None, certfile=None, context=None):
        """
        将连接升级为TLS加密连接
        :param keyfile: 私钥文件
        :param certfile: 证书文件
        :param context: SSL上下文
        """

    def login(self, user, password, initial_response_ok=True):
        """
        登录到SMTP服务器
        :param user: 用户名
        :param password: 密码
        :param initial_response_ok: 初始响应是否OK
        """

    def sendmail(self, from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]):
        """
        发送邮件
        :param from_addr: 发件人地址
        :param to_addrs: 收件人地址列表
        :param msg: 邮件内容
        :param mail_options: 邮件选项
        :param rcpt_options: 接收选项
        """

    def quit(self):
        """
        退出SMTP会话
        """

以上是SMTP类的一些基本方法的定义。通过实例化SMTP类并调用这些方法,你可以连接到SMTP服务器,发送邮件,登录到服务器,将连接升级为TLS加密连接,并退出SMTP会话等。这些方法为你提供了与SMTP服务器进行交互的基本功能,使得你可以使用Python的smtplib模块来发送电子邮件。

二、email模块是什么?

1.1 模块介绍

Python的email模块是用于处理电子邮件的标准库模块,它提供了一系列的类和方法,用于创建、解析、操作和发送电子邮件。通过email模块,你可以轻松地构建各种类型的邮件,包括纯文本邮件、HTML邮件、带附件的邮件等。

1.2 常用类说明

在Python中,email模块提供了一些常用的类来处理邮件的构建和解析。以下是一些常用的类及其功能说明:

  1. email.message.Message类:

    • 用于表示邮件消息的基本类,可以用来创建新的邮件消息或解析现有的邮件消息。
    • 可以通过添加头部信息、设置正文内容等来构建邮件消息。
  2. email.mime.text.MIMEText类:

    • 用于表示文本类型的MIME邮件,可以处理纯文本邮件的创建和解析。
    • 可以设置文本内容、字符集等属性。
  3. email.mime.multipart.MIMEMultipart类:

    • 用于表示多部分邮件,可以包含多个子类型的邮件体,如文本、HTML、附件等。
    • 可以添加子类型的邮件体,并设置邮件的头部信息。
  4. email.mime.image.MIMEImage类:

    • 用于表示图像类型的MIME邮件,可以处理图像类型的邮件。
    • 可以设置图像内容、图像类型等属性。
  5. email.mime.audio.MIMEAudio类:

    • 用于表示音频类型的MIME邮件,可以处理音频类型的邮件。
    • 可以设置音频内容、音频类型等属性。

这些类可以帮助我们在Python中构建和解析各种类型的邮件,包括纯文本邮件、HTML邮件以及带附件的邮件。通过使用这些类,我们可以更加灵活地处理邮件消息的构建和解析。

三、案例实战

这里咱们用QQ邮箱用做测试,QQ邮箱需要先获取授权码,其他邮箱貌似不需要

3.1 获取授权码

1、登录QQ邮箱的主界面 点击 设置:
100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第1张图片

2、点击账号:

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第2张图片

3、往下翻,找到并开启 POP3/SMTP 服务 和 IMAP/SMTP 服务:
100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第3张图片

4、点击获取授权码(获取后记得复制):

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第4张图片

3.2 代码步骤

代码步骤说明:

  • 1、 首先需要导入smtplib和email相关模块。
  • 2、 设置发件人邮箱和密码,以及收件人邮箱。
  • 3、 创建邮件内容,包括发件人、收件人、主题和正文。
  • 4、连接到SMTP服务器,并使用starttls()方法启用TLS加密。
  • 5、使用login()方法进行邮箱登录。
  • 6、使用sendmail()方法发送邮件。
  • 7、 最后使用quit()方法关闭连接。

3.3 发送文本格式邮件

案例代码注意下面代码需要更改发件人邮箱、授权码和收件人邮箱):

import smtplib  # 导入smtplib模块
from email.message import EmailMessage  # 从email.message模块导入EmailMessage类

# 1、设置发件人邮箱和授权码
sender_email  = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码'  # 邮箱SMTP的授权码(看上文获取)

# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己

# 3、创建邮件内容
message = EmailMessage() # 创建EmailMessage对象
message['From'] = sender_email  # 设置发件人
message['To'] = recipient_email  # 设置收件人

message['subject']  = "Python发送邮箱测试标题信息"  # 设置标题信息
body = "Python发送邮箱测试正文内容"  # 正文内容
message.set_content(body)  # 设置邮件正文内容


# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25)  # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls()  # 启用TLS加密
server.login(sender_email, sender_password)  # 登录邮箱

# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())

# 6、关闭连接
server.quit()

运行结果,我的邮箱收到了发送的邮件:
100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第5张图片

3.4 发送图片格式邮件

案例代码注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和图片路径,如果不想要正文文字内容也可以注释掉):

import smtplib  # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os

# 1、设置发件人邮箱和授权码
sender_email  = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码'  # 邮箱SMTP的授权码(看上文获取)

# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己

# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email  # 设置发件人
message['To'] = recipient_email  # 设置收件人

message['subject']  = "Python发送邮箱测试标题信息"  # 设置标题信息
body = MIMEText("Python发送美女图片")  # 正文内容
message.attach(body)  # 设置邮件正文内容

# 添加图片附件
image_path = '1.png'  # 图片文件路径
if os.path.exists(image_path):
    with open(image_path, 'rb') as image_file:
        image = MIMEImage(image_file.read(), name=os.path.basename(image_path))
        message.attach(image)


# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25)  # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls()  # 启用TLS加密
server.login(sender_email, sender_password)  # 登录邮箱

# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())

# 6、关闭连接
server.quit()

运行结果,发送成功:

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第6张图片

3.5 发送指定文件夹下所有内容

下面是我准备的文件:

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第7张图片

案例代码注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和文件夹路径,如果不想要正文文字内容也可以注释掉):

import smtplib  # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os

# 1、设置发件人邮箱和授权码
sender_email  = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码'  # 邮箱SMTP的授权码(看上文获取)

# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己

# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email  # 设置发件人
message['To'] = recipient_email  # 设置收件人

message['subject']  = "Python发送邮箱测试标题信息"  # 设置标题信息
body = MIMEText("Python发送指定文件夹下所有内容")  # 正文内容
message.attach(body)  # 设置邮件正文内容

# 指定文件夹路径
folder_path = r'E:\Python3.10\测试文件夹'  # 文件夹路径
# 遍历文件夹下所有文件
for filename in os.listdir(folder_path):
    file_path = os.path.join(folder_path, filename)
    if os.path.isfile(file_path):
        attachment = open(file_path, 'rb')
        # 添加附件
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', f'attachment; filename= {filename}')
        message.attach(part)

# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25)  # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls()  # 启用TLS加密
server.login(sender_email, sender_password)  # 登录邮箱

# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())

# 6、关闭连接
server.quit()

运行结果,收到了指定文件夹下所有内容:

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)_第8张图片

你可能感兴趣的:(100天精通Python,python,开发语言,smtplib,email,收发邮件,自动化操作,Python发送邮件)