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.
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.
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.
All the emails will be downloaded to the specified path as maildir files.
brew install notmuch
Upon finishing, terminal will display where notmuch puts the emcas files. In my case (yours may be different), it is
Next we need to link this folder to your ~/.emacs.d directory:
ln -s /usr/local/share/emacs/site-lisp/notmuch/ ~/.emacs.d/
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.
brew install msmtp
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
To test if msmtp is working, create a
txt file, say
To: firstname.lastname@example.org From: YOURACCOUNT Subject: a testing email Hi there :)
And send it with the command:
cat test.txt | msmtp -a default email@example.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.
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 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
and notmuch’s hello face will be waiting 📩📬✍