在我真正使用 Linux 之前,我就对用 mutt 来处理邮件充满了兴趣,想想应该是受到了王垠的文章的影响。另外,UNIX 对我一直是神秘、有趣的代名词,我对 UNIX 传统的那些东西,比如 USENET 等,都非常有兴趣。UNIX 传统处理电子邮件的方法就挺有趣:把处理流程分开,每一步分别使用不同的软件,符合了 UNIX 的 KISS 原则。
所以,我在自己的电脑上安装了 Linux 之后,就开始配置 mutt 和 fetchmail、msmtp 等工具,用这个方法来处理邮件,一直到我的那台 Dell 笔记本坏掉为止。后来用了 MacBook,就换成了 Mail.app,没有再用 mutt 了。
这次我安装 ArchWiki 后,重新选择了 mutt,结果总是让我不习惯。原因是在我用 MacBook 期间,我接受了 Gmail 开始提供的邮件归档功能,把读过的邮件都进行归档,保持了收件箱为空。Mail.app 虽然默认没有在工具栏上提供这个按钮,但还是可以手动加上的。后来回国后,Gmail 不能正常访问,我换到了 QQ 邮箱。QQ 邮箱的评价还不错,而且 QQ 企业邮可以让我绑定我的域名,继续使用过去的邮箱。但是 QQ 邮箱没有归档功能,让我十分不习惯。然后经过探索,我得知了 Fastmail,他的收费版本可以让我绑定域名,也有归档功能。经过考虑与试用,我切换到了 Fastmail。之后我发现 iPhone 上的邮件应用没有归档功能,所以我经过查找,安装了 Spark。
就是这点让我这次使用 mutt 后感到不习惯。我用 fetchmail 把邮件交给 procmail 处理,放到 Maildir 后,mutt 读完了,没有归档功能,也没法再修改远程的邮件。所以之前我在 mutt 中读完了邮件后,只好去手机上把邮件归档。这让人很不爽,一是多了一步手续,二是服务器上归档了,可本地的邮件还在,我本地的收件箱中在几天攒了上百封邮件。我一直在搜索别人写的 mutt 经验,感叹要是我还在用 QQ 邮箱,也许配合 mutt 会更自然。前几天我看到有人用的 mutt 自带的接受、发送邮件的功能,只要把配置文件中的邮箱路径设置成“imaps://”就可以了,把 mbox 设置成归档邮箱,也可以达到归档的功能。我新建了一个配置文件,设置成功了,不过每次打开 mutt,都要等待它去检查新邮件,也有点让人烦。然后我看到了有不少人在使用 OfflineIMAP,之前我知道它跟 fetchmail、getmail 一样,是一个接受邮件的工具,但之前用过另两个,就没管它。这场试试吧。
结果随着我跟着文档配置,我在解决了 SSL 认证等问题后,可以让它抓取邮件了。我看别人的配置中,在抓取邮件时,自动把 Gmail 邮箱的前缀通过正则表达式替换给弄掉,我觉得 Fastmail 里所有邮箱都带着“INBOX.”前缀也可以这么给弄掉,于是就照抄了过去,结果下次运行失败,让我知道了 OfflineIMAP 竟然可以双向同步!这可是个大发现,这意味着我可以在本地进行处理邮件后,再同步到服务器上。归档邮件就是把邮件移动到 INBOX.Archive 邮箱,删除就是移动到 INBOX.Trash 邮箱,标记垃圾邮件就是移动到 INBOX.Spam,设置 postpone 为 INBOX.Sent,就可以保留发信记录,真是太好了!
接下来就是查阅 mutt 文档,添加这些功能。之前我为了图方便,没有研究这些复杂的功能,也觉的不需要,现在加上了不少。同时,还添加了一些快捷键,模仿 Gmail 的操作,比如可以按 gi 跳到收件箱中,还有些 Emacs 风格按键,比如 Ctrl+f 向后翻屏等。弄好后一试,果然成功。
之后还有一步,就是让 OfflineIMAP 定期同步。我看网上介绍了几种思路:ArchWiki 的思路是让 OfflineIMAP 以守护进程运行,定期收取,用 Systemd 自动启动;别人的博客上的思路是每次通过 -o 参数,让 OfflineIMAP 只运行一次,配置 Systemd 来让 OfflineIMAP 自动运行;还有是同样的思路,只是改用 Cron 来让 OfflineIMAP 自动运行。之前我用 fetchmail 的时候,就是守护进程,当中发生过收取邮件不及时的情况。所以这次想用系统来管理重复运行。我过去用过 Cron,但 Systemd 还是安装了 ArchLinux 后才第一次听说,过去以为是 Init 的代替品,没想到还可以用作自动执行。因为用 Cron 还要安装软件,因此我想试试 Systemd。
我先按照 ArchWiki 的说明来弄,只好一直启动不成功,看了 log,OfflineIMAP 被 root 来执行,自然从 root 的目录里找配置文件,找不到就报错了。之后我按照别人的博客上的做法,创建了 service 后又创建 timer,然后启动 timer。启动似乎成功了,但一直不能正确运行。最后 OfflineIMAP 的 -a 参数让我有点困惑,不清楚后面跟的是 Linux 的用户名还是 OfflineIMAP 的配置文件里的配置名。之后找了一些 Systemd timer 的例子,虽然没有解决问题,但对 Systemd 的配置有了更深刻的理解。这时我又看了 ArchWiki 的介绍,才发现了之前我忽略了 offlineimap@ 的问题,原来可以从这里指定用那个用户来执行 Systemd 的服务。我加上了用户名后,结果运行正常了。通过几轮测试,终于圆满的解决了处理电子邮件的功能。
因为了解了 Systemd 如何开机自动执行服务,我把 Shadowsocks 客户端也一并用 Systemd 来管理了。这才发现,Systemd 简直管理了 ArchLinux 的所有提供服务的软件,Shadowsocks 和 OfflineIMAP 都在 /usr/lib/systemd/system/ 目录下有相关的配置,没有特殊需求,直接就可以使用。我还了解了 Systemd 有普通用户用的服务管理,等研究一下让它给我启动 MPD。