【Python百宝箱】Python轻松操控邮件:SMTP、POP3和IMAP的魅力

前言

在数字时代,电子邮件作为信息传递的主要手段,对个人和企业的日常工作至关重要。Python提供了多个强大的库,使得电子邮件的发送和接收变得轻松而灵活。本文将深入介绍Python中与电子邮件相关的主要库,为读者提供从基础到高级应用的全面指南。

邮件通信新时代:Python库引领电子邮件革命

文章目录

  • 前言
  • 邮件通信新时代:Python库引领电子邮件革命
    • 0.若你要使用QQ邮箱,以下是配置方法示例代码
    • 1. 介绍
      • 1.1 电子邮件的概念
      • 1.2 邮件服务器全攻略:SMTP、POP3和IMAP的应用与区别
        • 1.2.1 SMTP(Simple Mail Transfer Protocol)
        • 1.2.2 POP3(Post Office Protocol version 3)
        • 1.2.3 IMAP(Internet Message Access Protocol)
        • 1.2.4 区别与应用场景
    • 2. smtplib库
      • 2.1 概述
      • 2.2 使用方法
      • 2.3 发送带附件的邮件
      • 2.4 邮件安全性与TLS/SSL
      • 2.5 邮件格式与MIME
      • 2.6 处理邮件异常
      • 2.7 应用场景:自动化邮件通知
    • 3. yagmail库
      • 3.1 概述
      • 3.2 特性
        • 3.2.1 附件支持
        • 3.2.2 HTML内容支持
        • 3.2.3 邮件模板
        • 3.2.4 邮件别名
        • 3.2.5 应用场景:自动化邮件通知
    • 4. email库
      • 4.1 概述
      • 4.2 创建邮件
      • 4.3 解析邮件
      • 4.4 邮件格式与MIME
      • 4.5 应用场景:邮件过滤与自动化处理
      • 4.6 处理邮件头信息
      • 4.7 应用场景:电子邮件爬虫
      • 4.8 邮件安全性与加密
      • 4.9 应用场景:邮件自动分类
    • 5. 邮件安全性
      • 5.1 TLS与SSL
      • 5.2 TLS与SSL的概念
      • 5.3 Python中的TLS和SSL支持
        • 5.3.1 使用TLS的示例(smtplib)
        • 5.3.2 使用TLS的示例(imaplib)
      • 5.4 SSL的示例
    • 6. 扩展知识
      • 6.1 MIME
      • 6.2 邮件服务器
      • 6.3 Python中的`yagmail`库
      • 6.4 邮件安全性
        • 6.4.1 DKIM(DomainKeys Identified Mail)
        • 6.4.2 DMARC(Domain-based Message Authentication, Reporting, and Conformance)
        • 6.4.3 加密邮件内容
      • 6.5 邮件通知和监控
    • 7. 应用场景
      • 7.1 自动化邮件通知
      • 7.2 数据报表自动发送
  • 总结

0.若你要使用QQ邮箱,以下是配置方法示例代码

  1. 登录邮箱点击右上角账号与安全
    在这里插入图片描述
  2. 开启POP3/IMAP/SMTP/Exchange/CardDAV 服务

在这里插入图片描述
3.生成授权码

在这里插入图片描述

  1. 修改your_qq_password为刚刚生成的授权码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# 邮件内容
message = MIMEMultipart()
message.attach(MIMEText("这是一封带附件的测试邮件。"))
message["From"] = "your_qq_email@qq.com"  # 使用QQ邮箱地址
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "带附件的测试邮件"

# 添加附件
attachment_path = "/path/to/attachment/file.txt"
attachment = open(attachment_path, "rb")
base = MIMEBase('application', 'octet-stream')
base.set_payload(attachment.read())
encoders.encode_base64(base)
base.add_header('Content-Disposition', f'attachment; filename={attachment_path}')
message.attach(base)

# 连接到QQ邮箱的SMTP服务器
server = smtplib.SMTP("smtp.qq.com", 587)  # 使用QQ邮箱的SMTP服务器信息
server.starttls()

# 登录到QQ邮箱
server.login("your_qq_email@qq.com", "your_qq_password")  # 使用QQ邮箱的用户名和密码

