Python imaplib 模块

2025年3月17日 | 阅读 8 分钟

很多时候,我们希望通过程序从邮件中检索信息或数据,但又不想将邮件下载到设备上。当我们需要从邮件中获取信息并查找特定数据时,也会出现这种情况。

我们有许多 Python 模块可以通过程序获取电子邮件数据,但其中大多数模块在检索信息时会下载邮件。这正是我们不希望发生的,因为我们不需要将邮件信息保存在系统中,或者很多时候我们正在别人的系统上工作,只需要查看电子邮件中的某些特定信息。但 Python 中有一些模块和协议,我们可以通过它们从电子邮件中检索信息,而无需实际将其下载到系统中。其中一个这样的模块是“imaplib”模块,它为我们提供了访问 IMAP 协议的功能,用于从邮件中访问和检索数据。

在本教程中,我们将学习 Python 的“imaplib”模块和 IMAP 协议,我们还将学习如何使用此协议从电子邮件中检索信息。

Python 的 imaplib 模块

imaplib 是一个 Python 模块或库,它为我们提供客户端类,以便我们可以与 IMAP 版本 4 服务器建立通信,并且通过此 IMAP 通信,我们可以从电子邮件中检索数据。imaplib 库为我们提供了三个客户端类,用于在使用 Python 中的 IMAP 协议与服务器通信时。以下是 Python 的 imaplib 模块中为我们提供的三个客户端类

  • IMAP_4
  • IMAP4_Stream
  • IMAP_SSL

这些 imaplib 模块的类用于在通过 Python 程序使用 IMAP 协议访问电子邮件数据时与服务器建立通信。

Python 的 imaplib 模块:安装

imaplib 模块是 Python 的预安装库,随 Python 安装包一起提供,因此我们无需执行任何安装过程来安装此库。相反,我们可以通过使用“import”关键字将其导入程序,直接在 Python 程序中使用 imaplib 模块的函数。

Python 中的 IMAP 协议

IMAP 是一种电子邮件检索协议,代表 Internet Mail Access Protocol (互联网邮件访问协议),我们将通过 Python 程序使用此协议访问电子邮件中存在的数据。IMAP 协议最初于 1986 年提出,此模块不会将电子邮件下载到我们的系统中以从中检索数据。IMAP 模块只是读取电子邮件中存在的数据并在程序的输出中显示它们。此协议对于处于低带宽条件下的设备非常有用。我们必须将 IMAP 模块与 Python 的 imaplib 模块(这是一个客户端库)一起使用,才能从电子邮件中检索数据。IMAP 模块将使用 imaplib 模块的客户端类并与服务器建立通信,以便它可以从电子邮件中检索数据并将其显示在输出中。

IMAP 协议的关键点

以下是 IMAP 协议的一些关键点,我们必须记住,并且在通过它从电子邮件中检索数据时对我们非常有用

  • 我们应该记住,我们通过 IMAP 协议检索数据的电子邮件由远程服务器持有和维护。
  • IMAP 协议还通过使用 imaplib 模块的客户端类与服务器建立连接,帮助我们搜索电子邮件。
  • IMAP 协议还允许客户端程序(我们将在其中使用此协议的 Python 程序)在服务器上操作我们的电子邮件,而无需将其下载到我们的设备或本地计算机上。
  • IMAP 协议还使我们能够删除、操作或创建单个或多个远程消息文件夹,这些文件夹称为邮箱。
  • IMAP 模块还允许同时访问多个邮箱(或多个电子邮件帐户),并且它将存在于多个邮件服务器上。
  • IMAP 协议还允许我们对电子邮件执行各种操作,甚至无需阅读电子邮件,例如删除邮件、下载邮件等。

这些是 IMAP 协议的一些关键点,我们应该记住,它们在使用此协议的 Python 程序中将对我们非常有帮助。我们可以执行上述 IMAP 协议关键点中提到的所有操作。

IMAP 命令

IMAP 协议有几个不同的命令,用于通过它执行几个不同的操作。使用 IMAP 协议的这些命令,我们可以对我们的邮箱执行多个操作,因此这些命令帮助我们从电子邮件中检索信息。以下是 IMAP 协议命令及其描述的列表,其中一些将在本协议的实现部分中使用

