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’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’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’s now define options. As of now, except <code>enable</code> (to activate or not the module) I 100 don’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’t want to input password each and every time so we’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’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’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’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’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’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’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’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 “an initial tagging script for notmuch mail”. We’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 “graphical threads-with-tags style, lightweight and fast, e-mail client for 475 Notmuch”. 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’s all for the sync part, so let’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>