如何删除所有不在重要或已发送文件夹中的邮件?

4 投票
2 回答
551 浏览
提问于 2025-04-18 17:06

我的邮箱里有很多邮件,数量比“重要邮件”和“已发送邮件”里的还要多。我想把所有不在“重要邮件”或“已发送邮件”里的邮件都删除掉。

我不能做以下几件事:
1) 删除“全部邮件”里的所有邮件,因为这样一来,“重要邮件”和“已发送邮件”里的邮件也会一起被删掉。
2) 也不能从“重要邮件”和“已发送邮件”里复制邮件。

我该怎么写代码来实现这个目标呢?这个问题可以换个说法:

我怎么才能把我的 Gmail 邮箱中的邮件:“[Gmail]/&kc 2JgQ-”复制到本地的 g:\mygmail 目录里?

我在我的 Gmail 收件箱里有 5 封邮件,我把它们都保存到 g:\mygmails,并且用以下代码命名为 0th.myemail、1th.myemail、2th.myemail、3th.myemail 和 4th.myemail。现在我该怎么用 Thunderbird 或其他邮件软件来读取这些邮件?我不想自己写代码来读取它们。

import email,imaplib
att_path="g:\\mygmails\\"
user="xxxx"
password="yyyy"
con=imaplib.IMAP4_SSL('imap.gmail.com')
con.login(user,password)
con.select('INBOX')
resp, items = con.search(None, "ALL")  
items = items[0].split() 
for id,num in enumerate(items):
    resp, data = con.fetch(num, "(RFC822)") 
    data=data[0][1]
    fp = open(att_path+str(id)+"th"+".myemail", 'wb')
    fp.write(data)
    fp.close()

2 个回答

0

如果你喜欢 Windows PowerShell,我有一个可以轻松重复使用并根据你需要进行定制的解决方案。你可以设置邮件用户代理,使用网络访问API来自动化这个任务。在我的例子中,老牌的PowerShell(我们都知道,它是微软的任务自动化和配置管理框架)结合它的无头IE功能(这让它可以像后台程序一样工作,只有在满足特定条件时才会和我们沟通)能够支持这一切。
更具体地说,如果你需要登录并使用防火墙的网络访问API,实施起来几乎是一样的。所以我们可以一举两得——每天早上你就能在防火墙后面,了解你的邮件内容。这里你可以看到一个示例 解决方案

3

经过一番在谷歌上的搜索,我发现了一个GitHub上的项目,这个项目提供了一个模块,可以实现这个功能。虽然文档不是很完善,但源代码非常容易理解,所以这并不算什么大问题。

使用这个模块时,你可以加载每封带有指定标签的邮件,并给它们标记为需要保存的,然后再查看所有邮件,删除那些没有被标记的邮件。

目前我没有找到一个自然的方法来标记远程服务器上的邮件,所以你可能需要实现一个方法,把邮件记录为字符串,并存储在一个set中。

如果你还有任何问题,可以在这个回答下留言,我可以进一步解释。

举个例子:如果你想把某个邮箱的邮件复制到一个Python的数据结构中,可以这样做:

# Global Variables
username, password, mailboxname = '', '', '[Gmail]/&kc 2JgQ-'

# Set up
import gmail
g = gmail.Gmail()
g.login(username, password)

# Actual code.
emails = []
for email in g.mailbox(mailboxname).mail():
    emails.append(email.fetch())

# Tear down.
g.logout()

假设你相应地调整了全局变量,现在你就有了一个Python列表(在Python变量emails中),里面包含了Gmail账户usernamemailboxname中的所有邮件。一旦你有了这个,你就可以轻松地进行像保存到文件这样的操作。

撰写回答