使用 Python 清理邮箱
我的收件箱里堆积了好多未读邮件,要么是推广邮件,要么就是我当时懒得看。现在想象一下,打开邮箱看到上千封邮件——简直是1917年的噩梦!我该如何尽快清理掉这些邮件呢?
我知道 Gmail 有删除功能,但我相信我们应该“用 Python 自动化枯燥乏味的事情”,你可能会学到一些新东西,也可能不会。
在本文中,我将向您展示如何使用 IMAPlib 设置脚本将收件箱中未读/不需要的邮件发送到垃圾箱,以及如何使用 IMAPClient 永久删除未读/不需要的邮件。
让我们直接进入正题!
先决条件
- Python
- Gmail帐户
- ImapClient [可选]
设置您的 Gmail 帐户
IMAP 代表 Internet Mail Access Protocol(互联网邮件访问协议)。根据维基百科的定义,它是“电子邮件客户端用于通过 TCP/IP 连接从邮件服务器检索电子邮件的互联网标准协议”。
首先,我们需要设置一个 Gmail 帐户才能顺利完成此过程。我对我的 Gmail 帐户进行了以下更改,启用了 IMAP 并允许安全性较低的应用访问。
- 首先,打开 Gmail,点击设置⚙️图标,然后点击“查看所有设置”以启用 IMAP。
- 在下一页中,点击“转发和 POP/IMAP”选项卡。
- 在“IMAP 访问”部分,选择“启用 IMAP”。然后单击“保存更改”。如果您需要更多帮助,请访问此Gmail 帮助页面。
- 要启用安全性较低的应用,请点击屏幕右上角的帐户头像,然后点击“我的帐户”进入 Google 信息中心,或者访问 myaccount.google.com。
- 然后选择“登录和安全”,向下滚动直到看到“允许安全性较低的应用”选项,然后打开访问权限。
如果按照上述步骤操作后仍然无法登录,请访问此处获取谷歌官方帮助支持。
如何使用 IMAPlib 删除邮件
IMAP 库是 Python 内置库,用于通过 IMAP 协议访问和操作电子邮件。以下代码将您登录到所需的电子邮件地址。登录后,我们选择所需的邮箱,即可查看所有可用邮箱的列表print(mail.list())。
IMAPlib 的初始代码
本部分邮件被送入垃圾箱的标准如下:
- 未读邮件。
- 根据特定主题发送的电子邮件。
- 根据特定发件人发送电子邮件。
import imaplib
import getpass
username = input("Enter the email address: ")
password = getpass.getpass("Enter password: ")
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(username, password)
mail.select("INBOX")
删除所有未读邮件
以下代码会将所有未读邮件移至垃圾箱。由于邮件的保存期限为 30 天,Gmail 会在 30 天内将其从垃圾箱中移除。首先,我们搜索邮件,并将条件设置为“UNSEEN”(未读邮件的标记)。变量 result 是命令的退出代码,而 messages 是一个包含字节类型对象的列表。最后,我们遍历列表中的邮件,并将它们放入垃圾箱。
results, messages = mail.search(None, 'UNSEEN')
messages = messages[0].split()
for x in messages:
result, message = mail.store(x, '+X-GM-LABELS', '\\Trash')
mail.close()
mail.logout()
删除所有包含特定主题的电子邮件
在这里,我们使用所需的条件搜索选定的邮箱。您应该将"Title"以下代码中的 `<sub>` 替换为您所需的主题:
results, messages = mail.search(None, '(SUBJECT "Title")')
messages = messages[0].split()
for x in messages:
result, message = mail.store(x, '+X-GM-LABELS', '\\Trash')
mail.close()
mail.logout()
删除来自特定发件人的所有电子邮件
在这里,我们使用所需的条件搜索邮箱。请将"abc@xyz.com"以下代码中的 `<email address>` 替换为您常用的电子邮件地址:
results, messages = mail.search(None, '(FROM "abc@xyz.com")')
messages = messages[0].split()
for x in messages:
result, message = mail.store(x, '+X-GM-LABELS', '\\Trash')
mail.close()
mail.logout()
接下来我将简要介绍一下所使用的方法。
search()这是一个用于查找所选邮箱的方法,它接受两个参数:字符集和条件。字符集可以设置为 None。store()是用于更改消息的标志或标签的方法;它接受三个参数:消息、命令和标志。close()是用于关闭所选邮箱的方法。logout()是用于关闭与服务器连接的方法。'+X-GM-LABELS'标签被视为文件夹,因此可以使用 IMAP 命令对邮件进行更改。
如何使用 IMAPClient 永久删除电子邮件
在撰写本文的过程中,我偶然发现了 IMAPClient 库。从其官方文档中,我发现:“虽然 IMAPClient 实际上在底层使用了 Python 标准库中的 imaplib 模块,但它提供了不同的 API。”
使用 IMAPClient 删除邮件不会将邮件发送到垃圾箱,而是会永久删除。在使用此处任何代码片段之前,请务必确认您确实想要永久删除邮件。
IMAPClient 的初始代码
要使用 IMAPClient,您必须使用以下命令安装该软件包:
pip install imapclient
接下来,我们导入库并设置我们电子邮件地址的服务器。
from imapclient import IMAPClient
import getpass
server = IMAPClient('imap.gmail.com', use_uid=True)
username = input("Enter the email address: ")
password = getpass.getpass("Enter password: ")
server.login(username, password)
select_info = server.select_folder("INBOX")
本部分邮件被送入垃圾箱的标准如下:
- 未读邮件。
- 根据特定主题发送的电子邮件。
- 根据特定发件人发送电子邮件。
永久删除所有未读邮件
以下代码会永久删除所有未读邮件。
messages = server.search("UNSEEN")
for x in messages:
server.delete_messages(x)
server.logout()
永久删除所有包含特定主题的电子邮件
我们将使用所需的条件搜索选定的邮箱。请将"Title"以下代码中的 `<object>` 替换为您所需的主题:
messages = server.search(['SUBJECT', 'Title'])
for x in messages:
server.delete_messages(x)
server.logout()
永久删除来自特定发件人的所有电子邮件
我们会根据预设条件搜索邮箱。请将"abc@xyz.com"以下代码中的地址替换为您常用的邮箱地址:
messages = server.search(['FROM', 'abc@xyz.com'])
for x in messages:
server.delete_messages(x)
server.logout()
笔记
- 退出服务器很重要
- 在使用 IMAPlib 时,要访问所有电子邮件,请使用
mail.select('"[Gmail]/All Mail"'). - 请务必关闭安全性较低的应用程序。
- 制作本教程的过程中,很多电子邮件都受到了损害😂。
结论
我写这篇文章的时候很开心,希望你读的时候也一样。不过,我在编写脚本的过程中也遇到了一些错误。最常见的问题是,即使按照谷歌帮助页面上的说明操作,也无法登录。出现这个问题是因为我登录了多个Gmail帐户,而且我没有使用默认邮箱。如果你也遇到同样的问题,解决方法如下:
- 说明中写道:“如果以上提示没有帮助,请访问https://www.google.com/accounts/DisplayUnlockCaptcha并按照页面上的步骤操作。” 这将在新标签页中打开。
- 新标签页上的链接是“ https://accounts.google.com/b/0/DisplayUnlockCaptcha ”,其中数字 0 代表默认登录帐户。
- 请按列表顺序检查您的帐户,并相应地更改数字(例如,“1”是下一个电子邮件地址,依此类推)。
您可以在GitHub上找到完整的脚本。
感谢您阅读本教程!