在 Windows 上用 Emacs+offlineimap+mu4e 查收邮件
本文介绍如何在 Windows 上用 Emacs、mu4e 和 offlineimap 下载邮件,本地索引,快速查看。并且支持中文字符的邮箱文件夹。虽然步骤不复杂,但是在 Windows 上实现这些,应该是全网首创了。
上个周末在家里的 macOS 配置好了 mu4e+offlineimap,用起来很快捷方便,周一一早在公司的 Windows PC 上试着设置下。没想到能调好,我还是挺惊喜的。
以下设置主要参考了这篇文章:https://frosch03.de/blog/2016/05/mu4e-within-cygwin.html
1 准备工作
- 下载安装 cygwin https://www.cygwin.com/setup-x86_64.exe
在 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