木匣子

Web/Game/Programming/Life etc.

以 Maildir 方式备份邮件

2023 年就这么过去了。AIGC 的出现让很多事情发生了改变。我使用搜索引擎的频率急剧降低,连查阅维基百科的次数也少了很多。AI 使得学习一些新的领域的门槛变得非常低,虽然它帮我打开了探索新世界的大门。但另一方面,不知道为什么我的表达欲也下降了很多。我觉得很多东西不再需要记录。大部分东西已经埋藏在那几千万亿的参数里。

十二月底,我没有像以往一样做点年终总结。相反,我翻了翻很多以往留下的文字、项目的备份。清理了网盘、NAS,把没用的东西都删除掉了。

有一些老帐号上的邮件我想把它们下载到本地,打包备份起来。我没像以往打开 Google 搜索别人总结的备份方案。而是很自然地打开 ChatGPT,询问了常见的邮件备份格式,其中 MailDir 以它及其简洁的方案吸引了我。只需要建立一个目录,里面再建三个空目录cur, new and tmp 即可。

Mails
└── your-account
    ├── cur
    ├── new
    └── tmp

然后 ChatGPT 还向我推荐了一些常用的支持 MailDir 的邮件备份工具,我选中了简单易用的 Getmail6 (v6 是使用 python3 实现的版本)。同时 ChatGPT 还根据我的需求提供了相应的 POP3 配置案例: ~/.config/getmail/getmailrc

[retriever]
type = SimplePOP3Retriever
server = your.pop3.server.here
username = your_username_here
password = your_password_here
port = 110

[destination]
type = Maildir
path = ~/Mails/your-account-folder

[options]
read_all = false
delete = false

配置完后,在终端运行 $ getmail 即可开始下载邮件,因为配置了 read_all = falsedelete = false 所以是纯备份模式,服务器上的邮件不会被改动。运行期间如果主动 Ctrl-c 终止运行,getmail 会将已下载的邮件 id 写入到 ~/.config/getmail/oldmail-host-port-your-accout 文件中,避免下次运行的时候重复下载。

但是如果期间出现服务器连接超时,getmail 似乎没能将缓存的数据写入文件中。这会导致重新运行 getmail 会重复下载邮件。以往遇到这样的事,往往要花很多时间去想办法处理。但现在有 ChatGPT,我只需要简单描述一下应当如何清理重复的邮件,它很快便能编写出一段 Shell 脚本来完成任务,用后即扔。

#!/bin/bash

# 创建一个空的临时文件来存储 Message-ID 和文件名的映射
temp_file=$(mktemp)

# 递归地遍历包含邮件的目录及其子目录
find /path/to/your/emails/ -type f -print0 | while IFS= read -r -d '' file; do
    # 提取 Message-ID 并将其与文件名一起添加到临时文件
    msg_id=$(grep "Message-ID:" "$file" | cut -d ' ' -f 2)
    echo "$msg_id $file" >> "$temp_file"
done

# 对临时文件进行排序
sort "$temp_file" -o "$temp_file"

# 使用 awk 处理重复的 Message-ID,保留第一个,删除其余的
awk '{if ($1 != last) {last = $1; next} print $2}' "$temp_file" | xargs rm

# 清理临时文件
rm "$temp_file"

花絮:ChatGPT 第一次给我的脚本会把所有重复的文件都删除,一个副本也没有留下。不过我在 Review 代码的时候特地留心看它怎么处理这个问题,结果发现它没处理。于是让它马上纠正了。

经过一个多小时,总算把 1500+ 邮件备份到本地了。中间清理重复邮件也算顺利。每个邮件正文和附件使用 MIME 格式以文本的形式存在 MailDir 的目录中。但是要怎么浏览它们呢?ChatGPT 向我推荐了一些命令行工具,其中 NeoMutt 深得我心。虽然 NeoMutt 客户端也可以配置邮件服务器进行收发邮件,但是我只需要它的浏览 MailDir 的功能。最重要的是,它可以零配置直接使用:

$ neomutt -f ~/Mails/your-account

NeoMutt 是一个纯命令行工具,非常易用。它还能帮你将 MIME 里的邮件附件导出到文件系统。超级给力!

ChatGPT 在我不熟悉的领域提供了极大的帮助,也改变了我的工作流程。2024年,期待 AIGC 更强大的功能。