Fork me on GitHub

How to Delete Quite A Large Amount of Mails in Gmail/如何删除 Gmail 中的大量邮件

最近受到了 Gmail 的困扰,由于订阅了大量 Sentry 报警邮件,邮箱被塞满了(30G),看了下 Sentry 的邮件大概有 30W+ 封。本以为用 Gmail 自带的“选择所有会话”然后删除的功能,能方便地清空邮件,但是发现 Gmail 似乎有并发上的限制(一次只能删除100封邮件?),每次点击删除就会弹出“无法删除邮件”的错误提示,很是烦。

去网上搜索了好久,大部分都是使用 Gmail 网页版删除,途径不外乎 Filter/自己选 这两种,我试了下用 Filter 把删除应用于所有会话,发现并没有什么反应。

看起来 Gmail 的网页版功能限制还是有不少的,这条路行不通了。于是我又找了一下别的办法,终于被我找到一个好用的:在Gmail中定期删除邮件 | Leona+ ,尝试用了一下真的太牛逼了,赞。简而言之是使用了 Google App Script 以及 Gmail 的 API,在不超过 Gmail 并发限制的前提下批量删除邮件。直接照着撸了一个简单暴力的:

1
2
3
4
5
6
7
8
function myFunction() {
var label = GmailApp.getUserLabelByName("sentry")
while (true) {
var threads = label.getThreads(0, 100)
GmailApp.moveThreadsToTrash(threads)
Utilities.sleep(10)
}
};

用到的功能不算太多,先通过 GmailApp.getUserLabelByName 获取到 GmailLabel Object,然后再循环获取该 label 下的前100个会话(因为这里的 API 也是有并发限制的,超过100就会有错误提示),获取之后将其移动到垃圾箱中,最后 sleep 一段时间。但是这里的脚本并不是能够一直执行直到 label 清空的,一般会在 360s 左右超时。所以又为项目添加了触发器(类似于 Cron 的 trigger),每10分钟跑一次。虽然慢一点但是因为不需要持续前台查看,挂着删也没什么关系。现在已经删了大概有一半了(16w)。

因为 Gmail 的垃圾箱也是有时效的,在垃圾箱超过30天的邮件会被自动删除,所以根据原博主的方法,再为 Script 增加一些功能,比如判断超过一定天数的直接放到垃圾箱,再借助垃圾箱自己的清理功能,应该能把有大量邮件的情景很好地管理起来。