work-work.work-logo: A man with brains and a shovel

work-work.work

A blog about goals and obstacles, motivation and procrastination, life's random events and getting things done.

getmail with imap idle as a systemd service

My mail provider strato runs an imap service but the space is too small. That's why I host my own dovecot server on ubuntu 18.04. Fetching mail into dovecot happens pretty much instantaneous, thanks to the following system service.

Configure getmail

To fetch new mail from the provider, I have getmail configured to stay connected to the imap mailbox and wait for new mail to arrive. The provider supports the imap idle command.

This is my getmail configuration

/home/me/.getmail/rcfile

[retriever]
type = SimpleIMAPSSLRetriever
server = imap.strato.de
#port = 995
username = myname@mydomain.de
password = xxxxx

[destination]
type = Maildir
path = /home/me/Maildir/
user = me
filemode = 0600

[options]
delete = true
read_all = true
received = true
delivered_to = false
#verbose = 2

This file contains your password. You should chmod go-rwx /home/me/.getmail/rcfile so nobody can see it but you and root.

Try it out

When I run

$ /usr/bin/getmail --rcfile=/home/me/.getmail/rcfile --idle INBOX

Getmail will take all mail from my inbox on the provider side and put them into my own dovecot mailbox. Thanks to the --idle INBOX parameter, it will keep waiting for new mail. This way, I get it almost instantly without using up a lot of resources.

systemd service

To fully automate this and have it run in the background, we need a few lines of systemd configuration. Of course you can pick any other name for your service

/lib/systemd/system/getmail_me.service

[Unit]
Description=Getmail
Wants=network-online.target
After=network-online.target

[Service]
User=me
Type=simple
ExecStart=/usr/bin/getmail --rcfile=/home/me/.getmail/rcfile --idle INBOX
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

The restart part is in case getmail stops waiting. Then the service will be restarted after 30 seconds. So far this runs well. Systemd might give up restarting after so many futile attempts. That's why I put 30 seconds of delay in. Just in case there is an issue with the internet connection or with strato.

Now we have a service that we can control like other daemons.

$ service getmail_me start
$ service getmail_me status
● getmail_me.service - Getmail
   Loaded: loaded (/lib/systemd/system/getmail_me.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-12-15 19:07:19 UTC; 1s ago
 Main PID: 18173 (getmail)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/getmail_me.service
           └─18173 /usr/bin/python2 /usr/bin/getmail --rcfile=/home/me/.getmail/rcfile --idle INBOX

Dez 15 19:07:19 linuxserver2 systemd[1]: Started Getmail.

Have it start at boot time

This command will enable this service so it fires when you boot your system.

$ systemctl enable getmail_me.service
Created symlink /etc/systemd/system/multi-user.target.wants/getmail_me.service → /lib/systemd/system/getmail_me.service.

For multiple users

If you have more than one user, you could simply copy and adjust the above systemd service, or you can write one with parameters.

/lib/systemd/system/getmail@.service

[Unit]
Description=Getmail User %I
Wants=network-online.target
After=network-online.target

[Service]
User=%i
Type=simple
ExecStart=/usr/bin/getmail --rcfile=/home/%i/.getmail/rcfile --idle INBOX
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Notice the @ in the filename and the %i and %I in the script.

Now, you can run commands like

$ systemctl enable getmail@alice.service
$ systemctl enable getmail@bob.service
$ systemctl enable getmail@charly.service

$ systemctl status getmail@alice.service

and the corresponding getmail daemons get started. Of course, you still need to set up the rcfiles with the passwords in the home directories of your users for this to work.