容器化邮件转发

一直使用的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!即可。

Tasker任务二则

Tasker是个神器,支持一键(甚至全自动)完成复杂的、涉及多个手机程序的任务。前提是,程序要支持tasker。用过tasker之后,再看那些不支持tasker的app,简直就是半成品!

Macronos for Sonos有种相逢恨晚的感觉,买下之后,顺手创建两个tasker任务,生活顿时美好了许多!

先说一下早上锻炼的流程:

  1. Time Recording程序里check in,
  2. Sonos Play 5播放音乐,
  3. 热身
  4. 使用Sonos Controller for Android调高音量,不然跑步的时候完全听不到,
  5. 跑步机上跑步,
  6. 音量调回到正常,
  7. 力量练习,
  8. 停止播放音乐,
  9. Time Recording程序里check out。

使用Tasker + Macronos for Sonos之后的流程:

  1. 点击手机主屏上的Workout图标,这会启动一个tasker任务,它会自动完成之前的步骤1到步骤6(定时调节音量),
  2. 热身、跑步、力量练习,
  3. 再次点击Workout图表,完成步骤8和步骤9。

homescreen

晚上睡觉的流程就更复杂了,tasker任务的实现也更加复杂,首先看看任务流程。

首先酝酿睡眠气氛(点击Bedtime图标):

  1. 启动tasker任务自动打开Sonos Play 3播放舒缓音乐,
  2. Philips Hue灯泡调成暗红色(下图任务4,使用AutoHue)。

再次点击Bedtime图标,关灯睡觉,监控睡眠。

Bedtime播放音乐子任务流程如下:

  1. 使用Macronos for Sonos从5个播放列表里面随机选择一个,
  2. 随机循环播放其中的音乐。

play relaxed music

正式睡觉子任务流程如下:

  1. 调低Sonos Play 3音量,
  2. 设置15分钟倒计时停止播放音乐,
  3. 启动Sleep as Android监控睡眠,
  4. 等待两分钟,
  5. 关闭所有Philips Hue灯泡。

start sleep tracking拥有tasker,美好生活,触手可及!