序号IMAP 命令命令描述
1登录此命令用于通过我们提供的凭据登录服务器来打开与电子邮件服务器的连接。
2SELECT我们使用此命令选择我们想要访问的邮箱文件夹的邮件,从而访问邮箱中存在的所有电子邮件。在通过此 SELECT 命令选择邮箱后,我们甚至可以更改邮箱。
3能力当我们想了解服务器支持的功能时,我们可以使用此命令,我们可以通过请求服务器列出其功能来做到这一点。
4CREATE当我们想创建具有指定名称的邮箱时,可以使用 IMAP 协议的 CREATE 命令。
5NOOPNOOP 命令的作用类似于并用作定期轮询,以便在我们不活动期间提醒我们有新消息或消息状态的任何更新。
6检查EXAMINE 命令的工作方式与 SELECT 命令相同,但这些命令之间的唯一区别是 EXAMINE 命令不允许对邮箱进行任何更改。此命令只允许我们从邮件中读取和检索信息,并检查所选邮箱中有多少封电子邮件。
7重命名当我们想更改电子邮件中邮箱的名称时,我们必须使用 RENAME 来执行此操作。
8DELETEDELETE 命令用于永久删除我们已选择或创建的邮箱中存在的电子邮件,此命令执行的操作无法撤消。
9注销当我们不使用 IMAP 协议或完成电子邮件工作后,我们想要关闭与电子邮件服务器的连接,我们可以使用 LOGOUT 命令来做到这一点。此命令通知电子邮件服务器用户已完成会话,现在应关闭会话。服务器将首先通过协议发送 BYE 响应,然后是客户端的 OK 响应,然后与服务器的连接将关闭。

这些是 IMAP 协议的重要命令。在使用 IMAP 协议从邮件中检索信息和更改邮箱时,我们必须使用这些命令。在建立或关闭与电子邮件服务器的连接时,我们也会使用这些命令。

Python 的 imaplib 模块:实现

在本教程的前几节中,我们已经学习了 IMAP 协议以及用于从电子邮件中检索信息和更改邮箱的命令。我们通过 imaplib 模块在 Python 中实现此 IMAP 协议,方法是在程序中使用此模块中的函数。为了学习如何通过 imaplib 模块实现 IMAP 协议,我们将使用一个示例程序,其中我们使用此模块中的函数并与电子邮件服务器通信。

示例

查看以下 Python 程序,我们将使用 imaplib 模块并与电子邮件服务器建立连接

输出

Message: b'1'

(b'Delivered-To: [email protected]\r\nReceived: by 2002:a05:6839:408'
 b'e:0:0:0:0 with SMTP id dt14csp1139908nkc;\r\n        Thu, 18 Nov 2021 21:1'
 b'8:23 -0800 (PST)\r\nX-Received: by 2002:a02:6901:: with SMTP id e1mr248002'
 b'85jac.0.1637299103144;\r\n        Thu, 18 Nov 2021 21:18:23 -0800 (PST)\r\nA'
 b'RC-Seal: i=1; a=rsa-sha256; t=1637299103; cv=none;\r\n        d=google.com'? https://notifications.google.c=\r\nom/'
 b'g/img/AD-FnEznfDyGI_ixnq3rHvh5p8bctFcd4ga52j55D-mp0uud4w.gif></body>\r\n  '
 b'</html>\r\n\r\n--000000000000b5138a05d11d6681--\r\n')

Python imaplib Module

如我们所见,收件箱中电子邮件的数据已打印在输出中,并且输出因人而异。

解释:我们首先在程序中导入了 imaplib 和 pprint 模块,以使用它们的函数来实现 IMAP 协议。我们在程序中将 imaplib 导入为 imp,将 pprint 模块导入为 pp。之后,我们初始化了 imapHostServer 变量,其中我们定义了电子邮件的服务器路径。然后,我们初始化了两个变量,即 imapUserEmail 和 imapPassword,其中我们分别定义了电子邮件的用户电子邮件 ID 和密码(出于安全原因,我们在程序中定义的密码不是正确的密码)。在自己的系统中实现此程序时,可以使用自己的电子邮件 ID 和密码。之后,我们定义了 imapVar 变量,其中我们使用了 imaplib 模块中的 IMAP4_SSL() 函数,并将 imapHostServer 作为函数的参数。此函数将与电子邮件服务器建立连接,然后我们使用 login() 函数访问我们的电子邮件。我们在 login() 函数中将 imapUserEmail 和 imapPassword 作为我们的电子邮件帐户的电子邮件 ID 和密码的参数。然后,我们使用 select() 函数选择“收件箱”邮箱并检索收件箱中存在的电子邮件。之后,我们使用 search() 函数从收件箱中存在的电子邮件中搜索数据。最后,我们使用 for 循环遍历收件箱中存在的所有电子邮件,并从输出中检索信息。我们已在 for 循环中使用了 fetch() 函数来从电子邮件中获取数据,并使用了 pprint() 函数来打印邮件中存在的信息。

注意:我们在程序中使用了 pprint 模块,它也是 Python 的内置模块,并且使用它来打印输出中的数据非常重要。

结论

我们可以使用 IMAP 协议从电子邮件中检索数据,而无需实际将它们下载到我们的系统中。要实现 IMAP 协议,我们必须使用 imaplib 模块,它为我们提供了三个 IMAP 客户端类。我们可以使用 IMAP 的各种命令在电子邮件中执行多种功能。我们必须在 Python 程序中使用 imaplib 模块来实现 IMAP 协议并从电子邮件中获取数据或维护连接。


下一个主题Python lxml 模块