Archive Proton Mail With Offlineimap and Podman
published on 2022-08-17 by hyperreal
Problem
- I want to keep an archive of my email on my local machine for storage and record-keeping.
- I use Proton Mail as an email provider, so I have to use the Proton Mail Bridge app. I have the Flatpak version installed and set to run when I login to my desktop.
- I run Fedora Silverblue (actually it’s my own custom variant called Vauxite, but that’s not relevant here), so I have to run offlineimap from a Podman container on the host.
- Ideally, I’d have offlineimap run daily at, say, 10:00 PM. On a non-atomic OS, I’d just use the offlineimap systemd service and timer. Thankfully, Podman has the ability to generate a systemd unit file for containers.
Solution
Build OCI image for offlineimap
The first thing I did was create a Containerfile.
FROM fedora:latest LABEL maintainer "Jeffrey Serio <hyperreal@fedoraproject.org>" RUN printf "fastestmirror=True\ndeltarpm=True\nmax_parallel_downloads=10\n" | tee -a /etc/dnf/dnf.conf \ && dnf install -y offlineimap python3-distro \ && dnf clean all \ && mkdir /{mail,metadata} CMD ["/usr/bin/offlineimap", "-o", "-u", "basic", "-c", ".offlineimaprc"]
I then built the container image locally:
podman build -t localhost/offlineimap:latest .
Create container with OCI image
Once that was done, I created a container for it. I mapped the offlineimap metadata directory, mail directory, and offlineimaprc as volumes for the container.
podman create -it --name offlineimap \ -v ~/mail:/mail:Z \ -v ~/.offlineimap-metadata:/metadata:Z \ -v ~/.offlineimaprc:/.offlineimaprc:Z \ localhost/offlineimap:latest
Generate the systemd unit file for container
With the container created, I can now run the podman command to generate the systemd unit file.
--new
: sets the container to be created and removed before and after each run with the--rm
flag.--name
: name of the container to generate the systemd unit file from.--files
: outputs the files to the current working directory instead of stdout.
podman generate systemd --new --name offlineimap --files
The file looks like this:
# container-offlineimap.service # autogenerated by Podman 4.1.1 # Tue Aug 16 12:45:40 CDT 2022 [Unit] Description=Podman container-offlineimap.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=%t/containers [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStartPre=/bin/rm -f %t/%n.ctr-id ExecStart=/usr/bin/podman run \ --cidfile=%t/%n.ctr-id \ --cgroups=no-conmon \ --rm \ --sdnotify=conmon \ -d \ --replace \ -it \ --name offlineimap \ --network host \ -v /var/home/jas/mail:/mail:Z \ -v /var/home/jas/.offlineimap-metadata:/metadata:Z \ -v /var/home/jas/.offlineimaprc:/.offlineimaprc:Z localhost/offlineimap ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id Type=notify NotifyAccess=all [Install] WantedBy=default.target
Create and enable systemd timer
Now I have to create a systemd timer for this service:
[Unit] Description=Run container-offlineimap.service daily at 22:00:00 [Timer] OnCalendar=*-*-* 22:00:00 Persistent=true [Install] WantedBy=timers.target
I move these files to ~/.config/systemd/user
, and enable the timer in user mod:
systemctl --user enable container-offlineimap.timer
So now, at 10:00 PM every night, the systemd timer will trigger the container-offlineimap.service, which will pull mail from the remote Proton Mail server and store it in the /var/home/jas/mail directory. Yay!
Last updated: 2024-05-19