容器化邮件转发

一直使用的docker容器突然不能启动了,只好重做一个,顺便翻出2014年底写的草稿,改一改发出来。

公司的邮件系统是MS Exchange + MS Outlook,我的工作环境是Ubuntu + Emacs,任务管理使用org-mode。这里有一点不和谐之处——不能从Emacs里面直接读取公司邮件。

之前的解决方案是在Ubuntu上架一个courier-imap服务器,然后在Outlook里创建规则把邮件复制过去。

但是这个方案有个致命缺陷,当Outlook无法连接IMAP服务器,复制规则就会出错然后被禁用。导致我老是要在笔记本离开公司内部网络时先关掉Outlook。最常见的情况就是去开会,这时通常使用无线网络,但是无线网络不属于公司内网,尽管Outlook能够继续收邮件,但是没法连接到Ubuntu机器上的imap服务器。

于是我就在笔记本电脑上安装了boot2docker,运行一个docker容器,容器里面运行一个用于缓存邮件的IMAP服务器,并定时运行imapsync同步邮件。如果笔记本离开公司内网,imapsync就会同步失败,这时邮件缓存在笔记本电脑里,直到连上公司内网。

上次创建的时候完全是手工操作,这次重新开始,boot2docker已经更名为Docker for Windows,我也能够写出一个Dockerfile自动化构建容器。

FROM debian:latest

RUN echo "root:Docker!" | chpasswd
RUN apt-get -y update -qq && \
  echo 'courier-base courier-base/webadmin-configmode boolean false' | debconf-set-selections && \
  apt-get -y install gamin courier-imap courier-imap-ssl unzip wget \
    libauthen-ntlm-perl \
    libcrypt-ssleay-perl \
    libdigest-hmac-perl \
    libfile-copy-recursive-perl \
    libio-compress-perl \
    libio-socket-inet6-perl \
    libio-socket-ssl-perl \
    libio-tee-perl \
    libmodule-scandeps-perl \
    libnet-ssleay-perl \
    libpar-packer-perl \
    libreadonly-perl \
    libterm-readkey-perl \
    libtest-pod-perl \
    libtest-simple-perl \
    libunicode-string-perl \
    liburi-perl \
    cpanminus make
RUN cpanm Data::Uniqid Mail::IMAPClient
RUN mkdir ~/imapsync && cd ~/imapsync && \
  wget https://github.com/imapsync/imapsync/archive/master.zip && \
  unzip *.zip && maildirmake ~/Maildir

EXPOSE 143 993

CMD /etc/init.d/courier-authdaemon start; \
  /etc/init.d/courier-imap start; \
  while true; \
  do ~/imapsync/imapsync-master/imapsync \
       --host1 localhost --user1 root --password1 "Docker!" --delete \
       --host2 example.com --user2 me --password2 "blahblahblah" -ssl2 >/dev/null 2>&1 ; \
     sleep 300; \
  done

构建命令

docker build -t emailfw .

运行时需要映射端口

 docker run -d -p 6666:143 -p 6667:993 --name emailfw emailfw:latest

然后在Outlook里面设置邮件服务器地址为192.168.99.100,端口为6666,用户名root,密码Docker!即可。

Goals are for Losers

“Goals are for losers. Systems are for winners.”

— Scott Adams

Scott Adams在他的书——《How to fail at almost everything but still win big》——中分析了目标和系统的区别。

这让我想起了《Getting Things Done》里面说到GTD是一个系统。按照我的理解,GTD包含两个部分,一个目标体系,和一套实现目标的方法。

从2009年开始,我坚持实践、改善GTD系统,但是对目标体系,总是感到困惑。

最容易的是短期工作目标,因为都是老板分派的。中长期的目标呢?比如今年达到什么目标,五年之后,甚至十年之后的目标是什么?

我一度没什么目标,得过且过。老板给加薪,就拿着;不给,就忍着。只是这样的态度哪里需要什么系统。后来学着别人做新年决心 (new year resolution),开始几年一塌糊涂,几乎全部烂尾。

公司在绩效考评之后,一般都要制定下一年的工作目标,甚至还有具体的要求,比如S.M.A.R.T标准。然而不管怎么搞,总是形同虚设的感觉。不是我不明白,这世界变化快。用不了多久,这些目标不是不再需要,就是让人毫无兴致。

究其原因,无非是这些目标并不是“我的”目标。我的目标早就实现了。对一个没有追求的人,这很容易,稍微一努力就够了,呵呵。

不管目标远大还是渺小,实现之后的感觉,都是差不多的吧:空虚、迷茫、手足无措。不同的是如何面对这种情绪。我能忍受这种浑浑噩噩的状态,今朝有酒今朝醉,明日愁来明日忧!

做爸爸,是一个转折点。希望儿子能超越自己,希望把自己会的都教给他,不会的学会了也教给他。就这样,目标一点一点地涌现出来。今年年初制定的目标,进度超乎想像,几乎都有进展。

然而一个急性子,每天盯着五年计划十年计划,心急如焚,恨不得一口吃个胖子,赶紧都实现了。比如还贷计划,总想在原有提前还款计划之外再多还一些,加快还款进度,结果把自己搞得很苦。

就在这痛并快乐着的时候,听了Scott Adams的How to fail at almost everything but still win big,说Goals are for losers……

合着我折腾了半天,反而成了loser!