使用 Docker Compose 构建 Emacs 邮件客户端

首先使用 Docker Compose 配置邮件客户端的好处是:

  1. 便携: 将自己的 Emacs 以及环境浓缩成一个文件,足够的轻量便携。
  2. 一键部署: 使用 Docker 能够让我的 Emacs 环境一键搭建,比较方便,无需考虑平台之间的差异,外部依赖等。
  3. 酷: 由于我经常在不同设备之间使用自己的 Emacs , 使用 Docker 是能够无缝迁移到多个平台,这种满足感足够驱动我去折腾这一套方案。

具体的方案是使用:

  • Window 10
  • docker
  • silex/emacs 基础镜像
  • offlineimap 自己构建镜像,邮件接收
  • mu & mu4e
  • vcxsrv 图形化方案 X Server

docker-compose 描述的一个集群结构如下,通过共享 Volume 来让邮件服务默默同步邮件

因为我们大部分 Emacs 玩家都有一份自己的 Emacs 配置,所以在启动 Container 之前需要构建我们自己的镜像

Emacs Dockerfile

FROM silex/emacs
COPY sources.list.txt /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y git maildir-utils mu4e
RUN git clone https://github.com/Qquanwei/emacs.git /root/.emacs.d

ENV DISPLAY=10.0.75.1:0

ENTRYPOINT ["emacs"]

解释两行:

第三行: 在 Emacs 中使用 mu4e 需要安装 mu (上面的maildir-utils) 读取邮件索引。下面的 offlineimap 中我们也会安装 mu 用来建立邮件索引。

第四行: 因为我使用 gui 版本的Emacs, 所以这里提供一个 X Server 的环境变量,这里的 IP 是我宿主机器的 ip, :0 表示的是自动获取端口号。如果不需要使用 GUI 可以跳过这个配置。

另外在Emacs配置文件中还需要加上下面一句配置用来检测当安装了mu4e时启用mu4e.

mu4e是通过 apt 安装的,无法通过 use-package 自动安装。
(require 'f)
(when (f-exists-p "/usr/share/emacs/site-lisp/mu4e/mu4e.el")
  (add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
  (require 'mu4e))

Offlineimap Dockerfile

FROM debian

COPY debian.sources.list.txt /etc/apt/sources.list

RUN apt-get update
RUN apt-get install maildir-utils offlineimap ca-certificates -y
RUN update-ca-certificates
# 拷贝本地配置到镜像里
COPY offlineimaprc /opt/

ENTRYPOINT ["offlineimap", "-c", "/opt/offlineimaprc"]

这个镜像没什么好说的,配置了一个默认的 entry point 用来启动服务。offlineimaprc文件如下:

[general]
accounts= 126
maxsynccounts = 2

[Account 126]
localrepository = Local126
remoterepository = Repository126
autorefresh = 5
quick = 10
postsynchook = mu index --maildir /Maildir

[Repository Local126]
type = Maildir
localfolders = /Maildir/126

[Repository Repository126]
type = IMAP
ssl = yes
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
maxconnections = 2
remotehost = imap.126.com
remoteuser = youraccount@126.com
remotepass = passxxxxxxxxxxx


Docker Compose

接下来用Docker Compose来将容器连接起来,主要用来描述容器所需要的启动参数以及用到的volumes。

配置如下:

version: "3"
services:
  emacs:
    build: 
      context: ./
      dockerfile: emacs.dockerfile
    volumes: 
      - mail:/root/Maildir
      - muindex:/root/.mu
  offlineimap:
    build:
      context: ./
      dockerfile: offlineimap.dockerfile
    volumes: 
      - mail:/Maildir
      - muindex:/root/.mu

volumes:
  mail:
  muindex:
  mailsecrets:

完成之后基本上就无需其他配置了:

docker-compose -f ./docker-compose.yml up

启动这个 swarm 之后如果开启了 Vcxsrv的话 Emacs 就直接启动了,offlineimap 在后台同步邮件,同步完成之后会自动用 mu 建立索引。

这里我的配置好像出了点问题,没有显示快捷键提示,例如 U 是 update, j 是 jump, b 跳转到常用功能,如bu 代表未读邮件.

第一次同步完成之后,在 Emacs 中 `M-x mu4e` 然后按 U 更新 email , 然后 bu 进入未读邮件

到这里基本的配置就算完成了,除了邮件密码还没有实现自动化之外其余部分都实现了一键部署。[留坑]

致谢:

因为家里的网实在是太差了,国外的源连接速度很慢,所以感谢下面这些免费的服务提高了我们的生活质量

阿里 ubuntu source list:  https://opsx.alibaba.com/mirror
debian sources generater: https://debgen.simplylinux.ch/index.php?generate


最后本次配置所需要的所有内容地址:

Qquanwei/docker-emacs-emailgithub.com图标

编辑于 2019-04-08