This guide will cover the basics on how to integrate Emacs with the ProtonMail using

How to install them:

  • Fedora: sudo dnf install isync maildir-utils
  • Debian: sudo apt install isync maildir-utils

Installing ProtonMail Bridge via Flatpak

First add Flathub Flatpak repository:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Then install protonmail-bridge via:

flatpak install flathub ch.protonmail.protonmail-bridge

Configuring mbsync

Create a configuration file ~/.mbsyncrc for mbsync

IMAPAccount protonmail
Host 127.0.0.1
Port 1143
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk 'FNR == 1 {print $8}'"
SSLType STARTTLS
SSLVersions TLSv1.2
CertificateFile ~/.config/protonmail/bridge/cert.pem

IMAPStore remote
Account protonmail

#You can change .mail to something else
MaildirStore local
Path ~/.mail/
Inbox ~/.mail/INBOX/

Channel inbox
Master :remote:
Slave :local:
Patterns *
Create Both
Expunge Both
SyncState *

Group protonmail
Channel inbox

(Alternative) Using offlineimap

Alternatively install offlineimap with the following config at ~/.offlineimaprc

# ~/.offlineimaprc

[general]
accounts = protonmail
pythonfile = ~/.config/offlineimap/keyring.py
metadata = ~/.cache/offlineimap

[Account protonmail]
remoterepository = protonmail-remote
localrepository = protonmail-local

[Repository protonmail-local]
type = Maildir
localfolders = ~/.mail
sync_deletes = no

[Repository protonmail-remote]
expunge = yes
type = IMAP
remotehost = 127.0.0.1
remoteport= 1143
remoteuser = USERNAME@protonmail.com
remotepasseval = get_password("[email protected]")
# Alternatively, use
# remotepass = <YOUR BRIDGE-SPECIFIC PASSWORD>
nametrans = lambda foldername: re.sub ('^Folders.', '', foldername)
folderfilter = lambda foldername: foldername not in ['All Mail']
ssl = no # ssl is broken.
starttls = yes
ssl_version = tls1_2
sslcacertfile = ~/.config/protonmail/bridge/cert.pem

Where one possible script is

#!/usr/bin/env python3
# ~/.config/offlineimap/keyring.py

import re
import os


def get_password(login):
    machine = "127.0.0.1"
    port = "1143"
    s = "machine %s port %s login %s password ([^ ]*)\n" % (
        machine,
        port,
        login,
    )
    p = re.compile(s)
    authinfo = os.popen(
        "gpg -q --no-tty -d ~/.authinfo.gpg"
    ).read()
    return p.search(authinfo).group(1)

Note: offlineimap depends on Python 2.7 which is deprecated.

Logging credentials

Next we need to create a file to log our credentials for sending mail with smtpmail. Create a file ~/.authinfo with the following contents:

machine 127.0.0.1 port 1143 login [email protected] password BRIDGE_PASSWORD
machine 127.0.0.1 port 1025 login [email protected] password BRIDGE_PASSWORD

You should encrypt it, one option is to use epa in Emacs M-x epa-encrypt-file. Another is to set a symmetric encryption that will require some password $ gpg --symetric .authinfo. Finally, delete .authinfo.

Now to get/sync you mail, run on a terminal $ mbsync protonmail.

Configuring mu4e

This is a minimal configuration that you should include in your init.el configuration file.

(require 'mu4e)

(setq mu4e-maildir "~/.mail"
    mu4e-attachment-dir "~/Downloads")

(setq user-mail-address "[email protected]"
    user-full-name  "YOUR_NAME")

;; Get mail
(setq mu4e-get-mail-command "mbsync protonmail"
    mu4e-change-filenames-when-moving t   ; needed for mbsync
    mu4e-update-interval 120)             ; update every 2 minutes

;; Send mail
(setq message-send-mail-function 'smtpmail-send-it
    smtpmail-auth-credentials "~/.authinfo.gpg"
    smtpmail-smtp-server "127.0.0.1"
    smtpmail-stream-type 'starttls
    smtpmail-smtp-service 1025)

(add-to-list 'gnutls-trustfiles
    (expand-file-name "~/.config/protonmail/bridge/cert.pem"))

To index your emails from the terminal run mu index --maildir=~/.mail.

Now just launch M-x mu4e from Emacs to read your mail.