# 发送邮件
server.sendmail("your_qq_email@qq.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

1. 介绍

1.1 电子邮件的概念

电子邮件是一种通过电子手段传递信息的通信方式,已成为现代社会中不可或缺的沟通工具。

1.2 邮件服务器全攻略:SMTP、POP3和IMAP的应用与区别

电子邮件的流通离不开邮件服务器,而邮件服务器的通信协议涉及SMTP、POP3和IMAP三种重要的协议。

1.2.1 SMTP(Simple Mail Transfer Protocol)

SMTP是用于在发送邮件时,邮件客户端与邮件服务器之间进行通信的协议。它定义了邮件的发送规则,确保邮件能够准确、高效地被投递到接收者的邮箱。以下是一个使用SMTP发送邮件的简单示例:

import smtplib
from email.mime.text import MIMEText

# 邮件内容
message = MIMEText("这是一封通过SMTP发送的测试邮件。")
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "SMTP测试邮件"

# 连接到SMTP服务器
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个例子中,我们使用smtplib库连接到Gmail的SMTP服务器,并通过SMTP协议发送了一封测试邮件。

1.2.2 POP3(Post Office Protocol version 3)

POP3是一种用于从邮件服务器接收邮件的协议。它允许邮件客户端从服务器下载邮件到本地设备。以下是一个使用POP3接收邮件的示例:

import poplib

# 连接到POP3服务器
pop_server = poplib.POP3("pop.gmail.com")
pop_server.starttls()
pop_server.login("your_email@gmail.com", "your_password")

# 获取邮件信息
message_count, _ = pop_server.stat()
for i in range(1, message_count + 1):
    _, msg_data, _ = pop_server.retr(i)
    email_message = b"\n".join(msg_data).decode("utf-8")
    print(email_message)

# 关闭连接
pop_server.quit()

在这个例子中,我们使用poplib库连接到Gmail的POP3服务器,并通过POP3协议检索了收件箱中的邮件。

1.2.3 IMAP(Internet Message Access Protocol)

IMAP是一种更先进的协议,它允许邮件客户端在邮件服务器上管理邮件,包括创建、删除、移动邮件夹等。以下是一个使用IMAP接收邮件的示例:

import imaplib
import email

# 连接到IMAP服务器
imap_server = imaplib.IMAP4_SSL("imap.gmail.com")
imap_server.login("your_email@gmail.com", "your_password")

# 选择邮箱
imap_server.select("inbox")

# 搜索邮件
status, messages = imap_server.search(None, "ALL")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = imap_server.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])
    print(email_message["From"])

# 关闭连接
imap_server.logout()

在这个例子中,我们使用imaplib库连接到Gmail的IMAP服务器,并通过IMAP协议检索了收件箱中的邮件。

1.2.4 区别与应用场景
  • SMTP: 用于发送邮件,将邮件从发件人的客户端传递到邮件服务器。
  • POP3: 用于接收邮件,将邮件从邮件服务器下载到收件人的客户端。通常会删除服务器上的邮件,邮件只存在于客户端。
  • IMAP: 也用于接收邮件,但相比于POP3,它更灵活。邮件可以在客户端和服务器之间同步,允许在多个设备上查看相同的邮件文件夹,以及在服务器上管理邮件。

选择使用哪种协议取决于具体的应用场景和需求。如果你需要在多个设备上同步邮件状态,使用IMAP可能更合适。如果你只在一个设备上查看邮件且希望减少服务器存储空间的使用,POP3可能是更好的选择。SMTP则是发送邮件的必经之路。

2. smtplib库

2.1 概述

smtplib是Python标准库中的模块,用于发送和接收电子邮件,基于SMTP协议。SMTP(Simple Mail Transfer Protocol)是一种在网络上用来发送电子邮件的协议,它规定了邮件的发送格式以及客户端和服务器之间的通信规则。

2.2 使用方法

smtplib库提供了一系列方法,用于与SMTP服务器进行连接、登录、发送邮件等操作。下面是一个使用smtplib库发送电子邮件的简单示例:

import smtplib
from email.mime.text import MIMEText

# 邮件内容
message = MIMEText("这是一封测试邮件。")
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "测试邮件"

# 连接到SMTP服务器
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()

# 登录到邮箱
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个例子中,我们使用MIMEText创建了一个简单的文本邮件,通过smtplib库连接到Gmail的SMTP服务器,并通过SMTP协议登录并发送了一封测试邮件。

2.3 发送带附件的邮件

smtplib库允许发送带有附件的邮件,为邮件内容添加附件,可以使用MIMEMultipartMIMEBase来实现。以下是一个发送带附件的邮件的示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# 邮件内容
message = MIMEMultipart()
message.attach(MIMEText("这是一封带附件的测试邮件。"))
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "带附件的测试邮件"

# 添加附件
attachment_path = "/path/to/attachment/file.txt"
attachment = open(attachment_path, "rb")
base = MIMEBase('application', 'octet-stream')
base.set_payload(attachment.read())
encoders.encode_base64(base)
base.add_header('Content-Disposition', f'attachment; filename={attachment_path}')
message.attach(base)

# 连接到SMTP服务器
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()

# 登录到邮箱
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个例子中,我们使用了MIMEMultipart来创建一个包含附件的邮件,通过MIMEBase将附件添加到邮件中,最后通过smtplib库连接到SMTP服务器并发送邮件。

2.4 邮件安全性与TLS/SSL

在实际应用中,邮件通信的安全性至关重要。使用TLS(Transport Layer Security)或SSL(Secure Sockets Layer)来加密与SMTP服务器的通信,防止邮件内容被第三方截获。以下是一个启用TLS的示例:

import smtplib
from email.mime.text import MIMEText

# 邮件内容
message = MIMEText("这是一封启用了TLS的测试邮件。")
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "启用TLS的测试邮件"

# 连接到SMTP服务器并启用TLS
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()

# 登录到邮箱
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个例子中,我们使用smtplib库连接到Gmail的SMTP服务器,并通过SMTP协议登录,并启用了TLS来加密通信。

