1. 基本使用
OfflineIMAP 可以直接在两个 IMAP 服务同步数据。安装 OfflineIMAP (绝大多数 linux 发行版自带这个包,或者从 GitHub 下载最新版本)之后,编辑 ~/.offlineimaprc 文件,类似如下内容:
# Sample minimal config file. Copy this to ~/.offlineimaprc and edit to
# suit to get started fast.
[general]
socktimeout = 30
accounts = Test
[Account Test]
localrepository = Local
remoterepository = Remote
[Repository Local]
type = IMAP
remotehost=imap.gmail.com
remoteuser=some_user@some_domain.com
remotepass=some_user_password
ssl=yes
realdelete=no
folderfilter = lambda folder: True if folder in ['INBOX', 'Drafts', 'Sent'] else False
[Repository Remote]
type = IMAP
remotehost=imap.some_imap_server.com
remoteuser=some_user@some_domain.com
remotepass=some_user_password
ssl=yes
realdelete=no
folderfilter = lambda folder: True if folder in ['INBOX', 'Drafts', 'Sent'] else False
# suit to get started fast.
[general]
socktimeout = 30
accounts = Test
[Account Test]
localrepository = Local
remoterepository = Remote
[Repository Local]
type = IMAP
remotehost=imap.gmail.com
remoteuser=some_user@some_domain.com
remotepass=some_user_password
ssl=yes
realdelete=no
folderfilter = lambda folder: True if folder in ['INBOX', 'Drafts', 'Sent'] else False
[Repository Remote]
type = IMAP
remotehost=imap.some_imap_server.com
remoteuser=some_user@some_domain.com
remotepass=some_user_password
ssl=yes
realdelete=no
folderfilter = lambda folder: True if folder in ['INBOX', 'Drafts', 'Sent'] else False
注意以上配置文件中,我设置了 timeout 参数。OfflineIMAP 默认的 timeout 是 None,表示除非服务器端明确断开网络连接,否则它会一直等,等到天荒地老。。所以建议还是设置一个 30~60 秒之间的 timeout 值比较可靠。
之后直接执行 offlineimap 指令,就会按照配置文件中的设置启动同步过程。更详细的配置文件说明参考 官方文档 ,以及随源代码的示例 conf 文件(Debian 下这个示例文件在 /usr/share/doc/offlineimap/examples/offlineimap.conf.gz )。
2. 让同步过程更健壮
由于网络等原因,OfflineIMAP 崩溃的概率挺高的,而且如果是希望持续保持同步状态的话(也即被同步的两端都有可能有新操作),那么需要在其崩溃时自动重启,其中一个办法是可以用如下脚本来调用 OfflineIMAP 。
#!/bin/ksh
# remove any old instances of this shell script or offlineimap
for pid in $(pgrep offlineimap)
do
if $pid -ne $$
then
kill $pid
fi
done
# wait for compiz (or whatever) to start and setup wifi
sleep 20
# If offlineimap exits, restart it
while true
do
( exec /usr/bin/offlineimap -u Noninteractive.Basic )
sleep 60 # prevents extended failure condition
done
# remove any old instances of this shell script or offlineimap
for pid in $(pgrep offlineimap)
do
if $pid -ne $$
then
kill $pid
fi
done
# wait for compiz (or whatever) to start and setup wifi
sleep 20
# If offlineimap exits, restart it
while true
do
( exec /usr/bin/offlineimap -u Noninteractive.Basic )
sleep 60 # prevents extended failure condition
done