main
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>
23This article presents my opinionated email setup, client side. By opinionated I mean that
24it requires quite some stuff (like <code>nixpkgs</code>) and is cli/emacs/… oriented.
25</p>
26
27</div>
28
29<p>
30I used to read my mails only through the web interface of my mail provider (GMail for the
31most part), or through my phone. As I’m trying to use my phone less, at least for work,
32and as I wanted to not have a gmail tab always opened on my browser, I decided to
33configure 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>
60So 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>
71Something 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
72modules 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>
82Let’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
90with lib;
91let
92 cfg = config.profiles.mails;
93in
94{
95</pre>
96</div>
97
98<p>
99Let’s now define options. As of now, except <code>enable</code> (to activate or not the module) I
100don’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>
119Finally, 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>
137The next step is to actually define the accounts we want use and where we want to store
138email, 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
148folders)</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>
244To 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>
251encrypt <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>
267As I have multiple accounts, I need to be able to send mails from those multiple accounts
268too. For this we will use <code>msmtp</code>. We will <code>$HOME/.nix-profile/bin/msmtp</code> to make sure it
269uses <code>--read-envolep-from</code>. This means it will look at what <code>FROM</code> header is set in the
270e-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>
286We 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>
295And 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>
309I may not want to sync and index mails on all computers. In practice, I only do that on
310one 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>
322Now that all the configuration are defined (and generated once we run <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a>),
323we’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>
337We also setup <code>preExec</code> and <code>postExec</code> hooks on the service to be able to run commands
338before 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
346is 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>
398Finally, let’s define custom commands to simplify my mail usage. Those should be nix
399package 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>
424Additionally 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;
431programs.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
440configuration to enable some filters and <code>MailMover</code> rules.
441</p>
442
443<p>
444Note: 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
475Notmuch”. My main e-mail client is <code>emacs</code> with the <code>notmuch</code> mode, but sometimes I want a
476GUI, 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>
493And 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>