smtplib库提供了灵活而强大的功能,使得在Python中进行电子邮件通信变得简单而高效。通过了解更多关于邮件安全性、附件的处理以及其他高级功能,你可以根据实际需求进一步优化和扩展邮件功能。

2.5 邮件格式与MIME

邮件通信中,MIME(Multipurpose Internet Mail Extensions)协议定义了电子邮件的消息格式,允许邮件包含多媒体元素、附件和非ASCII字符。在smtplib库中,我们可以使用MIMETextMIMEImage等类来构建不同类型的邮件内容。以下是一个发送HTML邮件的示例:

import smtplib
from email.mime.text import MIMEText

# 邮件内容(HTML格式)
html_content = """
<html>
  <body>
    <p>这是一封包含<strong>HTML</strong>格式的测试邮件。</p>
  </body>
</html>
"""

message = MIMEText(html_content, 'html')
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "HTML格式测试邮件"

# 连接到SMTP服务器
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()

# 登录到邮箱
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

这个例子中,我们使用了MIMEText并将内容格式指定为HTML,从而发送了一封包含HTML格式的测试邮件。你还可以使用其他MIME类来处理不同类型的邮件内容。

2.6 处理邮件异常

在实际应用中,为了确保邮件的可靠传递,我们需要处理可能发生的异常。例如,可以使用tryexcept语句来捕获SMTPException异常,以处理登录失败、邮件发送失败等情况。

import smtplib
from email.mime.text import MIMEText
from smtplib import SMTPException

try:
    # 邮件内容
    message = MIMEText("这是一封测试邮件。")
    message["From"] = "your_email@gmail.com"
    message["To"] = "recipient_email@gmail.com"
    message["Subject"] = "测试邮件"

    # 连接到SMTP服务器
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()

    # 登录到邮箱
    server.login("your_email@gmail.com", "your_password")

    # 发送邮件
    server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

    # 关闭连接
    server.quit()

except SMTPException as e:
    print(f"邮件发送失败:{e}")

在这个例子中,我们使用tryexcept语句来捕获可能发生的SMTPException异常,并打印错误信息。这有助于更好地处理潜在的问题,确保邮件通信的可靠性。

2.7 应用场景:自动化邮件通知

smtplib库的强大之处在于它可以轻松集成到自动化脚本中,用于发送邮件通知。以下是一个示例,演示了如何在脚本执行完成后发送一封自动化邮件通知:

import smtplib
from email.mime.text import MIMEText

def send_notification(subject, body):
    # 邮件内容
    message = MIMEText(body)
    message["From"] = "your_email@gmail.com"
    message["To"] = "recipient_email@gmail.com"
    message["Subject"] = subject

    try:
        # 连接到SMTP服务器
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.starttls()

        # 登录到邮箱
        server.login("your_email@gmail.com", "your_password")

        # 发送邮件
        server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

        # 关闭连接
        server.quit()

        print("邮件通知发送成功!")

    except smtplib.SMTPException as e:
        print(f"邮件发送失败:{e}")

# 脚本执行完成后发送邮件通知
send_notification("脚本执行完成", "您的脚本已成功执行。")

在这个例子中,我们定义了一个send_notification函数,用于发送自动化邮件通知。在脚本执行完成后,调用这个函数,即可实现邮件通知的自动发送。

smtplib库的应用场景不仅限于自动化通知,还可以用于报表发送、异常提醒等多种实际场景。通过结合其他库,比如定时任务库schedule或者Web框架Flask,可以构建更复杂的邮件应用系统。

3. yagmail库

3.1 概述

yagmail是一个建立在smtplib之上的库,专为简化发送电子邮件而设计。通过yagmail,你可以更轻松地发送带有附件和HTML内容的邮件,同时提供了更友好的API接口。

3.2 特性

yagmail库的特性使得发送邮件变得更加简单和灵活。以下是一些主要特性的介绍和示例:

3.2.1 附件支持

yagmail库允许你轻松地添加附件到邮件中,无需手动构建MIMEBase对象。下面是一个发送带附件邮件的例子:

import yagmail

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 发送带附件的邮件
contents = ["这是一封带附件的测试邮件。", "/path/to/attachment/file.txt"]
yag.send("recipient_email@gmail.com", "带附件的测试邮件", contents)

# 关闭连接
yag.close()

在这个例子中,我们通过yagmailsend方法直接传递了邮件内容和附件路径,简化了邮件构建的过程。

3.2.2 HTML内容支持

yagmail库还提供了对HTML内容的原生支持,使得创建富文本邮件变得容易。以下是一个发送HTML邮件的例子:

import yagmail

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 发送HTML格式的邮件
contents = "<h1>这是一封HTML格式的测试邮件。</h1>"
yag.send("recipient_email@gmail.com", "HTML格式的测试邮件", contents)

# 关闭连接
yag.close()

通过直接传递HTML格式的内容,你可以在邮件中使用更多样式和排版。

3.2.3 邮件模板

yagmail库支持使用邮件模板,通过预定义的模板文件,可以更方便地创建邮件内容。以下是一个使用邮件模板的例子:

import yagmail

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 定义邮件模板
template = """
    这是一封测试邮件。
    参数1: {param1}
    参数2: {param2}
"""

