A generator that updates cert_fingerprint lines in .offlineimaprc configuration file. OfflineIMAP is a GPLv2 software to dispose your mailbox(es) as a local Maildir(s), which can be used with notmuch to retrieve mail from (several) IMAP servers and read and search through it.

The configuration contains cert_fingerprint lines to store certificates, which get outdated frequently and need to be updated. The updating is a bit of a hassle, hence this automated solution, which generates a .offlineimaprc file from a template file .offlineimaprct (created by you).

# GUIs, TUIs and CLUIs

Although I strongly adhere to the “when there a TUI, don’t use a GUI and when there’s a CLUI, don’t use a TUI” adage, there are good GUIs for web browsing and e-mail. But OfflineIMAP creates a great local backup of the e-mails on your server, which can be searched through very fast using notmuch.

# Turtle and openssl

## Turtle

Turtle is a reimplementation of the Unix command line environment in Haskell so that you can use Haskell as a scripting language or a shell. Think of turtle as coreutils embedded within the Haskell language.

## openssl

OpenSSL is a robust, commercial-grade, full-featured Open Source Toolkit for the Transport Layer Security (TLS) protocol formerly known as the Secure Sockets Layer (SSL) protocol. The protocol implementation is based on a full-strength general purpose cryptographic library, which can also be used stand-alone.

The openssl command that is used by the generator to retrieve certificate fingerprints is as follows:

openssl s_client -connect youremailserverbasedomain:443 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin

First backup your .offlineimaprc configuration file! e.g. As follows:

cp ~/.offlineimaprc ~/.offlineimaprc.backup


# .offlineimaprct template

Copy your .offlineimaprc file to .offlineimaprct and execute the generator program. Use the -v option to get verbose output.

.offlineimaprct (example)

# Sample configuration file
# Copyright (C) 2002-2011 John Goerzen & contributors
#
#    This program is free software; you can redistribute it and/or modify
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# Looking for a quick start?  Take a look at offlineimap.conf.minimal.

##################################################
# General definitions
##################################################

[general]
accounts = Contact,Private

# Set to the number of accounts.
maxsyncaccounts = 2

ui = machineui
[mbnames]
enabled = no
filename = ~/Mutt/muttrc.mailboxes
peritem = "+%(accountname)s/%(foldername)s"
sep = " "
footer = "\n"
statuschar = .
postsynchook = ~/bin/offlineimap-postsync.sh

##################################################
# Accounts
##################################################

[Account Contact]
localrepository = LocalContact
remoterepository = RemoteContact
[Repository LocalContact]
type = Maildir
localfolders = ~/notmuch/contact
sep = .
restoreatime = no
[Repository RemoteContact]
type = IMAP
remotehost = mail.contactdomainname.com
ssl = yes
cert_fingerprint = hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh
remoteuser = contact@contactdomainname.com
maxconnections = 2
holdconnectionopen = no
subscribedonly = no

[Account Private]
localrepository = LocalPrivate
remoterepository = RemotePrivate
[Repository LocalPrivate]
type = Maildir
localfolders = ~/notmuch/private
sep = .
restoreatime = no
[Repository RemotePrivate]
type = IMAP
remotehost = mail.privatedomainname.com
ssl = yes
cert_fingerprint = hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh:hh
remoteuser = private@privatedomainname.com
maxconnections = 2
holdconnectionopen = no
subscribedonly = no


# Cloning the project and its submodules

git clone --recurse-submodules https://github.com/maridonkers/OfflineImapGenerator

If the publicsuffix-haskell submodule is not created, then clone it manually, as follows:

cd OfflineImapGenerator
git clone https://github.com/wereHamster/publicsuffix-haskell/

Note: publicsuffix-haskell is in a submodule because you may want to bump it (use script/bump) to a more recent Public Suffix List.

# Building and executing

See the Makefile. Under NixOS first use a make shell before the other make commands.

cd OfflineImapGenerator/offlineimapgenerator
make rebuild
make run

To get a full path to the built executable use make ls and e.g. ln -s to create a symbolic link.

See the source code at maridonkers/OfflineImapGenerator on GitHub.

# Disclaimer

This is a ‘one shot’ program (excuse my Haskell) that I’m using myself but have not checked extensively, not cleaned up the code. If I find some time or run into bugs then I’ll clean it up (probably).