www

My personal website(s)
Log | Files | Refs

config_email_configuration.html (20884B)


      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4 <!-- Sep 03, 2024 -->
      5 <meta charset="utf-8" />
      6 <meta name="viewport" content="width=device-width, initial-scale=1" />
      7 <title>config: Email configuration</title>
      8 <meta name="author" content="Vincent Demeester" />
      9 <meta name="generator" content="Org Mode" />
     10 <link rel='icon' type='image/x-icon' href='/images/favicon.ico'/>
     11 <meta name='viewport' content='width=device-width, initial-scale=1'>
     12 <link rel='stylesheet' href='/css/new.css' type='text/css'/>
     13 <link rel='stylesheet' href='/css/syntax.css' type='text/css'/>
     14 <link href='/index.xml' rel='alternate' type='application/rss+xml' title='Vincent Demeester' />
     15 </head>
     16 <body>
     17 <main id="content" class="content">
     18 <header>
     19 <h1 class="title">config: Email configuration</h1>
     20 <p class="subtitle" role="doc-subtitle">A very opiniated mail setup</p>
     21 </header><div class="abstract" id="orgfdf41fd">
     22 <p>
     23 This article presents my opinionated email setup, client side. By opinionated I mean that
     24 it requires quite some stuff (like <code>nixpkgs</code>) and is cli/emacs/… oriented.
     25 </p>
     26 
     27 </div>
     28 
     29 <p>
     30 I used to read my mails only through the web interface of my mail provider (GMail for the
     31 most part), or through my phone. As I&rsquo;m trying to use my phone less, at least for work,
     32 and as I wanted to not have a gmail tab always opened on my browser, I decided to
     33 configure an email client on my laptops/desktops.
     34 </p>
     35 
     36 <nav id="table-of-contents" role="doc-toc">
     37 <h2>Table of Contents</h2>
     38 <div id="text-table-of-contents" role="doc-toc">
     39 <ul>
     40 <li><a href="#h:db00a56e-c928-47d4-a784-3b2d2600759c">Module</a></li>
     41 <li><a href="#h:e492a4cf-41e5-4091-9fc3-1294bef31875">Base settings</a>
     42 <ul>
     43 <li><a href="#h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">Accounts</a></li>
     44 <li><a href="#h:cc9d0707-d775-49ef-884d-ae65174fb259"><code>msmtp</code> wrapper</a></li>
     45 </ul>
     46 </li>
     47 <li><a href="#h:47e38880-580e-4335-a504-b3c9c580ec91">Syncing</a>
     48 <ul>
     49 <li><a href="#h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">Service</a></li>
     50 <li><a href="#h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">Programs</a></li>
     51 </ul>
     52 </li>
     53 <li><a href="#h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">Close the module</a></li>
     54 <li><a href="#h:7012be97-2b81-44e9-b9bb-8c4147e3d561">References</a></li>
     55 </ul>
     56 </div>
     57 </nav>
     58 
     59 <p>
     60 So far, I ended up using the following tools:
     61 </p>
     62 
     63 <ul class="org-ul">
     64 <li><a href="http://isync.sourceforge.net/mbsync.html"><code>mbsync</code></a> to sync mails between server and laptop/desktop.</li>
     65 <li><a href="https://marlam.de/msmtp/"><code>msmtp</code></a> to send mails.</li>
     66 <li><a href="https://notmuchmail.org/"><code>notmuch</code></a> to index, and tag mails.</li>
     67 <li><a href="https://www.gnu.org/software/emacs/"><code>emacs</code></a> with <a href="https://www.gnu.org/software/emacs/manual/html_node/gnus/"><code>gnus</code></a> and <a href="https://notmuchmail.org/notmuch-emacs/"><code>notmuch</code></a> for reading/sending mails.</li>
     68 </ul>
     69 
     70 <p>
     71 Something a bit special here is that I also use <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a>… and <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a> has
     72 modules for those tools, so we are going to use thoses.
     73 </p>
     74 
     75 <p>
     76 <b>This needs to be updated and rewritten</b>.
     77 </p>
     78 <section id="outline-container-h:db00a56e-c928-47d4-a784-3b2d2600759c" class="outline-2">
     79 <h2 id="h:db00a56e-c928-47d4-a784-3b2d2600759c">Module</h2>
     80 <div class="outline-text-2" id="text-h:db00a56e-c928-47d4-a784-3b2d2600759c">
     81 <p>
     82 Let&rsquo;s start by defining the module, the usual Nix way.
     83 </p>
     84 
     85 <div class="org-src-container">
     86 <pre class="src src-nix"># Generated from an org file 💃
     87 # See : https://sbr.pm/technical/configurations/mails.html
     88 { config, lib, pkgs, ... }:
     89 
     90 with lib;
     91 let
     92   cfg = config.profiles.mails;
     93 in
     94 {
     95 </pre>
     96 </div>
     97 
     98 <p>
     99 Let&rsquo;s now define options. As of now, except <code>enable</code> (to activate or not the module) I
    100 don&rsquo;t have any options in mind.
    101 </p>
    102 
    103 <div class="org-src-container">
    104 <pre class="src src-nix">options = {
    105   profiles.mails = {
    106     enable = mkEnableOption "Enable mails configuration";
    107     sync = mkEnableOption "Enable sync mail service";
    108     frequency = mkOption {
    109       default = "*:0/30";
    110       description = "Frequency at which the mail should be checked";
    111       type = types.str;
    112     };
    113   };
    114 };
    115 </pre>
    116 </div>
    117 
    118 <p>
    119 Finally, create the configuration.
    120 </p>
    121 
    122 <div class="org-src-container">
    123 <pre class="src src-nix">config = mkIf cfg.enable (mkMerge [
    124   {
    125 </pre>
    126 </div>
    127 </div>
    128 </section>
    129 <section id="outline-container-h:e492a4cf-41e5-4091-9fc3-1294bef31875" class="outline-2">
    130 <h2 id="h:e492a4cf-41e5-4091-9fc3-1294bef31875">Base settings</h2>
    131 <div class="outline-text-2" id="text-h:e492a4cf-41e5-4091-9fc3-1294bef31875">
    132 </div>
    133 <div id="outline-container-h:ddef34cf-07c6-4ae1-abc9-129440ded5e2" class="outline-3">
    134 <h3 id="h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">Accounts</h3>
    135 <div class="outline-text-3" id="text-h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">
    136 <p>
    137 The next step is to actually define the accounts we want use and where we want to store
    138 email, amongst other need.
    139 </p>
    140 
    141 <ul class="org-ul">
    142 <li>We want to store mails in <code>desktop/mails/{account}</code>.</li>
    143 <li>We don&rsquo;t want to input password each and every time so we&rsquo;re using an encrypted file
    144 (<a href="https://www.gnupg.org/gph/en/manual/x110.html">symmetric encryption using GnuPG</a> with a passphrase file).</li>
    145 <li>We&rsquo;re gonna enable diverse modules on each account
    146 <ul class="org-ul">
    147 <li><code>mbsync</code> to sync the mail with some setupts (like specific rules for GMail specific
    148 folders)</li>
    149 <li><code>notmuch</code> for email indexing</li>
    150 <li><code>msmtp</code> to send a mail, using the account&rsquo;s smtp server</li>
    151 <li><code>astroid</code> for a GUI</li>
    152 </ul></li>
    153 </ul>
    154 
    155 <div class="org-src-container">
    156 <pre class="src src-nix">accounts.email = {
    157   maildirBasePath = "desktop/mails";
    158   accounts = {
    159     "redhat" = {
    160       address = "vdemeest@redhat.com";
    161       userName = "vdemeest@redhat.com";
    162       realName = "Vincent Demeester";
    163       passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/rh.pass -d ${config.home.homeDirectory}/desktop/documents/rh.pass.gpg";
    164       imap.host = "imap.gmail.com";
    165       smtp.host = "smtp.gmail.com";
    166       mbsync = {
    167         enable = true;
    168         create = "both";
    169         expunge = "both";
    170         patterns = ["*" "![Gmail]*" "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail"];
    171         extraConfig = {
    172           channel = {
    173             Sync = "All";
    174           };
    175           account = {
    176             Timeout = 120;
    177             PipelineDepth = 1;
    178           };
    179         };
    180       };
    181       notmuch.enable = cfg.sync;
    182       astroid.enable = cfg.sync;
    183       msmtp.enable = true;
    184     };
    185     "perso" = {
    186       address = "vinc.demeester@gmail.com";
    187       userName = "vinc.demeester@gmail.com";
    188       realName = "Vincent Demeester";
    189       passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/perso.pass -d ${config.home.homeDirectory}/desktop/documents/perso.pass.gpg";
    190       imap.host = "imap.gmail.com";
    191       smtp.host = "smtp.gmail.com";
    192       mbsync = {
    193         enable = true;
    194         create = "both";
    195         expunge = "both";
    196         patterns = ["*" "![Gmail]*" "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail"];
    197         extraConfig = {
    198           channel = {
    199             Sync = "All";
    200           };
    201           account = {
    202             Timeout = 120;
    203             PipelineDepth = 1;
    204           };
    205         };
    206       };
    207       notmuch.enable = cfg.sync;
    208       astroid.enable = cfg.sync;
    209       msmtp.enable = true;
    210     };
    211     "prv" = {
    212       primary = true;
    213       address = "vincent@demeester.fr";
    214       userName = "vincent@demeester.fr";
    215       realName = "Vincent Demeester";
    216       passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/prv.pass -d ${config.home.homeDirectory}/desktop/documents/prv.pass.gpg";
    217       imap.host = "mail.gandi.net";
    218       smtp.host = "mail.gandi.net";
    219       mbsync = {
    220         enable = true;
    221         create = "both";
    222         expunge = "both";
    223         patterns = ["*"];
    224         extraConfig = {
    225           channel = {
    226             Sync = "All";
    227           };
    228           account = {
    229             Timeout = 120;
    230             PipelineDepth = 1;
    231           };
    232         };
    233       };
    234       notmuch.enable = cfg.sync;
    235       astroid.enable = cfg.sync;
    236       msmtp.enable = true;
    237     };
    238   };
    239 };
    240 </pre>
    241 </div>
    242 
    243 <p>
    244 To create the pasword files:
    245 </p>
    246 <ul class="org-ul">
    247 <li>create <code>~/desktop/documents/{account}.pass.gpg</code> file, you need to create a
    248 <code>~/desktop/documents/prv.pass</code> file with the actual password.</li>
    249 <li>create <code>~/sync/{account}.pass</code> with a passphrase (long, complex, whatever…)</li>
    250 <li><p>
    251 encrypt <code>~/desktop/documents/{account}.pass.gpg</code> with the following command
    252 </p>
    253 
    254 <div class="org-src-container">
    255 <pre class="src src-bash">gpg --batch --yes --symmetric --passphrase-file ~/sync/{account}.pass --encrypt {account.pass}
    256 </pre>
    257 </div></li>
    258 
    259 <li>remove <code>~/desktop/documents/{account}.pass</code></li>
    260 </ul>
    261 </div>
    262 </div>
    263 <div id="outline-container-h:cc9d0707-d775-49ef-884d-ae65174fb259" class="outline-3">
    264 <h3 id="h:cc9d0707-d775-49ef-884d-ae65174fb259"><code>msmtp</code> wrapper</h3>
    265 <div class="outline-text-3" id="text-h:cc9d0707-d775-49ef-884d-ae65174fb259">
    266 <p>
    267 As I have multiple accounts, I need to be able to send mails from those multiple accounts
    268 too. For this we will use <code>msmtp</code>. We will <code>$HOME/.nix-profile/bin/msmtp</code> to make sure it
    269 uses <code>--read-envolep-from</code>. This means it will look at what <code>FROM</code> header is set in the
    270 e-mail and use the correct account accordingly.
    271 </p>
    272 
    273 <div class="org-src-container">
    274 <pre class="src src-nix">home.file."bin/msmtp" = {
    275   text = ''
    276   #!${pkgs.stdenv.shell}
    277   ${pkgs.libnotify}/bin/notify-send "Sending mail ✉️"
    278   ${pkgs.msmtp}/bin/msmtp --read-envelope-from $@
    279   '';
    280   executable = true;
    281 };
    282 </pre>
    283 </div>
    284 
    285 <p>
    286 We also want to make sure we enable <code>msmtp</code>.
    287 </p>
    288 
    289 <div class="org-src-container">
    290 <pre class="src src-nix">programs.msmtp.enable = true;
    291 </pre>
    292 </div>
    293 
    294 <p>
    295 And that should be all for the base settings, so let&rsquo;s close that part
    296 </p>
    297 
    298 <div class="org-src-container">
    299 <pre class="src src-nix">}
    300 </pre>
    301 </div>
    302 </div>
    303 </div>
    304 </section>
    305 <section id="outline-container-h:47e38880-580e-4335-a504-b3c9c580ec91" class="outline-2">
    306 <h2 id="h:47e38880-580e-4335-a504-b3c9c580ec91">Syncing</h2>
    307 <div class="outline-text-2" id="text-h:47e38880-580e-4335-a504-b3c9c580ec91">
    308 <p>
    309 I may not want to sync and index mails on all computers. In practice, I only do that on
    310 one computer and I sync these mails with the others.
    311 </p>
    312 
    313 <div class="org-src-container">
    314 <pre class="src src-nix">(mkIf cfg.sync {
    315 </pre>
    316 </div>
    317 </div>
    318 <div id="outline-container-h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1" class="outline-3">
    319 <h3 id="h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">Service</h3>
    320 <div class="outline-text-3" id="text-h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">
    321 <p>
    322 Now that all the configuration are defined (and generated once we run <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a>),
    323 we&rsquo;re going to enable the <code>mbsync</code> service to synchronize email at the given frequency.
    324 </p>
    325 
    326 <div class="org-src-container">
    327 <pre class="src src-nix">services.mbsync = {
    328   enable = true;
    329   preExec = "${config.xdg.configHome}/mbsync/preExec";
    330   postExec = "${config.xdg.configHome}/mbsync/postExec";
    331   frequency = cfg.frequency;
    332 };
    333 </pre>
    334 </div>
    335 
    336 <p>
    337 We also setup <code>preExec</code> and <code>postExec</code> hooks on the service to be able to run commands
    338 before and after actually running <code>mbsync</code>.
    339 </p>
    340 
    341 <ul class="org-ul">
    342 <li><code>preExec</code> has two main purpose :
    343 
    344 <ul class="org-ul">
    345 <li>Create the accounts mail folder — this is <b>only</b> useful for the first run ever, but it
    346 is required.</li>
    347 <li>Move mails on the right folders
    348 <ul class="org-ul">
    349 <li>from Inbox to elsewhere (All mails, …)</li>
    350 <li>(in the future) to the right folders (from the tags)</li>
    351 </ul></li>
    352 </ul></li>
    353 </ul>
    354 
    355 <div class="org-src-container">
    356 <pre class="src src-nix">xdg.configFile."mbsync/preExec" = {
    357   text = ''
    358   #!${pkgs.stdenv.shell}
    359 
    360   export NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc
    361   export NMBGIT=${config.xdg.dataHome}/notmuch/nmbug
    362 
    363   ${pkgs.coreutils}/bin/mkdir -p ${config.home.homeDirectory}/desktop/mails/redhat ${config.home.homeDirectory}/desktop/mails/perso
    364   ${pkgs.afew}/bin/afew -C  ${config.xdg.configHome}/notmuch/notmuchrc -m -v
    365   '';
    366   executable = true;
    367 };
    368 </pre>
    369 </div>
    370 
    371 <ul class="org-ul">
    372 <li><code>postExec</code> will index the new emails in the <code>notmuch</code> database and tag mail accordingly
    373 (to their folders and other rules in place).</li>
    374 </ul>
    375 
    376 <div class="org-src-container">
    377 <pre class="src src-nix">xdg.configFile."mbsync/postExec" = {
    378   text = ''
    379   #!${pkgs.stdenv.shell}
    380 
    381   export NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc
    382   export NMBGIT=${config.xdg.dataHome}/notmuch/nmbug
    383 
    384   ${pkgs.notmuch}/bin/notmuch new
    385   ${pkgs.afew}/bin/afew -C ${config.xdg.configHome}/notmuch/notmuchrc --tag --new -v
    386   # Remove inbox (lower-case)
    387   ${pkgs.notmuch}/bin/notmuch tag -inbox -- tag:inbox
    388   # Remove Inbox tagged message that are not in an Inbox
    389   ${pkgs.notmuch}/bin/notmuch tag -Inbox -- not folder:redhat/Inbox and not folder:perso/Inbox and tag:Inbox
    390   ${pkgs.libnotify}/bin/notify-send "Mails synced 📬"
    391   '';
    392   executable = true;
    393 };
    394 </pre>
    395 </div>
    396 
    397 <p>
    398 Finally, let&rsquo;s define custom commands to simplify my mail usage. Those should be nix
    399 package in the near future — as of now, it is a bit ugly as I&rsquo;m creating binaries inside
    400 <code>$HOME/bin</code> instead of relying of Nix.
    401 </p>
    402 
    403 <ul class="org-ul">
    404 <li><code>msync</code> is an helper to run quickly <code>mbsync</code> systemd service from anywhere</li>
    405 </ul>
    406 
    407 <div class="org-src-container">
    408 <pre class="src src-nix">home.file."bin/msync" = {
    409   text = ''
    410   #!${pkgs.stdenv.shell}
    411   ${pkgs.libnotify}/bin/notify-send "Syncing mails 📫️"
    412   systemctl --user start mbsync
    413   '';
    414   executable = true;
    415 };
    416 </pre>
    417 </div>
    418 </div>
    419 </div>
    420 <div id="outline-container-h:8e918ee0-4ef7-4f98-b170-dcfea20c6443" class="outline-3">
    421 <h3 id="h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">Programs</h3>
    422 <div class="outline-text-3" id="text-h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">
    423 <p>
    424 Additionally we can enable some programs and customize their behavior. Let&rsquo;s enable
    425 <code>programs.mbsync</code>, which has for effect to put <code>mbsync</code> binary in <code>PATH</code> so that the user
    426 (us) can call it. Same goes for <code>programs.msmtp</code> and <code>programs.notmuch</code>.
    427 </p>
    428 
    429 <div class="org-src-container">
    430 <pre class="src src-nix">programs.mbsync.enable = true;
    431 programs.notmuch.enable = true;
    432 </pre>
    433 </div>
    434 </div>
    435 <div id="outline-container-h:74f4160b-d34a-490e-b56a-ad3d0e5f966c" class="outline-4">
    436 <h4 id="h:74f4160b-d34a-490e-b56a-ad3d0e5f966c">Afew</h4>
    437 <div class="outline-text-4" id="text-h:74f4160b-d34a-490e-b56a-ad3d0e5f966c">
    438 <p>
    439 <a href="https://github.com/afewmail/afew"><code>afew</code></a> is &ldquo;an initial tagging script for notmuch mail&rdquo;. We&rsquo;re going to define some extra
    440 configuration to enable some filters and <code>MailMover</code> rules.
    441 </p>
    442 
    443 <p>
    444 Note: This should go away at some point as these rules are not dynamic enough for my usage.
    445 </p>
    446 
    447 <div class="org-src-container">
    448 <pre class="src src-nix">programs.afew = {
    449   enable = true;
    450   extraConfig = ''
    451     [SpamFilter]
    452     [KillThreadsFilter]
    453     [ListMailsFilter]
    454     [ArchiveSentMailsFilter]
    455     [FolderNameFilter]
    456     maildir_separator = /
    457 
    458     [MailMover]
    459     folders = perso/Inbox redhat/Inbox
    460     rename = true
    461 
    462     perso/Inbox = 'NOT tag:Inbox':"perso/[Gmail]/All Mail"
    463     redhat/Inbox = 'NOT tag:Inbox':"redhat/[Gmail]/All Mail"
    464   '';
    465 };
    466 </pre>
    467 </div>
    468 </div>
    469 </div>
    470 <div id="outline-container-h:2d4558d2-0596-4c80-bab0-f259385375b1" class="outline-4">
    471 <h4 id="h:2d4558d2-0596-4c80-bab0-f259385375b1">Astroid</h4>
    472 <div class="outline-text-4" id="text-h:2d4558d2-0596-4c80-bab0-f259385375b1">
    473 <p>
    474 <a href="https://github.com/astroidmail/astroid/"><code>astroid</code></a> is a &ldquo;graphical threads-with-tags style, lightweight and fast, e-mail client for
    475 Notmuch&rdquo;. My main e-mail client is <code>emacs</code> with the <code>notmuch</code> mode, but sometimes I want a
    476 GUI, mainly to see wanky HTML mails that would not render correctly some times.
    477 </p>
    478 
    479 <div class="org-src-container">
    480 <pre class="src src-nix">programs.astroid = {
    481   enable = true;
    482   externalEditor = "emacsclient -c";
    483   extraConfig = {
    484     startup.queries.inbox = "tag:Inbox";
    485     startup.queries.inbox_perso = "folder:perso/Inbox";
    486     startup.queries.inbox_redhat = "folder:redhat/Inbox";
    487   };
    488 };
    489 </pre>
    490 </div>
    491 
    492 <p>
    493 And that&rsquo;s all for the sync part, so let&rsquo;s close it
    494 </p>
    495 
    496 <div class="org-src-container">
    497 <pre class="src src-nix">})
    498 </pre>
    499 </div>
    500 </div>
    501 </div>
    502 </div>
    503 </section>
    504 <section id="outline-container-h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f" class="outline-2">
    505 <h2 id="h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">Close the module</h2>
    506 <div class="outline-text-2" id="text-h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">
    507 <div class="org-src-container">
    508 <pre class="src src-nix">]);
    509 }
    510 </pre>
    511 </div>
    512 </div>
    513 </section>
    514 <section id="outline-container-h:7012be97-2b81-44e9-b9bb-8c4147e3d561" class="outline-2">
    515 <h2 id="h:7012be97-2b81-44e9-b9bb-8c4147e3d561">References</h2>
    516 <div class="outline-text-2" id="text-h:7012be97-2b81-44e9-b9bb-8c4147e3d561">
    517 <ul class="org-ul">
    518 <li><a href="https://copyninja.info/blog/email_setup.html">My personal Email setup - Notmuch, mbsync, postfix and dovecot</a></li>
    519 <li><a href="https://anarc.at/blog/2016-05-12-email-setup/">Notmuch, offlineimap and Sieve setup - anarcat</a></li>
    520 <li><a href="https://github.com/kzar/davemail">https://github.com/kzar/davemail</a></li>
    521 <li><a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/">Handling Email with Emacs – malb::blog</a></li>
    522 <li><a href="https://kirang.in/post/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx/">Emacs as email client with offlineimap and mu4e on OS X</a></li>
    523 <li><a href="http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/">A Complete Guide to Email in Emacs using Mu and Mu4e</a></li>
    524 <li><a href="https://notmuchmail.org/emacstips/#index24h2">emacstips</a></li>
    525 <li><a href="https://kkatsuyuki.github.io/notmuch-conf/">notmuch + emacs + offlineimap configuration procedure</a></li>
    526 <li><a href="https://wiki.archlinux.org/index.php/Isync">isync - ArchWiki</a></li>
    527 <li><a href="https://superuser.com/questions/437027/emacs-and-multiple-smtp-servers">email - Emacs and Multiple SMTP servers - Super User</a></li>
    528 <li><a href="https://notanumber.io/2016-10-03/better-email-with-mu4e/">Better Email with mu4e | NaN</a></li>
    529 <li><a href="https://wwwtech.de/articles/2016/jul/my-personal-mail-setup">My personal mail setup</a></li>
    530 <li><a href="https://foobacca.co.uk/blog/2013/04/initial-tagging-and-afew/">initial tagging and afew - Foobacca</a></li>
    531 <li><a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/">Handling Email with Emacs – malb::blog</a></li>
    532 <li><a href="http://deferred.io/2016/01/18/how-i-email.html">How I email, 2016 edition</a></li>
    533 <li><a href="https://bostonenginerd.com/posts/notmuch-of-a-mail-setup-part-2-notmuch-and-emacs/">Notmuch of mail a setup Part 2 - notmuch and Emacs | Assorted Nerdery</a></li>
    534 <li><a href="http://www.johnborwick.com/2019/02/09/notmuch-gmailieer.html">Checking email with gmailieer + notmuch + Emacs | John’s Blog</a></li>
    535 <li><a href="https://blog.einval.eu/2019/06/one-year-with-notmuch.html">One year with Notmuch</a></li>
    536 </ul>
    537 </div>
    538 </section>
    539 </main>
    540 <footer id="postamble" class="status">
    541 <footer>
    542      <small><a href="/" rel="history">Index</a> • <a href="/sitemap.html">Sitemap</a> • <a href="https://dl.sbr.pm/">Files</a></small><br/>
    543      <small class='questions'>Questions, comments ? Please use my <a href="https://lists.sr.ht/~vdemeester/public-inbox">public inbox</a> by sending a plain-text email to <a href="mailto:~vdemeester/public-inbox@lists.sr.ht">~vdemeester/public-inbox@lists.sr.ht</a>.</small><br/>
    544      <small class='copyright'>
    545       Content and design by Vincent Demeester
    546       (<a rel='licence' href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Some rights reserved</a>)
    547     </small><br />
    548 </footer>
    549 </footer>
    550 </body>
    551 </html>