# 发送带有参数的邮件
contents = template.format(param1="值1", param2="值2")
yag.send("recipient_email@gmail.com", "带参数的测试邮件", contents)

# 关闭连接
yag.close()

通过在模板中定义参数,你可以在发送邮件时动态替换内容,实现更灵活的邮件定制。

3.2.4 邮件别名

yagmail库允许设置邮件别名,使得在发送邮件时更容易识别发件人。以下是一个设置邮件别名的例子:

import yagmail

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 设置邮件别名
yag.register("your_email@gmail.com", "Your Alias")

# 发送邮件
contents = "这是一封使用邮件别名的测试邮件。"
yag.send("recipient_email@gmail.com", "测试邮件", contents)

# 关闭连接
yag.close()

通过使用yagmailregister方法,你可以为邮箱设置一个别名,方便在发送邮件时直接使用。

3.2.5 应用场景:自动化邮件通知

yagmail库的简洁API和丰富的特性,使得它成为自动化邮件通知的理想选择。以下是一个示例,演示了如何在脚本执行完成后发送一封自动化邮件通知:

import yagmail

def send_notification(subject, body):
    # 连接到SMTP服务器
    yag = yagmail.SMTP("your_email@gmail.com", "your_password")

    # 发送邮件通知
    contents = [body]
    yag.send("recipient_email@gmail.com", subject, contents)

    # 关闭连接
    yag.close()
    print("邮件通知发送成功!")

# 脚本执行完成后发送邮件通知
send_notification("脚本执行完成", "您的脚本已成功执行。")

通过调用send_notification函数,你可以在脚本执行完成后方便地发送邮件通知。

yagmail库的简单易用和丰富的特性,使得在Python中进行电子邮件通信变得更加便捷。通过了解更多关于邮件模板、邮件别名等高级功能,你可以根据实际需求进一步优化和扩展邮件功能。

4. email库

4.1 概述

email库是Python标准库中的模块,用于处理电子邮件的创建、解析和操作。与smtplibyagmail不同,email库更加底层,提供了更灵活的方式来处理邮件内容。

4.2 创建邮件

email库允许你创建复杂的邮件结构,包括纯文本、HTML、附件等。以下是一个创建包含附件的邮件的示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# 创建邮件
message = MIMEMultipart()
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "带附件的邮件"

# 添加文本内容
text_content = MIMEText("这是一封带附件的测试邮件。")
message.attach(text_content)

# 添加附件
attachment_path = "/path/to/attachment/file.txt"
with open(attachment_path, "rb") as attachment:
    attachment_part = MIMEApplication(attachment.read(), Name="file.txt")
    attachment_part["Content-Disposition"] = f'attachment; filename="{attachment_path}"'
    message.attach(attachment_part)

在这个例子中,我们使用MIMEMultipart创建了一个多部分邮件,通过MIMEText添加了文本内容,通过MIMEApplication添加了附件。

4.3 解析邮件

email库也可以用于解析接收到的邮件内容。以下是一个解析邮件并提取附件的示例:

import imaplib
import email
from email.header import decode_header

