Messages

Client : mutt

Sync : offlineimap, isync

Search : notmuch

Contacts

Client : goobook

~/.pim/markferry.net/goobookrc

[DEFAULT]
# If not given here, email and password is taken from .netrc using
# machine google.com
email: blah@markferry.net
password: "My obvious password"
# or if you want to get the password from a commmand:
;passwordeval: gpg --batch -d ~/.mutt/pw.gpg
# The following are optional, defaults are shown
cache_filename: ~/.pim/markferry.net/goobook_cache
;cache_expiry_hours: 24
;filter_groupless_contacts: yes

Offline

Mutt IMAP isn't available offline. Configure offlineimap mbsync and notmuch.

mbsync / isync

https://wiki.archlinux.org/index.php/Isync

(%i is the subdirectory of the user home %h - required to support multiple separate mail accounts.)

[Unit]
Description=Mailbox synchronization service

[Service]
Type=oneshot
ExecStart=/usr/bin/mbsync -c %h/%i/config/isync/mbsyncrc -V -a
# a script to classify messages (optional)
ExecStartPost=%h/%i/config/notmuch-hook.sh

Sync flags when flags are changed locally by watching the notmuch directory:

~/.config/systemd/user/mbsync@.path

[Path]
PathChanged=%h/%i/mail/.notmuch

[Install]
WantedBy=default.target

Finally, sync flags when flags are changed remotely with a timer:

~/.config/systemd/user/mbsync@.timer

[Unit]
Description=Mailbox synchronization timer

[Timer]
OnBootSec=2m
OnUnitActiveSec=10m
Unit=mbsync@%i.service

[Install]
WantedBy=timers.target

offlineimap

~/.offlineimaprc example:

[general]
accounts = markferry # comma separated
maxsyncaccounts = 3
pythonfile = ~/.auth.py # see below

[Account markferry]
localrepository = markferry_Local
remoterepository = markferry_Remote
status_backend = sqlite
autorefresh = 5
quick = 15

[Repository markferry_Local]
type = Maildir
localfolders = ~/mail
keepalive = 180
holdconnectionopen = yes

[Repository markferry_Remote]
maxconnections = 1
type = Gmail
#cert_fingerprint = 85dd311c4a1dbcda6fb53e46004386861844ed2e  # disable explicit cert
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remoteuser = blah@markferry.net
remotepasseval = auth['blah@markferry.net']
realdelete = no
folderfilter = lambda foldername: foldername not in ['[Google Mail]/All Mail', '[Google Mail]/Spam']

.auth.py

A little python dictionary of credentials to isolate it from the rest of the (version-controlled) configs

~/.auth.py:

auth = dict()
auth['blah@markferry.net'] = 'My obvious password'

offlineimap-watchdog

Adapted for bash from the offlineimap FAQ

#!/bin/sh
# remove any old instances of this shell script or offlineimap
for pid in $(pgrep offlineimap)
do
    if  [ $pid -ne $$ ]
    then
        kill $pid
        echo killed old process: $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 quiet )
    sleep 60 # prevents extended failure condition
done

Links