01 April 2019

本文介绍如何在 Windows 上用 Emacs、mu4e 和 offlineimap 下载邮件,本地索引,快速查看。并且支持中文字符的邮箱文件夹。虽然步骤不复杂,但是在 Windows 上实现这些,应该是全网首创了。

上个周末在家里的 macOS 配置好了 mu4e+offlineimap,用起来很快捷方便,周一一早在公司的 Windows PC 上试着设置下。没想到能调好,我还是挺惊喜的。

以下设置主要参考了这篇文章:https://frosch03.de/blog/2016/05/mu4e-within-cygwin.html

1 准备工作

在 cygwin 中安装:

  • emacs-w32 (26.1.92)
  • git (2.17.0)
  • autoconf (13-1)
  • automake (10.1)
  • libtool (2.4.6-6)
  • gcc-g++ (7.4.0-1)
  • pkg-config (1.6.0-1)
  • make (4.2.1-2)
  • mingw64-x86_64-win-iconv (0.0.6-2)
  • libglib2.0-devel (2.54.3-1)
  • libgmime3.0-devel (3.0.5-1)
  • libxapian-devel (1.4.5-1)
  • python2 (2.7.16-1)
  • python27-pip (19.0.3-1)
  • offlineimap (6.5.5-1)

最快捷的方式是通过 apt-cyg 安装:

apt-cyg install emacs-w32 git \
        autoconf automake libtool \
        gcc-g++ pkg-config make mingw64-x86_64-win-iconv \
        libglib2.0-devel libgmime3.0-devel \
        libxapian-devel python2 python27-pip offlineimap

2 下载 mu 源码

git clone https://github.com/djcb/mu.git

3 编译 mu

参考 Compiling mu 部分:https://frosch03.de/blog/2016/05/mu4e-within-cygwin.html

其中不少步骤可以省去,仅需执行以下命令:

ln -s /usr/x86_64-w64-mingw32/sys-root/mingw/include/iconv.h /usr/include/iconv.h

不然编译出错:

In file included from /usr/include/gmime-3.0/gmime/gmime.h:29:0,
                 from mu-msg-priv.h:29,
                 from mu-msg-crypto.c:27:
/usr/include/gmime-3.0/gmime/gmime-iconv.h:26:10: 致命错误:iconv.h:No such file or directory
 #include <iconv.h>
          ^~~~~~~~~
编译中断。

编译并安装 mu:

cd mu
autoreconf -i
./configure
make
make install

4 准备 python lib

pip2 install six portalocker

5 修改 offlineimap

由于 cygwin 上 6.5.5-1 版本的 offlineimap 对邮件的中文文件夹支持不好,需要最新版的 offlineimap,但是最新版又需要 fcntl 库,而 Windows 上支持的又不好,所以改用可移植版的文件锁 portalocker。

简单做了一个 patch:https://github.com/kimim/offlineimap/commit/94ce99ac9c0b4c5653fe46339feb525571d734a5

try:
-    import fcntl
+    import portalocker
except:
    pass # Ok if this fails, we can do without.

@@ -232,7 +232,7 @@ def __lock(self):

        self._lockfd = open(self._lockfilepath, 'w')
        try:
-            fcntl.lockf(self._lockfd, fcntl.LOCK_EX|fcntl.LOCK_NB)
+            portalocker.lock(self._lockfd, portalocker.LOCK_EX)
        except NameError:
            #fcntl not available (Windows), disable file locking... :(
            pass
@@ -250,6 +250,7 @@ def _unlock(self):

        #If we own the lock file, delete it
        if self._lockfd and not self._lockfd.closed:
+            portalocker.unlock(self._lockfd)

最简单的方法是 clone 我的修改,然后将 offlineimap 替换掉:

git clone https://github.com/kimim/offlineimap
rm -rf /lib/python2.7/site-packages/offlineimap
cp -r offlineimap/offlineimap /lib/python2.7/site-packages/offlineimap

6 设置.offlinemaprc 和 mu4e

其他设置参考:http://kimi.im/2019-03-31-emacs-offlineimap-mu4e-mail-client

~/.offlineimaprc 如下:

[general]
accounts = outlook
maxsyncaccounts = 3

[Account outlook]
localrepository = outlook-Local
remoterepository = outlook-Remote
utf8foldernames = True

[Repository outlook-Local]
type = Maildir
localfolders = ~/.mail/outlook

[Repository outlook-Remote]
type = IMAP
remotehost = imap.partner.outlook.cn
remoteuser = <your mail address>
remotepass = <your password>
ssl = true
sslcacertfile = /etc/ssl/certs/ca-bundle.crt
maxconnections = 1
realdelete = yes

7 大功告成

然后,就可以在 emacs-w32 下快乐的收发邮件了。macOS 上设置 emacs + mu4e + offlineimap 请参考:http://kimi.im/2019-03-31-emacs-offlineimap-mu4e-mail-client