# 连接到IMAP服务器
mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索邮件
status, messages = mail.search(None, "ALL")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])

    # 获取邮件主题
    subject, encoding = decode_header(email_message["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding if encoding else "utf-8")

    print(f"邮件主题: {subject}")

    # 提取附件
    for part in email_message.walk():
        if part.get_content_maintype() == "multipart":
            continue
        if part.get("Content-Disposition") is None:
            continue

        filename = part.get_filename()
        print(f"发现附件: {filename}")

# 关闭连接
mail.logout()

在这个例子中,我们使用imaplib连接到Gmail的IMAP服务器,并通过email库解析了收件箱中的邮件。通过遍历邮件的各个部分,我们可以提取出附件的信息。

4.4 邮件格式与MIME

email库提供了MIMETextMIMEImage等类,用于创建不同类型的邮件内容。以下是一个创建HTML邮件的示例:

from email.mime.text import MIMEText

# 创建HTML格式的邮件
html_content = """
<html>
  <body>
    <p>这是一封包含<strong>HTML</strong>格式的测试邮件。</p>
  </body>
</html>
"""

message = MIMEText(html_content, 'html')
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "HTML格式测试邮件"

通过使用MIMEText并将内容格式指定为HTML,你可以创建包含富文本内容的邮件。

4.5 应用场景:邮件过滤与自动化处理

email库的灵活性使得它适用于更复杂的应用场景,比如邮件过滤与自动化处理。以下是一个示例,演示了如何通过email库解析邮件,并根据条件过滤和处理邮件:

import imaplib
import email
from email.header import decode_header

# 连接到IMAP服务器
mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索未读邮件
status, messages = mail.search(None, "(UNSEEN)")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg```python
    _[0][1])

    # 获取邮件主题
    subject, encoding = decode_header(email_message["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding if encoding else "utf-8")

    print(f"邮件主题: {subject}")

    # 进行邮件过滤与处理
    if "重要关键词" in email_message.get_payload(decode=True).decode("utf-8"):
        # 进行特定操作,比如将邮件移动到指定文件夹
        print("这封邮件包含重要关键词,进行特定操作。")
    else:
        print("这封邮件未包含重要关键词,不进行特定操作。")

# 关闭连接
mail.logout()

在这个例子中,我们连接到Gmail的IMAP服务器,选择收件箱并搜索未读邮件。通过解析邮件内容,我们可以获取主题,并根据邮件内容中是否包含重要关键词进行不同的处理操作。

4.6 处理邮件头信息

email库还允许我们处理邮件头信息,包括发件人、收件人、日期等。以下是一个解析邮件头信息的示例:

import imaplib
import email
from email.header import decode_header

# 连接到IMAP服务器
mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索未读邮件
status, messages = mail.search(None, "(UNSEEN)")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])

    # 获取邮件头信息
    sender, encoding = decode_header(email_message.get("From"))[0]
    if isinstance(sender, bytes):
        sender = sender.decode(encoding if encoding else "utf-8")

    subject, encoding = decode_header(email_message.get("Subject"))[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding if encoding else "utf-8")

    date = email.utils.parsedate(email_message.get("Date"))

    print(f"发件人: {sender}")
    print(f"邮件主题: {subject}")
    print(f"日期: {date}")

# 关闭连接
mail.logout()

在这个例子中,我们通过decode_header函数解码了邮件头中的发件人、主题,并使用email.utils.parsedate解析了邮件的日期。

4.7 应用场景:电子邮件爬虫

email库的底层特性使得它适用于构建电子邮件爬虫,用于从邮件中提取信息。以下是一个示例,演示了如何连接到IMAP服务器,获取邮件并提取发件人、主题等信息:

import imaplib
import email
from email.header import decode_header

def fetch_emails(username, password, keyword):
    # 连接到IMAP服务器
    mail = imaplib.IMAP4_SSL("imap.gmail.com")
    mail.login(username, password)

    # 选择邮箱
    mail.select("inbox")

    # 搜索包含关键词的邮件
    status, messages = mail.search(None, f'(BODY "{keyword}")')

    # 获取邮件
    emails = []
    for mail_id in messages[0].split():
        _, msg_data = mail.fetch(mail_id, "(RFC822)")
        email_message = email.message_from_bytes(msg_data[0][1])

        # 提取信息
        sender, encoding = decode_header(email_message.get("From"))[0]
        if isinstance(sender, bytes):
            sender = sender.decode(encoding if encoding else "utf-8")

        subject, encoding = decode_header(email_message.get("Subject"))[0]
        if isinstance(subject, bytes):
            subject = subject.decode(encoding if encoding else "utf-8")

        date = email.utils.parsedate(email_message.get("Date"))

        emails.append({
            "sender": sender,
            "subject": subject,
            "date": date
        })

    # 关闭连接
    mail.logout()

    return emails

# 使用示例
username = "your_email@gmail.com"
password = "your_password"
keyword = "重要关键词"
result = fetch_emails(username, password, keyword)

# 打印提取的信息
for email_info in result:
    print(f"发件人: {email_info['sender']}")
    print(f"邮件主题: {email_info['subject']}")
    print(f"日期: {email_info['date']}")
    print("\n---\n")

在这个示例中,我们定义了一个名为fetch_emails的函数,该函数连接到IMAP服务器,搜索包含特定关键词的邮件,并提取发件人、主题和日期信息。使用这个函数,你可以构建一个简单的电子邮件爬虫,用于获取并处理符合条件的邮件。

4.8 邮件安全性与加密

smtplib类似,email库也可以与加密通信一同使用,以增强邮件通信的安全性。以下是一个使用IMAP4_SSL连接到加密的IMAP服务器的示例:

import imaplib
import ssl

# 创建安全上下文
context = ssl.create_default_context()

# 连接到加密的IMAP服务器
mail = imaplib.IMAP4_SSL("imap.gmail.com", context=context)
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索未读邮件
status, messages = mail.search(None, "(UNSEEN)")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])

    # 获取邮件主题
    subject, encoding = decode_header(email_message["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding if encoding else "utf-8")

    print(f"邮件主题: {subject}")

# 关闭连接
mail.logout()

在这个例子中,我们使用了ssl.create_default_context()创建了一个默认的安全上下文,然后通过IMAP4_SSL连接到Gmail的IMAP服务器,从而确保邮件通信的安全性。

4.9 应用场景:邮件自动分类

email库的灵活性和底层特性使得它适用于构建邮件自动分类系统。以下是一个示例,演示了如何通过解析邮件内容,提取关键信息,并根据条件进行分类:

import imaplib
import email
from email.header import decode_header

def categorize_emails(username, password, category_keywords):
    # 连接到IMAP服务器
    mail = imaplib.IMAP4_SSL("imap.gmail.com")
    mail.login(username, password)

    # 选择邮箱
    mail.select("inbox")

    # 获取所有邮件
    status, messages = mail.search(None, "ALL")

    # 分类邮件
    categorized_emails = {category: [] for category in category_keywords}
    for mail_id in messages[0].split():
        _, msg_data = mail.fetch(mail_id, "(RFC822)")
        email_message = email.message_from_bytes(msg_data[0][1])

        # 获取邮件内容
        body = email_message.get_payload(decode=True).decode("utf-8")

        # 根据关键词分类
        for category, keywords in category_keywords.items():
            if any(keyword in body for keyword in keywords):
                categorized_emails[category].append({
                    "subject": email_message["Subject"],
                    "sender": email.utils.parseaddr(email_message.get("From"))[1]
                })

    # 关闭连接
    mail.logout()

    return categorized_emails

# 使用示例
username = "your_email@gmail.com"
password = "your_password"
category_keywords = {
    "工作": ["工作", "项目", "报告"],
    "个人": ["个人", "家庭", "朋友"]
}

result = categorize_emails(username, password, category_keywords)

# 打印分类结果
for category, emails in result.items():
    print(f"--- {category} ---")
    for email_info in emails:
        print(f"主题: {email_info['subject']}")
        print(f"发件人: {email_info['sender']}")
        print("\n---\n")

在这个示例中,我们定义了一个categorize_emails函数,该函数连接到IMAP服务器,获取所有邮件,并根据预定义的关键词进行分类。你可以根据实际需求扩展这个示例,以构建一个更智能的邮件分类系统。

email库作为Python标准库的一部分,提供了底层的邮件处理功能,适用于更高级的应用场景。通过深入了解email库的API和相关概念,你可以根据需求构建更复杂和定制化的邮件处理系统。

5. 邮件安全性

5.1 TLS与SSL

在电子邮件通信中,安全性至关重要。TLS和SSL是两种常见的加密协议,用于保护邮件的传输过程。

5.2 TLS与SSL的概念

TLS(Transport Layer Security)和SSL(Secure Sockets Layer)是两种用于加密通信的协议,它们位于传输层,用于保护数据在客户端和服务器之间的安全传输。这两种协议的目标是防止第三方在通信过程中窃听、篡改或伪造数据。

  • SSL(Secure Sockets Layer): SSL是TLS的前身,最早在1995年由Netscape公司推出。SSL v3.0是第一个广泛使用的版本。由于安全漏洞的发现,后来的TLS协议逐渐取代了SSL。

  • TLS(Transport Layer Security): TLS是SSL的继任者,最早由IETF(Internet Engineering Task Force)制定于1999年。TLS 1.0是第一个正式标准化的版本,后来的版本如TLS 1.1、TLS 1.2、TLS 1.3等进一步改进了安全性和性能。

5.3 Python中的TLS和SSL支持

在Python中,smtplibimaplib库用于电子邮件的发送和接收,可以与TLS和SSL一同使用,提供安全的邮件通信。

5.3.1 使用TLS的示例(smtplib)

以下是一个使用TLS连接到SMTP服务器发送邮件的示例:

import smtplib
from email.mime.text import MIMEText

# 邮件内容
message = MIMEText("这是一封使用TLS的测试邮件。")
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "TLS测试邮件"

# 连接到SMTP服务器,使用TLS
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个示例中,我们使用了starttls方法启用了TLS连接。

5.3.2 使用TLS的示例(imaplib)

以下是一个使用TLS连接到IMAP服务器接收邮件的示例:

import imaplib
import email

# 连接到IMAP服务器,使用TLS
mail = imaplib.IMAP4_TLS("imap.gmail.com")
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索未读邮件
status, messages = mail.search(None, "(UNSEEN)")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])

    # 获取邮件主题
    subject, encoding = email.header.decode_header(email_message["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding if encoding else "utf-8")

    print(f"邮件主题: {subject}")

# 关闭连接
mail.logout()

在这个示例中,我们使用了IMAP4_TLS连接到IMAP服务器,实现了通过TLS进行安全的邮件接收。

5.4 SSL的示例

与TLS类似,SSL也可以在Python中用于安全的邮件通信。以下是一个使用SSL连接到SMTP服务器发送邮件的示例:

import smtplib
from email.mime.text import MIMEText
import ssl

# 邮件内容
message = MIMEText("这是一封使用SSL的测试邮件。")
message["From"] = "your_email@gmail.com"
message["To"] = "recipient_email@gmail.com"
message["Subject"] = "SSL测试邮件"

# 创建安全上下文
context = ssl.create_default_context()

# 连接到SMTP服务器,使用SSL
server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context)
server.login("your_email@gmail.com", "your_password")

# 发送邮件
server.sendmail("your_email@gmail.com", "recipient_email@gmail.com", message.as_string())

# 关闭连接
server.quit()

在这个示例中,我们使用了SMTP_SSL连接到SMTP服务器,实现了通过SSL进行安全的邮件发送。

6. 扩展知识

6.1 MIME

MIME协议用于在电子邮件中传输非文本数据。以下是一个使用MIME的例子:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

# 创建MIME消息
message = MIMEMultipart()
message.attach(MIMEText("这是一封包含图片的邮件。"))
with open("/path/to/image.jpg", "rb") as file:
    image = MIMEImage(file.read())
    message.attach(image)

6.2 邮件服务器

了解与不同类型的邮件服务器交互的基本原理,包括SMTP、POP3和IMAP。以下是一个使用IMAP协议接收邮件的例子:

import imaplib
import email

# 连接到IMAP服务器
mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login("your_email@gmail.com", "your_password")

# 选择邮箱
mail.select("inbox")

# 搜索邮件
status, messages = mail.search(None, "ALL")

# 获取邮件
for mail_id in messages[0].split():
    _, msg_data = mail.fetch(mail_id, "(RFC822)")
    email_message = email.message_from_bytes(msg_data[0][1])
    print(email_message["From"])

# 关闭连接
mail.logout()

6.3 Python中的yagmail

yagmail是一个在邮件发送方面更加简便的Python库,它建立在smtplib之上,并提供了更高级的功能。以下是一个使用yagmail发送邮件的示例:

import yagmail

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 发送带附件的邮件
contents = ["这是一封测试邮件。", "/path/to/attachment/file.txt"]
yag.send("recipient_email@gmail.com", "测试邮件", contents)

# 关闭连接
yag.close()

yagmail库简化了发送带附件的邮件过程,通过提供更高级的接口,用户可以更轻松地处理邮件内容和附件。

6.4 邮件安全性

邮件安全性不仅仅涉及传输过程中的加密,还包括其他方面的安全措施。以下是一些与邮件安全性相关的拓展知识:

6.4.1 DKIM(DomainKeys Identified Mail)

DKIM是一种用于验证邮件的来源和完整性的技术。通过在邮件头部添加数字签名,接收方可以验证邮件是否来自合法发送方并且在传输过程中是否被篡改。在邮件服务器的设置中,可以启用和配置DKIM以增强邮件的安全性。

6.4.2 DMARC(Domain-based Message Authentication, Reporting, and Conformance)

DMARC是一种用于验证邮件的来源,并提供反垃圾邮件报告的技术。它建立在DKIM和SPF(Sender Policy Framework)之上,通过设置域名的DMARC记录,发送方可以指定对于未通过验证的邮件应该采取的操作,如拒收或标记为垃圾邮件。

6.4.3 加密邮件内容

除了在传输过程中使用TLS和SSL加密外,有时候还需要对邮件的内容进行加密,以确保只有合法的接收方能够解密和阅读邮件内容。这可以通过使用端到端加密技术来实现,其中只有发送方和接收方知道解密密钥。

6.5 邮件通知和监控

在组织中,为了确保及时响应和监控邮件系统的运行状态,可以实现邮件通知和监控。这包括设置警报机制,以便在系统出现异常或威胁时及时通知管理员。在Python中,可以使用相关的库和工具来实现这些功能。

这些拓展知识提供了更深入的理解邮件系统的安全性和功能。在实际应用中,可以根据具体需求选择合适的技术和工具来提高邮件系统的安全性和效率。

7. 应用场景

7.1 自动化邮件通知

自动化邮件通知是利用Python脚本实现的一种方便而有效的通信方式。这种场景在以下情况下特别有用:

  • 脚本执行完成通知: 在数据处理、定时任务或其他脚本执行完成后,通过邮件通知相关人员,以确保及时了解任务状态。

  • 异常报警通知: 监测系统或应用程序的运行状态,如果发现异常情况,可以通过邮件通知管理员或相关团队,以便及时处理问题。

以下是一个简单的自动化邮件通知的示例:

import smtplib
from email.mime.text import MIMEText

def send_email(subject, message, to_email):
    # 邮件内容
    email_message = MIMEText(message)
    email_message["Subject"] = subject
    email_message["From"] = "your_email@gmail.com"
    email_message["To"] = to_email

    # 连接到SMTP服务器
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login("your_email@gmail.com", "your_password")

    # 发送邮件
    server.sendmail("your_email@gmail.com", to_email, email_message.as_string())

    # 关闭连接
    server.quit()

# 示例:在脚本执行完成后发送通知邮件
send_email("脚本执行完成", "您的脚本已成功执行!", "recipient_email@gmail.com")

7.2 数据报表自动发送

数据报表的定期生成和自动发送是许多企业和组织中常见的需求。通过Python脚本,可以实现自动从数据源获取数据,生成报表,并将报表通过邮件发送给相关人员。

以下是一个简单的数据报表自动发送的示例:

import pandas as pd
import yagmail

# 生成数据报表
data = {'Product': ['A', 'B', 'C'], 'Sales': [100, 150, 80]}
df = pd.DataFrame(data)

# 保存报表为CSV文件
report_path = "/path/to/report.csv"
df.to_csv(report_path, index=False)

# 连接到SMTP服务器
yag = yagmail.SMTP("your_email@gmail.com", "your_password")

# 发送带附件的邮件(包含数据报表)
contents = ["这是本月销售报表,请查阅附件。", report_path]
yag.send("recipient_email@gmail.com", "本月销售报表", contents)

# 关闭连接
yag.close()

在这个示例中,首先生成一个简单的数据报表,保存为CSV文件,然后通过yagmail库连接到SMTP服务器,发送带附件的邮件,将报表作为附件发送给指定的收件人。

这两个应用场景展示了如何利用Python脚本自动化邮件通知和数据报表的生成与发送,提高了工作效率和通信效果。

总结

通过学习本文,你将全面掌握Python中与电子邮件相关的知识和技能,能够使用不同的库满足各种邮件通信需求。从基础的smtplib到高级的yagmail,再到底层的email库,以及邮件的安全性、MIME协议和邮件服务器的应用,都将在本文中得到详细讲解。希望本文能够为你在Python中处理电子邮件提供全面的指南和实用的技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题--删除链表的倒数第 N 个结点

破阵子-晏殊 燕子欲归时节&#xff0c;高楼昨夜西风。 求得人间成小会&#xff0c;试把金尊傍菊丛。歌长粉面红。 斜日更穿帘幕&#xff0c;微凉渐入梧桐。 多少襟情言不尽&#xff0c;写向蛮笺曲调中。此情千万重。 目录 题目描述&#xff1a; 思路分析&#xff1a; 方法及…

全面(16万字)深入探索深度学习:基础原理到经典模型网络的全面解析

前言 Stacking(堆叠) 网页调试 学习率&#xff1a;它决定了模型在每一次迭代中更新参数的幅度激活函数-更加详细 激活函数的意义: 激活函数主要是让模型具有非线性数据拟合的能力&#xff0c;也就是能够对非线性数据进行分割/建模 如果没有激活函数&#xff1a; 第一个隐层: l…

关于python中的nonlocal关键字

如果在函数的子函数中需要调用外部变量&#xff0c;一般会看见一个nonlocal声明&#xff0c;类似下面这种&#xff1a; def outer_function():x 10def inner_function():nonlocal xx 1print(x)inner_function()outer_function()在这个例子中&#xff0c;inner_function 引用…

[HCIE] IPSec-VPN (IKE自动模式)

概念&#xff1a; IKE&#xff1a;因特网密钥交换 实验目标&#xff1a;pc1与pc2互通 步骤1&#xff1a;R1与R3配置默认路由 R1&#xff1a; ip route-static 0.0.0.0 0.0.0.0 12.1.1.2 R2&#xff1a; ip route-static 0.0.0.0 0.0.0.0 23.1.1.2 步骤2&#xff1a;配ACL…

Java数组的复制、截取(内含例题:力扣-189.轮转数组)

目录 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 2、使用Arrays中的copyofRange方法完成数组的拷贝 题目链接&#xff1a; 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 public class Csdn {public static vo…

vscode的下载安装与配置【超详细】

1、下载 进入vscode官网 打开浏览器的下载内容管理&#xff0c;找到vscode下载任务&#xff0c;鼠标放在下载链接上并右击&#xff0c;点击复制链接地址 下载太慢&#xff1f;使用国内镜像 打开新窗口粘贴地址&#xff0c;并将域名改为&#xff1a;vscode.cdn.azure.cn&am…

ZKP11.4 Use CI to instantiate Fiat-Shamir

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 11: From Practice to Theory (Guest Lecturer: Alex Lombardi) 11.4 Use CI to instantiate Fiat-Shamir Avoid Bad Challenges Def: Given false claim x x x and a first message α \alpha α, a challenge β \beta …

JAVA小游戏“简易版王者荣耀”

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…

java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList

文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.…

【室内定位系统源码】UWB超宽带定位技术的特点和应用前景

uwb人员、物品定位系统源码&#xff0c;智慧工厂人员安全管理定位&#xff0c;高精度定位系统源码 UWB超宽带定位技术概念&#xff1a; 超宽带无线通信技术&#xff08;UWB&#xff09;是一种无载波通信技术&#xff0c;UWB不使用载波&#xff0c;而是使用短的能量脉冲序…

解决PDF预览时,电子签章、日期等不显示问题

文章目录 问题描述问题排查问题解决 问题描述 在预览PDF时&#xff0c;部分签章或控件没有显示。如下图&#xff1a; 正确应该要这样&#xff1a; 问题排查 根据网上搜索&#xff0c;排查&#xff0c;我先看看&#xff0c;pdf.worker.js 里的这三行代码&#xff0c;是否已经注…

无需API开发,有赞小程序集成广告推广系统,提升品牌曝光

无需API开发&#xff0c;实现有赞小程序与其他系统的连接 有赞小程序作为一个多功能的电子商务解决方案&#xff0c;为商家提供了无需复杂API开发就可以实现系统连接和集成的便捷途径。通过有赞小程序&#xff0c;商家可以轻松实现与各种系统的数据同步和应用互联&#xff0c;…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

【MATLAB】VMD分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 VMD&#xff08;Variational Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;基于HHT&#xff08;Hilbert-Huang Transform&#xff0c;希尔伯特-黄变换&#xff09;。HH…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

Javascript每天一道算法题(十八)——矩阵置零-中等

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——标记数组 1、问题 给定一个 y x x 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1&#xff1a; 输入&#xff1a;matrix [[…

Java 多线程编程

Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程&#xff0c;并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语&…

道高一尺,魔高一丈!Python爬虫与反爬虫大战见此回分晓?

文章目录 前言一、重新理解爬虫中的一些概念二、反爬虫的目的三、爬虫与反爬虫大战关于Python及爬虫技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

【机器学习】算法性能评估常用指标总结

考虑一个二分问题&#xff0c;即将实例分成正类&#xff08;positive&#xff09;或负类&#xff08;negative&#xff09;。对一个二分问题来说&#xff0c;会出现四种情况。如果一个实例是正类并且也被 预测成正类&#xff0c;即为真正类&#xff08;True positive&#xff0…