当我们想通过程序从邮件中检索信息或数据,但不想在设备上下载邮件时,这种情况会发生很多次。当我们只想获取信息并从邮件中寻找特定数据时,甚至会发生这种情况。
我们有许多 Python 模块,通过这些模块,我们可以使用程序获取电子邮件的数据,但是大多数模块在从邮件中检索信息时会下载邮件。这正是我们不想要的,因为我们不需要将邮件信息保存在系统中,也不需要在别人的系统上工作很多次,我们只需要看一看我们电子邮件中存在的一些特定信息。但是 Python 中有一些模块和协议,我们可以通过它们从电子邮件中检索信息,而无需在系统中实际下载它们。Python 中的一个这样的模块是“imaplib”模块,它为我们提供了访问 IMAP 协议的途径,以便从邮件中访问和检索数据。
在本教程中,我们将学习 Python 和 IMAP 协议的“imaplib”模块,我们还将学习如何使用该协议从电子邮件中检索信息。
Python 的 imaplib
模块
imaplib 是一个 Python 模块或库,它为我们提供了客户端类,这样我们就可以设置与 IMAP 第 4 版服务器的通信,通过这种 IMAP 通信,我们可以从我们的电子邮件中检索数据。imaplib 库为我们提供了三个客户端类,在使用 Python 中的 IMAP 协议与服务器通信时使用。下面是 Python 的 imaplib
模块中提供给我们的三个客户端类:
- IMAP_4
- IMAP4_Stream
- IMAP_SSL
当我们使用 IMAP 协议通过 Python 程序访问电子邮件数据时,这些类别的 imaplib
模块用于建立与服务器的通信。
Python 的 imaplib
模块:安装
imaplib
模块是 Python 安装包附带的预安装 Python 库,这就是为什么我们不需要为安装该库执行任何安装过程。取而代之的是,我们可以直接在 Python 程序中使用 imaplib
模块的功能,方法是使用“import”关键字将其导入程序中。
Python 中的 IMAP 协议
IMAP 是一种电子邮件检索协议,代表互联网邮件访问协议,我们将通过 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 命令 | 命令描述 | | one | 注册 | 此命令用于通过我们将提供的凭据登录到服务器来打开与电子邮件服务器的连接。 | | Two | 挑选 | 我们使用这个命令来选择我们想要访问的邮箱文件夹,这样它就可以访问邮箱中的所有电子邮件。我们甚至可以在通过此 SELECT 命令选择邮箱后对邮箱进行更改。 | | three | 能力 | 当我们想知道服务器支持的功能时,我们可以使用这个命令,我们可以通过请求服务器列出它的功能来做到这一点。 | | four | 创造 | 当我们想要创建一个具有指定名称的邮箱时,我们可以使用 IMAP 协议的 create 命令。 | | five | 无操作 | NOOP 命令的作用类似于并被用作定期轮询,以提醒我们新消息或我们在不活动期间消息状态的任何更新。 | | six | 考试 | “检查”命令的工作方式与“选择”命令相同,但这两个命令之间的唯一区别是“检查”命令不允许对邮箱进行任何更改。此命令仅允许我们从邮件中读取和检索信息,并检查所选邮箱中有多少封电子邮件。 | | seven | 重新命名 | 当我们想从电子邮件中更改邮箱的名称时,我们必须使用 RENAME 来执行相同的操作。 | | eight | 删除 | DELETE 命令用于永久删除我们选择或创建的邮箱中的电子邮件,此命令执行的操作无法撤消。 | | nine | 注销 | 当我们不使用 IMAP 协议时,或者当我们处理完电子邮件后,我们想要关闭与电子邮件服务器的连接,我们可以使用 LOGOUT 命令来完成。此命令通知电子邮件服务器,用户已完成会话,现在应该关闭会话。服务器将首先通过协议发送 BYE 响应,然后是来自客户端的 OK 响应,然后与服务器的连接将被关闭。 |
这些都是 IMAP 协议的重要命令。我们必须使用这些命令,同时使用 IMAP 协议从邮件中检索信息并在邮箱中进行更改。我们在建立或关闭与电子邮件服务器的连接时也使用这些命令。
Python 的 imaplib
模块:实现
在本教程的前几节中,我们已经学习了 IMAP 协议以及用于从电子邮件中检索信息和在邮箱中进行更改的命令。我们通过在程序中使用 imaplib
模块中的函数,在 Python 中实现了这个 IMAP 协议。为了学习如何通过 imaplib
模块实现 IMAP 协议,我们将使用一个示例程序,在该程序中,我们使用该模块中的功能并与电子邮件服务器通信。
示例:
请看下面的 Python 程序,我们将在其中使用 imaplib
模块并与电子邮件服务器建立连接:
# Import imaplib library in the program
import imaplib as imp
# Also import the pprint module
import pprint as pp
# Targeting the host server for email
imapHostServer = 'imap.gmail.com'
# User email id
imapUserEmail = 'forpythoncontent@gmail.com'
# Password for user Email
imapPassword = 'NotAPassword'
# Connecting to host server using SSL client class
imapVar = imp.IMAP4_SSL(imapHostServer)
# Login to the email server with credentials
imapVar.login(imapUserEmail, imapPassword)
# Mailbox folder where emails are present
imapVar.select('Inbox')
# Searching data through the mail
tmp, data = imapVar.search(None, 'ALL')
# Using for loop to print data
for n in data[0].split():
tmp, data = imapVar.fetch(n, '(RFC822)')
print('Message: {0}\n'.format(n))
pp.pprint(data[0][1])
break
# Closing the connection with the server
imapVar.close()
输出:
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')
如我们所见,收件箱中电子邮件的数据会打印在输出中,每个人的输出会有所不同。
说明:我们首先在程序中导入了 imaplib 和 pprint
模块,利用它们的功能来实现 IMAP 协议。我们在程序中导入了 imaplib 作为 imp,pprint
模块作为 pp。之后,我们初始化了 imapHostServer 变量,在该变量中我们定义了电子邮件的服务器路径。然后,我们已经初始化了两个变量,即 imapUserEmail 和 imapPassword,其中我们分别定义了电子邮件的用户电子邮件 ID 和密码(出于安全原因,我们在程序中定义的密码不是正确的密码)。人们可以使用他们的电子邮件 id 和密码,同时在他们的系统中实现这个程序。之后,我们定义了 imapVar 变量,其中我们使用了 IMAP4_SSL()函数,该函数来自 imaplib
模块,使用 imapHostServer 作为函数中的参数。这个函数将与电子邮件服务器建立连接,然后我们使用 login()函数来访问我们的电子邮件。我们在登录()函数中使用了 imapusseremail&imapPassword 作为参数,作为我们电子邮件帐户的电子邮件 Id &密码。然后,我们使用 select()函数选择“收件箱”邮箱并检索收件箱中的电子邮件。之后,我们使用 search()函数从收件箱中的电子邮件中搜索数据。最后,我们使用 for
循环遍历收件箱中的所有电子邮件,并在输出中从它们那里检索信息。我们在 for
循环中使用 fetch()函数从电子邮件中获取数据,使用 pprint()函数打印邮件中的信息。
注意:我们在程序中使用了 pprint
模块,这也是 Python 的内置模块,使用它来打印输出中的数据很重要。
结论
我们可以使用 IMAP 协议从我们的电子邮件中检索数据,而无需在我们的系统中实际下载它们。为了实现 IMAP 协议,我们必须使用 imaplib
模块,它为我们提供了三个 IMAP 客户端类。我们可以使用 IMAP 的各种命令在电子邮件中执行多种功能。我们必须在 Python 程序中使用 imaplib
模块来实现 IMAP 协议,并从电子邮件中获取数据或保持连接。