Emails, Notmuch, and I
Emails are always distractions for me. Before using notmuch with Emacs, I don’t use any email clients on my laptop, so I’d have to log into the office 365’s web interface to read and reply emails, which is absolutely a pain in the neck. Yet I chose this workflow because it pretty much made checking email the least favorable thing whenever I am working, which was exactly what I needed.
Yet as I go through the transition to a senior phd student, there is simply no way to avoid emails any longer. I have to follow emails from advisors regarding various instructions on drafts, meetings, and numerous errands. There are also more emails from organizations as I start investing more time working in the professional societies. I need to not only constantly referring back to the emails, but also be able to archive them in a more efficient way (instead of struggling with tens of archive folders and which email goes to which folder).
I’ve been looking for a solution for emails. Notmuch’s philosophy is tagging and instant searching. You don’t ever need to worry about how to set up your hierarchical structure of your archives and how to assign emails to the best child-folder. In notmuch, you do initial tag upon emails’ arrival. You can then assign each email with multiple tags (while reading and replying) and notmuch will automatically generate different groups based on the tags. The “tag groups” resemble “archive folders,” only in a much more flexible and dynamic way.
What’s more? Boy, notmuch’s searching is blazing fast. I don’t ever need tons of static folders to sort emails: I just search for the keyword whenever I need any pieces of information.
All these being said, I am a total newbie in Emacs. Wait. I am a newbie in all sorts of code-related stuff. Yet as always, I am allured to any ideas that can improve my workflow no matter how many troubles I am signing up for. I ran into plenty of difficulties when setting notmuch because of my limited knowledge on programming. A lot of those difficulties are so basic that I couldn’t find any solutions on the internet. So this blog entry is for people like me who enjoy tweaking workflows but are not necessary familiar with programming. Here we go.
Basically, We need three things to perform three jobs:
- Fetching emails: mbsync
- Reading emails: notmuch
- Replying emails: msmtp
Emacs’ native message mode is also capable of sending emails but I find it sometimes buggy, so I end up using msmtp, which is surprisingly easy to configure.
Mbsync
install
brew install isync
configuration with office 365 account
cd ~
touch .mbsyncrc
open .mbsyncrc
Edit your account information based on the following template, and paste it into .mbsyncrc
IMAPAccount outlook
Host outlook.office365.com
Port 993
User YOURACCOUNT
Pass YOURPASSWORD
SSLType IMAPS
AuthMechs LOGIN
CertificateFile /usr/local/etc/openssl/cert.pem
IMAPStore outlook-remote
Account outlook
MaildirStore outlook-local
Path ~/.mail/default/
Inbox ~/.mail/default/Inbox/
SubFolders Verbatim
Channel outlook
Master :outlook-remote:
Slave :outlook-local:
# Include everything
Patterns *
Create Both
Sync All
Expunge Both
SyncState *
As I am on macOS, the certification used is from the openSSL so the path is different from some other configuration files on the internet. You can easily instill openSSL via
brew install openssl
This one is important. An issue I ran into when I first set up the file was getting error message as
unknown/misplaced keyword 'AuthMechs' 'SSLType'
To solve this problem, please refer to the configuration section on the latest official website mbsync, and try to:
- reorder variables so that they follow the order listed on the websites, say Host needs to go before the Port variable, or AuthMechs has to go before the SSLType;
- pay attention to your line spacing. On the website, it says “Sections are started by a section keyword and are terminated by an empty line or end of file,” which means only one empty line is allowed between each section. Make sure, for example, that you don’t have two empty lines between the section “IMAPAccount” and the section “IMAPstore”
- If still having troubles, I recommend downloading existing profiles shared by others from the Github and ONLY replacing your account information. Try not to change any formatting of the file.
The variable Subfolders Verbatim
is optional but necessary if your email account have many subfolders. Mbsync won’t start fetching emails in the subfolders until you set the subfolder structure. You can find all three options on the configuration page of mbsync.
run
mbsync -a
All the emails will be downloaded to the specified path as maildir files.
Notmuch
install
brew install notmuch
Upon finishing, terminal will display where notmuch puts the emcas files. In my case (yours may be different), it is
/usr/local/share/emacs/site-lisp/notmuch
Next we need to link this folder to your ~/.emacs.d directory:
ln -s /usr/local/share/emacs/site-lisp/notmuch/ ~/.emacs.d/
configuration
Notmuch’s website has detailed configuration guide. See getting-started.
Note that setting path during notmuch step is a little tricky. Assuming your mail directory is ~/Mails/ then please run cd ~ before the command notmuch and input Mails/ as the path. If the directory is ~/Desktop/Mails/ then be sure to cd ~/Desktop prior to the notmuch command.
Msmtp
install
brew install msmtp
configuration
cd ~
touch .msmtprc
open .msmtprc
And then simply edit and paste the following into the file:
# outlook
account outlook
host smtp.office365.com
port 587
protocol smtp
auth on
from YOURACCOUNT
user YOURACCOUNT
password YOURPASSWORD
tls on
tls_nocertcheck
logfile ~/.msmtp.log
account default : outlook
test
To test if msmtp is working, create a txt
file, say test.txt
:
To: example@gmail.com
From: YOURACCOUNT
Subject: a testing email
Hi there :)
And send it with the command:
cat test.txt | msmtp -a default example@gmail.com
I recommend using the above command to send test emails as the well-documented echo function sometimes sends empty emails without subjects and contents.
Finally, Emacs
notmuch
In your init.el file, add the following codes
;;notmuch setup
(add-to-list 'exec-path "/usr/local/bin/")
(setq notmuch-binary "/usr/local/bin/notmuch")
(add-to-list 'load-path (expand-file-name "~/.emacs.d/notmuch"))
(autoload 'notmuch "notmuch" "notmuch mail" t)
(require 'notmuch)
We need to first set the path as we installed Notmuch via homebrew and sometimes emacs cannot find the directory. The ‘load-path variable specifies the folder in the ~/.emacs.d/ that is linked from the /usr/local/share/emacs/site-lisp/notmuch
Also refer to the official website for notmuch-emacs interface.
msmtp
Msmtp can be configured in notmuch’s configure file altogether.
cd ~/.emacs.d
touch notmuch-config.el
In this file, add the following settings:
(setq user-full-name "YOURNAME")
(setq user-mail-adress "YOURACCOUNT")
(setq mail-user-agent 'message-user-agent)
(setq mail-specify-envelope-from t)
(setq sendmail-program "/usr/local/bin/msmtp"
mail-specify-envelope-from t
mail-envelope-from 'header
message-sendmail-envelope-from 'header)
Good to go
By far the notmuch-emacs system should work properly. Type
M-x notmuch
and notmuch’s hello face will be waiting 📩📬✍