Raspberry Pi als privater Email Server

Nach den NSA Enthüllungen von Snowden im Sommer 2013, und nachdem mir mein Arbeitgeber ein paar Monate zuvor ein Raspberry Pi geschenkt hatte, kam mir dieser Artikel im c’t 2013, Heft 17, gerade Recht: *Briefkästchen, Raspberry Pi als privater LAMP- und IMAP-Server*, von Mirko Dölle.

Raspberry Pi

Mein Setup: Mac Mini mit OSX 10.6.8 und Homebrew, ein Apple Airport Router, ein Raspberry Pi, ein 4 GB SD-Karte, ein USB Wireless Dingens, der Nano-WLAN-USB-Stick 150 Mbps von hama.

Homebrew

Raspberry Pi: eMail Server installieren

Debian auf Raspberrry Pi installieren

Der alte USB Kartenleser funktioniert nicht mehr. Ich musste meinen Fotoapparat (!) als SD-Kartenleser verwenden. SD-Karte in den Fotoapparat und Raspbian via Torrent runterladen und entpacken. Das ist Debian für den Raspberry Pi und etwa 2 GB gross. Das schreibt man dann auf die entsprechende Partition. Zuerst mal die richtige Partition finden, unmounten und überschreiben. Vorsicht, die Disks heissen bei dir vielleicht anders.

Raspbian

Torrent

Debian

alex@Pyrobombus:~$ df -h
Filesystem      Size   Used  Avail Capacity  Mounted on
/dev/disk0s2    74Gi   68Gi  5.6Gi    93%    /
devfs          123Ki  123Ki    0Bi   100%    /dev
map -hosts       0Bi    0Bi    0Bi   100%    /net
map auto_home    0Bi    0Bi    0Bi   100%    /home
/dev/disk1s2   931Gi  904Gi   27Gi    98%    /Volumes/Extern
/dev/disk2s1   1.8Gi  3.8Mi  1.8Gi     1%    /Volumes/OLYMPUS
alex@Pyrobombus:~$ sudo diskutil unmount /dev/disk2s1
alex@Pyrobombus:~$ sudo dd bs=1m if=2013-07-26-wheezy-raspbian.img of=/dev/rdisk2

Die Karte dann in den Raspberry Pi reinschieben und am Strom anstecken. Das Ding bootet, aber es hat keine Tastatur und keinen Bildschirm. Man verbindet den Mac mit dem Pi über das normale Netzwerkkabel und stellt beim Mac ein, dass man **das drahtlose Netz gerne mit dem Ethernet teilen** will. Das geht über System Preferences → Sharing → Internet Sharing. Dann probiert man sich mit SSH zu verbinden. Die Adresse hat die Form 192.168.2.n wobei n eine Zahl ab 2 ist. Bei mir hat es mit 3 schon funktioniert:

alex@Pyrobombus:~$ ssh pi@192.168.2.3

Benutzername ist *pi* und Passwort ist *raspberry*.

Dann startet man *sudo raspi-config* und setzt die Kiste auf. expand rootfs, configure keyboard, change locale (ich habe de_CH.UTF8 gewählt und en_GB.UTF8 als Default gelassen). Die Zeitzone habe ich auf Europe _ Zurich gesetzt._

Der erste Schritt ist getan!

Das System auf den neuesten Stand bringen:

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo apt-get autoremove

Die erste Anweisung holt sich ein Verzeichnis der aktuelle Pakete, die zweite Anweisung lädt neuere Versionen runter und installiert sie. Die letzte Anweisung sorgt dafür, dass unbenötigte Packete deinstalliert werden.

Vielleicht ist dass folgende Paket schon installiert. Damit wird der Name des Rechners automatisch im Netz bekannt gemacht. Das ist Bonjour für den Raspberry.

Bonjour

pi@raspberrypi ~ $ sudo apt-get install libnss-mdns

Vom Mac aus testen:

alex@Pyrobombus:~$ ssh pi@raspberrypi.local

Ich würde das Passwort des pi Benutzers noch ändern:

pi@raspberrypi ~ $ passwd

Wireless

Den Raspberry Pi wollen wir nicht nur über den Mac ans Netz hängen. Der Raspberry Pi soll direct am Router hängen, also müssen wir das drahtlose Netz zum laufen kriegen. Hier habe ich viele Anleitungen gesehen und viel herumgebastelt. Was schussendlich aber funktioniert hat, ist *wicd-curses*.

pi@raspberrypi ~ $ apt-get install wicd-curses

In der Liste sucht man sich sein Netzwerk aus und drückt den Pfeil nach rechts.

Bei der statischen IP schreibt man die *inet addr* rein, die man in der *ifconfig* Ausgabe findet. Im Moment verwendet Raspberry Pi nämlich DHCP und hat eine dynamische Nummer vom Router zugewiesen bekommen. Diese schreiben wir halt einfach für die Zukunft fest.

pi@raspberrypi ~ $ ifconfig
...
wlan0     Link encap:Ethernet  HWaddr 80:1f:02:8f:91:26
          inet addr:10.0.1.10  Bcast:10.0.1.255  Mask:255.255.255.0
...

Wir müssen uns beides merken. Die Hardware Adresse (die MAC Adresse) ist das Teil hinter `HWaddr`: 80:1f:02:8f:91:26. Die IP Nummer ist das Teil hinter `inet addr`: 10.0.1.10.

Bei DNS domain und Search domain müsst ihr wohl etwas anderes hinein schreiben. Die genauen Werte findest du auf deinem Mac: System Preferences → Network → AirPort → Advanced... → DNS → Search Domains. Ich bin mir allerdings nicht sicher, ob da überhaupt was drinnen stehen muss. Ich habe es halt einfach abgeschrieben.

[X] Use Static IPs
IP:     10.0.1.10
Netmask:255.255.255.0
Gateway:10.0.1.1

[X] Use Static DNS                      [ ] Use global DNS servers
DNS domain:   v.cablecom.net
Search domain:v.cablecom.net
DNS server 1:        10.0.1.1
DNS server 2:
DNS server 3:

[ ] Use DHCP Hostname
DHCP Hostname: raspberrypi

[ ] Use these settings for all networks sharing this essid
[X] Automatically connect to this network
[X] Use Encryption
WPA 1/2 (Passphrase)    vvv
Preshared key: ********
F10:OK                                  ESC:Cancel

Weil F10 vielleicht komische Mac Sachen macht, kann man den Dialog mit ⌘F10 schliessen.

Kurze vi Einführung

Ich editiere Dateien oft mit *vi*. Ein Beispiel, welches wir bald brauchen werden:

pi@raspberrypi ~ $ sudo vi /etc/modules

Im vi gibt es zwei Modi: “insert mode” und “command mode”. Wenn man eine Datei editiert, ist man im Kommando Modus. Mit den Pfeilen navigiert man zu dem Ort, wo man etwas einfügen will.

Dann schreibt man soviel man will und am Ende verwendet man ESC um in den Kommando Modus zurück zu finden.

Mail Server

Wir verwenden Dovecot. Um es installieren zu können, muss das IPv6 Modul anscheinend immer geladen sein.

Dovecot

pi@raspberrypi ~ $ modprobe ipv6
pi@raspberrypi ~ $ apt-get install dovecot-imapd

IPv6 immer laden: man trägt es in ​##/etc/modules## ein.

pi@raspberrypi ~ $ cat /etc/modules
1. /etc/modules: kernel modules to load at boot time.
1.
1. This file contains the names of kernel modules that should be loaded
1. at boot time, one per line. Lines beginning with "#" are ignored.
1. Parameters can be specified after the module name.

ipv6

Leider gibt es immer wieder komische Fehler bei Dovecot.

pi@raspberrypi ~ $ sudo doveadm log errors

Deswegen habe ich in einer Konfigurationsdatei noch eine Änderung gemacht:

pi@raspberrypi ~ $ sudo vi /etc/dovecot/conf.d/10-mail.conf

Wichtig ist diese Einstellung:

mail_privileged_group = mail

Zudem möchte ich die Mails in einer seltsamen Mischung von mbox Format und maildir Format ablegen:

mail_location =mbox:~/mail:LAYOUT=maildir++:INBOX=/var/mail/%u:CONTROL=~/mail/control:INDEX=~/mail/indexes

User anlegen

Ich will schlussendlich Mails für Alex und Claudia hier empfangen und zwischenlagern. So lege ich die Benutzer an und ändere ihr Passwort:

pi@raspberrypi ~ $ useradd -m alex
pi@raspberrypi ~ $ passwd alex
pi@raspberrypi ~ $ useradd -m claudia
pi@raspberrypi ~ $ passwd claudia

Eventuell muss man für diese Benutzer noch die richtigen Verzeichnisse anlegen. Für jeden also:

pi@raspberrypi ~ $ sudo su alex
alex@raspberrypi /home/pi $ cd
alex@raspberrypi ~ $ mkdir mail
alex@raspberrypi ~ $ mkdir mail/control
alex@raspberrypi ~ $ mkdir mail/indexes
alex@raspberrypi ~ $ exit
exit
pi@raspberrypi ~ $

Dovecot wird seine Dateien hier nun ablegen. Das kann man später dann mal so prüfen:

pi@raspberrypi ~ $ sudo ls -a /home/alex/mail
.  ..  control	.Deleted Messages  dovecot.mailbox.log	.INBOX	indexes
pi@raspberrypi ~ $ sudo ls -a /home/alex/mail/control
.  ..  dovecot-uidvalidity  dovecot-uidvalidity.522f96e9  .subscriptions
pi@raspberrypi ~ $ sudo ls -a /home/alex/mail/indexes
.  ..  .Deleted Messages  .INBOX

Mails holen

Das passiert mit *fetchmail*.

pi@raspberrypi ~ $ apt-get install fetchmail

Nun kann jeder Benutzer selber entscheiden, wie er seine Mails bekommt. Dies wird in die **~/.fetchmailrc** Datei geschrieben. Hier beispielsweise mein Setup für alex@gnu.org:

pi@raspberrypi ~ $ sudo su alex
alex@raspberrypi /home/pi $ cd
alex@raspberrypi ~ $ cat .fetchmailrc
poll fencepost.gnu.org
  protocol apop
  user alex
  pass '*mein Passwort*'
  ssl
  mda '/usr/lib/dovecot/dovecot-lda'

poll imap.gmail.com
  protocol imap
  user kensanata
  pass '*mein App-spezifisches Passwort*'
  ssl

Das kann man nun austesten. -v steht für “verbose output”. Obige Einstellung mit dem Mail Delivery Agent (MDA) wird so wohl mangels Berechtigungen noch nicht funktionieren. Hierzu beim Thema Spam mehr. Erst mal schauen ob es ohne MDA Angabe geht.

alex@raspberrypi ~ $ fetchmail -v imap.gmail.com

Bist du zufrieden, kannst du nun alle paar Minuten deine Mails abholen gehen. Hierfür wird von jedem Benutzer ein *cronjob* eingerichtet.

alex@raspberrypi ~ $ EDITOR=vi crontab -e

Mit `EDITOR=vi` wird verhindert, dass der normale Editor verwendet wird. Das dürfte `nano` oder sonst so etwas sein.

Hier wollen wir eine Zeile hinzu fügen. Bei mir (und hier sieht man auch gleich, wie man sich den *crontab* auch anzeigen lassen kann):

alex@raspberrypi ~ $ crontab -l
...
1. m h  dom mon dow   command

So werden alle zehn Minuten meine Mails geholt. -s steht für “silent”. Jegliche Ausgabe, welche von einem cronjob produziert wird, wird uns nämlich zugesendet.

Spam Filter

Der GMail Spam Filter ist wirklich ausgezeichnet. Gibt es eine Alternative? Mein Email Provider verwendet offensichtlich SpamAssassin. Der fügt den vermuteten Spam Emails die Kopfzeile `X-Spam-Flag: YES` hinzu. Danach kann man filtern, wenn man Pigeonhole installiert:

Pigeonhole

pi@raspberrypi ~ $ sudo apt-get install dovecot-sieve

Nun muss man das noch anschalten:

pi@raspberrypi ~ $ sudo vi /etc/dovecot/conf.d/15-lda.conf

Und am Ende der Datei `mail_plugins` auskommentieren und `sieve` hinzufügen (im vi geht es mit `G` ans Ende der Datei):

protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}

Und dann muss man wahrscheinlich die Konfigurationsdateien neu laden:

pi@raspberrypi ~ $ sudo doveadm reload

Der Server sucht nach Filtern in der Datei `~/.dovecot.sieve`. Dort sollte für meinen Fall also drinnen stehen:

alex@raspberrypi ~ $ cat .dovecot.sieve
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
	fileinto "Junk";
}

Mehr Beispiele gibt es auf dem Dovecot Wiki.

auf dem Dovecot Wiki

Warum funktioniert das? Das funktioniert, weil wir in der Konfiguration für Fetchmail einen Mail Delivery Agent (MDA) angegeben haben – und zwar `dovecot-lda`. Dieses Programm berücksichtigt nicht nur unsere Sieve Regeln, es führt auch die Dovecot Indexe nach.

Leider bleibt noch ein Problem: `dovecot-lda` hat nicht die nötigen Rechte, um Mails im Mailsystem rum zu schieben! Falls man dieses Problem hat, sieht es so aus:

alex@raspberrypi ~ $ fetchmail
1 message for alex at fencepost.gnu.org (4871 octets).
fetchmail: MDA returned nonzero status 75
reading message alex@fencepost.gnu.org:1 of 1 (4871 octets) not flushed

Die Lösung? Jetzt wird es mühsam. Der Anleitung auf dem Wiki habe ich nicht folgen können. Das hat einfach nicht funktioniert.

Anleitung auf dem Wiki

Folgende Lösung reisst sicherlich ein grosses Loch in die Sicherheit vom System. Allerdings: In meinem Fall haben ja nur meine Frau und ich Zugriff auf den Rechner und der Rechner dient nur dazu, Mail zu holen und zu speichern. Deswegen will ich es wagen. Gerne würde ich die “richtige” Lösung kennen!

pi@raspberrypi ~ $ ls -l /usr/lib/dovecot/dovecot-lda
-rwxr-xr-x 1 root root 17896 Feb 10  2013 /usr/lib/dovecot/dovecot-lda
pi@raspberrypi ~ $ sudo chgrp mail /usr/lib/dovecot/dovecot-lda
pi@raspberrypi ~ $ sudo usermod -a -G mail alex
pi@raspberrypi ~ $ sudo usermod -a -G mail claudia

Wenn du eine bessere Lösung weist, bin ich dir für jeden Tipp dankbar.

Falls du weitere Probleme hast, hier noch ein paar Tipps für die Spurensuche.

Probleme beim Sieve werden hier aufgeführt:

alex@raspberrypi ~ $ cat .dovecot.sieve.log

Und natürlich sieht man noch eine Ausgabe im `/var/log/syslog` bzw `/var/log/mail.log`. Hier mit einem Test Mail, wo ich die Spam-Kopfzeile gleich selber hinein geschrieben habe:

pi@raspberrypi ~ $ tail /var/log/mail.log
...
Oct  4 13:55:23 raspberrypi dovecot: lda(alex): sieve: msgid=<m27gdt2la7.fsf@gnu.org>: stored mail into mailbox 'Junk'

Erfolg!

Von aussen zugänglich: Dynamic DNS

Ist man im eigenen, drahtlosen Netz, kann man nun schon problemlos Mails lesen. Als IMAP Server kann man **raspberrypi.local** angeben, Benutzer *alex*, Passwort wie gesetzt; Mails sendet man wie bisher via SMTP über den bestehenden SMPT host. Das machen wir nicht über den Raspberry Pi, weil es uns nicht mehr Sicherheit sondern nur mehr Aufwand beschehrt.

Was muss ich aber tun, damit der Raspberry Pi von aussen zugänglich ist?

Hierfür brauche ich ein Dynamic DNS setup. In meinem Fall habe ich beschlossen, **mail.alexschroeder.ch** zu verwenden. Die Domäne alexschroeder.ch habe ich schon. Der Hosting Provider hat schon ein Setup, welches mir die Kontrolle des Eintrages erlaubt.

In der Anleitung des Hosting Providers habe ich den entscheidenden Hinweis bekommen: Im Verzeichnis **~/.dnsupdate** seien zwei Dateien für mich abgelegt.

alex@mirabel:~$ ls .dnsupdate/
Kalex.+157+53225.key  Kalex.+157+53225.private

Diese beiden Dateien brauche ich bei mir. Und dann brauche ich noch ein Script, welches den Update macht:

pi@raspberrypi ~ $ mkdir .dnsupdate
pi@raspberrypi ~ $ scp alex@epfarms.org:.dnsupdate/* .dnsupdate/
pi@raspberrypi ~ $ mkdir bin
pi@raspberrypi ~ $ vi bin/update-ip

Der Inhalt des Skripts muss natürlich angepasst werden. **icanhazip.com** ist einer der vielen Websites, welche einem die eigene IP Adresse (also die Adresse des Routers, also des Apple AirPort) anzeigt.

pi@raspberrypi ~ $ cat bin/update-ip
#!/bin/sh
IPADDR=`wget -qO - icanhazip.com`
echo "update delete mail.alexschroeder.ch. A" > ~/.dnsupdate/nsupdate
echo "update add mail.alexschroeder.ch. 21600 IN A $IPADDR" >> ~/.dnsupdate/nsupdate
echo "" >> ~/.dnsupdate/nsupdate
nsupdate -k /home/pi/.dnsupdate/Kalex.+157+53225.key /home/pi/.dnsupdate/nsupdate

Das Skript mache ich noch ausführbar:

pi@raspberrypi ~ $ chmod +x bin/update-ip

Zum Inhalt des Skriptes. Ich generiere mir eine Liste von Befehlen in **~/.dnsupdate/nsupdate**, welche ich mit dem *nsupdate* Kommando am Ende ausführe. Dies löscht die bestehende IP Nummer für mail.alexschroeder.ch und legt sie neu an. Hierbei verwende ich die IP Nummer, welcher ich gerade eben herausgefunden habe.

Ich kann das auch von Hand überprüfen:

pi@raspberrypi ~ $ bin/update-ip
pi@raspberrypi ~ $ cat ~/.dnsupdate/nsupdate
update delete mail.alexschroeder.ch. A
update add mail.alexschroeder.ch. 21600 IN A 178.83.163.103

pi@raspberrypi ~ $

Selbst die Leerzeile am Ende stimmt.

Ob es funktioniert hat, kann ich ebenfalls herausfinden:

pi@raspberrypi ~ $ dig mail.alexschroeder.ch
...
;; ANSWER SECTION:
mail.alexschroeder.ch.	21415	IN	A	178.83.163.103
...

Super Sache! Jetzt fehlt nur noch eins: der Email Client findet die IP Nummer meines Routers und muss von diesem noch an den Raspberry Pi weiter geleitet werden. Das nennt man *port mapping* und wird beim Apple AirPort mit dem *AirPort Dienstprogramm* konfiguriert: Base station auswählen → Manual → Advanced → Port Mapping → + klicken. Es handelt sich um einen IMAP Server und entsprechend muss der TCP Port 993 (also mit Zugriff per SSL) auf die IP Nummer des Raspberry Pi umgeleitet werden. In meinem Beispiel ganz oben, dort wo es um die statische IP Nummer im drahtlosen Netz ging, war das die Nummer 10.0.1.10.

Im Normalfall verwendet man im Heimnetz DHCP, um IP Nummern dynamisch zu verteilen. Wenn man also hier aufhört, kann es passieren, dass der DHCP Server im Router immer wieder mal die Nummer 10.0.1.10 vergibt, obwohl unser Raspberry Pi diese Nummer fix verwendet. Dann kriegt man ab und zu die Fehlermeldung, dass ein anderer Computer im Netz die gleiche IP Nummer verwendet. Normalerweise ist das kein schlimmes Problem, weil die Nummer ja dynamisch vergeben wird. Der Computer ist dann einfach kurze Zeit offline und kriegt dann wieder eine neue IP Nummer. Aber besser ist natürlich, diese Konflikte zu vermeiden. Deswegen muss man eine *Ausnahme* definieren. Im *AirPort Dienstprogramm* ist das beispielsweise im Reiter Network → DHCP Reservations → + klicken. Die beiden Werte haben wir uns oben abgeschrieben, als wir auf dem Raspberry Pi `ifconfig` ausgeführt haben:

Description: Rapsberry Pi
  Reserve Address By: MAC Address
  MAC Address: 80:1f:02:8f:91:26
  IPv4 Address: 10.0.1.10

Nun kann ich meinen *Email Client umkonfigurieren*, so dass ich meine Mails statt bei raspberrypi.local bei mail.alexschroeder.ch abhole. Der DNS Server von alexschroeder.ch (ns1.epfarms.net) leitet das an die IP Nummer meines Routers weiter, der Router leitet das an den Raspberry Pi weiter, und so kann der Email Client die Mails vom Raspberry Pi lesen.

Das funktioniert natürlich nur, wenn man schon einen Domänenname hat und Subdomänen selber ändern darf. Ansonsten muss man sich beispielsweise bei afraid.org etwas organisieren.

Grundsätzlich gilt, dass man bei hohem Datenaufkommen die Mails vom Server in eigene, lokale Ordner verschieben sollte. So was muss man sich halt angewöhnen. Oder eine fette SD Karte kaufen.

SD Karte: Lebenszeit

Mal schauen wie lange die Karte hält. Auf StackExchange sah ich auf alle Fälle schon die Frage, die mich ebenfalls beschäftigt: How can I extend the life of my SD card? Ich habe das so verstanden: Die Karten verteilen die Schreiblast selbstständig auf alle Sektoren und im Normalfall reicht die Karte viele Jahre. Da sich die Technologie sowieso alle paar Jahre ändert, lohnt es sich nicht, darüber nachzudenken.

How can I extend the life of my SD card?

Probleme mit der ursprünglichen Anleitung

In meinem `.fetchmailrc` hatte ich für jede Mailbox noch die Anweisung `mda 'formail -c >> ~/mail/.INBOX'` stehen. Das war im c’t Artikel so angegeben. Das Problem war, dass Mail zwar empfangen wird, aber nicht angezeigt wird. Das lag vermutlich daran, dass die Indexe nicht nachgeführt wurden:

alex@raspberrypi ~ $ mail -s test kensanata@gmail.com
nochmal
.
EOT
alex@raspberrypi ~ $ fetchmail
fetchmail: No mail for alex at fencepost.gnu.org
8 messages (7 seen) for kensanata at imap.gmail.com.
reading message kensanata@gmail-imap.l.google.com:8 of 8 (1662 header octets) (9 body octets) flushed
alex@raspberrypi ~ $ ls -l mail/.INBOX mail/indexes/.INBOX/dovecot.index.*
-rw------- 1 alex alex 254220 Sep 16 06:48 mail/.INBOX
-rw------- 1 alex alex  21504 Sep 16 06:37 mail/indexes/.INBOX/dovecot.index.cache
-rw------- 1 alex alex   3720 Sep 16 06:37 mail/indexes/.INBOX/dovecot.index.log

Wie man sieht, wurde der Index nicht nachgeführt. Das hat im ursprünglichen Artikel wahrscheinlich funktioniert, weil bei der Dovecot `mail_location` Einstellung die Anweisung für die Indexe fehlte. Das hat bei mir im Dovecot Fehlerprotokol zu Problemen geführt: das entsprechende Verzeichnis fehlte. Ohne Indexe hat aber das Setup im Artikel wahrscheinlich funktioniert: neue Mail wurde sofort erkannt. Meine Lösung: Die neue Mail wird entweder via Dovecots `dovecot-mda` geliefert (damit ich Spam filtern kann), oder sie kommt in den normalen Mail Spool (wenn ich nichts angebe), also nach `/var/mail/alex`. Von dort holt Dovecot die Mails und speichert sie in `mail/.INBOX`, und führt den Index nach.

Mit meiner Anleitung sollte dieses Problem nicht mehr bestehen.

Ein weiteres Problem waren hunderte von Mails von Cron, welche mich darauf hinwiesen, dass es beim DNS Update einen Fehler gegeben habe. Das erste Mail kam vom `nsupdate` Befehl, dann kamen weitere sechs von `fetchmail`. Ich vermute, dies lag daran, dass meine Rechner ab und zu nicht zu finden waren. Deswegen habe ich das nun wie folgt implementiert:

#!/bin/sh
IPADDR=`wget -qO - icanhazip.com`
if [ -n "$IPADDR" ]; then
  echo "update delete mail.alexschroeder.ch. A" > ~/.dnsupdate/nsupdate
  echo "update add mail.alexschroeder.ch. 21600 IN A $IPADDR" >> ~/.dnsupdate/nsupdate
  echo >> ~/.dnsupdate/nsupdate
  nsupdate -k /home/pi/.dnsupdate/Kalex.+157+53225.key /home/pi/.dnsupdate/nsupdate
fi
if test $((`date +%s` - `date -r ~/.dnsupdate/nsupdate +%s`)) -gt $((6 * 60 * 60)); then
  echo No IP number for 6h
fi

Falls ich also eine IP Nummer bekomme, dann schreibe ich das Kommando und führe es aus. Falls das Kommando mehrere Stunden lang nicht geschrieben wurde, gebe ich eine Warnung aus, welche automatisch ein Mail generiert, welches ich aber erst bekommen werde, wenn die Verbindung wieder hergestellt wird. Damit will ich nur vermeiden, dass ich tagelang keine Ahnung habe, dass es immer wieder zu längeren Ausfällen kommt. Desweiteren habe ich mir einen eigenen Service geschrieben, der mir meine IP Nummer liefert, und zu guter Letzt habe ich noch eine weiter Fehlermeldung eingebaut:

#!/bin/sh
IPADDR=`wget -qO - https://alexschroeder.ch/ip`
if [ -n "$IPADDR" ]; then
  echo "update delete mail.alexschroeder.ch. A" > ~/.dnsupdate/nsupdate
  echo "update add mail.alexschroeder.ch. 21600 IN A $IPADDR" >> ~/.dnsupdate/nsupdate
  echo >> ~/.dnsupdate/nsupdate
  if ! nsupdate -k /home/pi/.dnsupdate/Kalex.+157+53225.key /home/pi/.dnsupdate/nsupdate; then
    echo nsupdate fail:
    cat ~/.dnsupdate/nsupdate
  fi
fi
if test $((`date +%s` - `date -r ~/.dnsupdate/nsupdate +%s`)) -gt $((6 * 60 * 60)); then
  echo No IP number for 6h
fi

Comments

(Please contact me if you want to remove your comment.)

Alex - nice work! Thanks for taking the time to write it up.

– charlie 2013-10-12 09:58 UTC

---

Gute Anleitung, bin ebenfalls gerade daran etwas in die Richtung zu bauen, aber: der NSA schlägt man damit kein Schnippchen, denn die Mails liegen immernoch bei Google & Co bis sie abgerufen werden.

Was müsste man tun, damit die Mails direkt auf den Raspberry ankommen? MX Record der Domain per Script oben auf die IP deines Raspberry ändern, aber wie müsst der Raspberry konfiguriert sein?

Grüße

ML

– Meister Longus 2013-11-07 08:28 UTC

---

Mein aktuelles Setup für Email, die nicht via Google kommt: Ich habe einen Server im Internet, mit fixer IP Nummer und allem was dazu gehört. Dort ist exim4 installiert und so konfiguriert, dass er Mails für meine Domänen annimmt. Bei meinem DNS Provider (Gandi) verwende ich ein Zonefile, welches ein MX Record für meinen Server im Internet hat, und von dem hole ich alle 10 Minuten meine Mail via Raspberry Pi. Ich traue mich im Moment noch nicht, den Raspberry Pi direkt anzugeben. Da hat es immer noch zu viele Unwägbarkeiten.

1. Ich hatte eine Weile lang immer wieder einen Systemabsturz auf dem Raspberry Pi. Einfach nicht mehr zu erreichen. Im Moment habe ich das so “gelöst”, dass der Raspberry Pi via cronjob in den frühen Morgenstunden neu gebootet wird. Ziemlich unelegant, würde ich sagen.

2. Ich rufe jede Stunde ein Script auf (mittlerweile verwende ich nicht mehr die Lösung mit nsupdate; Gandi unterstützt nur ein XMLRPC Protokoll, so dass ich ein entsprechendes Script von einem anderen Benutzer verwende). Dieses Script liefert mir auch immer wieder Fehler. Update ging nicht aus was weiss ich für Gründen. MX Records verdoppeln sich. Das ist mir zu riskant.

Sobald ich Zeit habe, um daheim mal längere Mails zu beantworten, bewege ich alle Mails vom Raspberry Pi auf meine lokale Maschine. Wer weiss, wie sicher der Raspberry Pi wirklich ist. Alle Mail liegt also ein paar Minuten auf meinem Server im Internet, und ein paar Tage auf dem Raspberry Pi, bevor sie in der Offline Welt verschwinden.

– Alex Schroeder 2013-11-07 09:43 UTC

Alex Schroeder

---

Hallo Alex,

hab deinen Artikel voller Freude gefunden und wollte gerade anfangen die Installation umzusetzen. Doch leider fehlt bei dir genau der Part, den ich im ct Artikel schlecht beschrieben finden: Die EXIM4 Installation! Was fehlt den funktional bei dir wenn du kein EXIM4 installiert hast? Sendest du deine Mails direkt per smtp über einen publik Mail Server? Dann hast du die versendeten Mails auch nicht im IMAP Ordner “gesendet”, oder?

Mfg Bernd

– 2013-11-29 16:04 UTC

---

Ist das überhaupt möglich, gar kein Mail auf einem GNU/Linux System? Wenn ein cronjob fehlschlägt, probiert das System beispielsweise eine Mail zu verschicken. Zumindest lokal sollte Mail also funktionieren, meiner Meinung nach.

Meine Mails sende ich direkt via SMTP an einen öffentlichen Mail Server. Mein Mail Client (zB. das iPhone) speichert eine Kopie dieser Mail im IMAP Ordner “Sent Mail” – und Dovecot richtet alles korrekt ein, damit das auch funktioniert. Hierfür wird EXIM4 also nicht benötigt.

– Alex Schroeder 2013-11-29 16:54 UTC

Alex Schroeder

---

Mit cron-apt meldet sich das System, wenn es Upgrades zu installieren gibt.

cron-apt

– Alex Schroeder 2014-01-09 23:51 UTC

Alex Schroeder

---

Wer ein anderes Tutorial sucht, wird vielleicht in der englischen Serie auf Ars Technica fündig. Erster Artikel: How to run your own e-mail server with your own domain, part 1. Heute habe ich auf alle Fälle probiert, auf meinem “richtigen” Rechner (also nicht auf dem Raspberry Pi) den Exim4 richtig zum laufen zu kriegen, so dass wir über den Mail verschicken können, aber es will einfach nicht klappen. TLS geht nicht, oder die selbst-signierten Zertifikate sind nicht gültig, und wie kann man Authentifizierung erzwingen. Eine mühsames, mühsames Geschäft. Zum Brechen.

How to run your own e-mail server with your own domain, part 1

– Alex Schroeder 2014-02-19

Alex Schroeder

---

Und mit dem vi muss man sich nun wahrlich nicht abquälen, der ist was für Masochisten. Der Raspberry hat natürlich den erheblich besseren “nano” an Bord! Außerdem ist noch ein kleiner Dreckfuhler dort versteckt, denn es soll sicher “Kurze Einführung...” heisen beim vi, oder?

Thema SD Karte: Das Problem ist wenn man Class 10 Karten verwendet und den RasPi übertaktet. Das sollte man mit Class 10 Karten nicht machen sondern immer Class 4 Karten dafür verwenden. Der Dateizugriff ist etwas langsamer aber man kann gefahrlos übertakten Eine Class 4 Karte sollte also problemlos halten.

gefahrlos übertakten

Woe wärs noch jetzt mit einem Webmailer um die Mails mit dem Browser abzuholen ?? Squirrel Mail und Roundcube sind da ja die Klassiker.

Squirrel Mail

Roundcube

– wwinzig 2014-02-26 12:03 UTC

---

Als Emacs User finde ich vi natürlich sehr gewöhnungsbedürftig, aber nano finde ich noch schlimmer...

Webmailer finde ich halt noch mal ein Risiko mehr – und für mich völlig unnötig, da ich Mails mit der Mail Applikation auf meinem Telefon lese und nicht über einen Web Browser.

– Alex Schroeder 2014-02-26 12:31 UTC

Alex Schroeder

---

Nach DSA-2896-1 openssl -- security update zum Thema Heartbleed den Anleitungen auf dem Debian Wiki (zu einer früheren Sicherheitslücke) folgen.

DSA-2896-1 openssl -- security update

Heartbleed

auf dem Debian Wiki

sudo apt-get update
sudo apt-get upgrade
sudo rm /etc/dovecot/dovecot.pem /etc/dovecot/private/dovecot.pem
sudo dpkg-reconfigure dovecot-core
sudo rm /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server

Etwas nachdenken muss man bei den privaten Schlüsseln in `~/.ssh` – falls welche vorhanden sind. Falls man diese Schlüssel neu generiert, muss man die hinterlegten Schlüssel auf Savannah, GitHub, und so weiter natürlich ebenfalls erneuern.

ssh-keygen

– AlexSchroeder 2014-04-09 12:23 UTC

---

Beim Austauschen aller Schlüssel und dem Ändern aller Passwörter ist mir aufgefallen, dass ein Schritt in meiner Kette nicht mehr funktioniert. Im Artikel selber schrieb ich, dass im `~/.fetchmailrc` von meinem Benutzer zwei hosts abgefragt werden. In Tat und Wahrheit hat es aber noch einen dritten Eintrag, wo ich Mail von einem selber eingerichteten Server hole!

poll psithyrus
  protocol imap
  user alex
  pass '*secret*'
  ssl sslcertck
  sslcertfile .ssh/psithyrus.pem

Hier ist relevant, dass ich auf dem Psithyrus Rechner ja den Schlüssel gelöscht habe. Also muss ich den wieder zu mir kopieren: von `psithyrus:/etc/dovecot/dovecot.pem` nach `raspberrypi:.ssh/psithyrus.pem` – und das Passwort musste ich natürlich auch anpassen.

– AlexSchroeder 2014-04-09 20:29 UTC

---

Den YouTube Video zum Thema fand ich auch gut. Blog Post gibt es auch dazu.

YouTube Video

Blog Post

– Alex Schroeder 2014-09-11 20:43 UTC

---

Hi and many thanks for the walk-through to configure a private email server. You were mentioning difficulties with dovecot-lda. Alternatively, for the purpose of filtering similarly to what sieve does in your configuration, it may be possible to remain with procmail as MTA for fetchmail but use a procmailrc such as follows:

1. file: /etc/procmailrc
1. system-wide settings for procmail
SHELL="/bin/bash"
SENDMAIL=/usr/sbin/sendmail
SENDMAILFLAGS="-oi"
LOGFILE="/var/log/procmail.log"
DELIVER="/usr/lib/dovecot/deliver"
DROPPRIVS=yes
1. fallback:
DEFAULT="$HOME/mail/"
MAILDIR="$HOME/mail/"
0 w

| $DELIVER -m Junk
:0 w

| $DELIVER -m Junk
:0 w

| $DELIVER -m Junk
:0 w

| $DELIVER -m Junk
:0 w

| $DELIVER -m Junk
:0 w
| $DELIVER

(It may be possible to simplify this further. Not sure about the values set by GMX for the X-GMX-_ headers, could not find their documentation.)_

– Ralf 2014-11-09 17:37 UTC

---

Many years ago I had a very elaborate procmail setup. Good times! 🙂

– Alex Schroeder 2014-11-09 18:48 UTC

---

Oh, and I realized that the remaining articles of the Ars Technica series went live ages ago:

Taking e-mail back, part 2: Arming your server with Postfix and Dovecot, Taking e-mail back, part 3: Fortifying your box against spammers, Taking e-mail back, part 4: The finale, with webmail & everything after.

Taking e-mail back, part 2: Arming your server with Postfix and Dovecot

Taking e-mail back, part 3: Fortifying your box against spammers

Taking e-mail back, part 4: The finale, with webmail & everything after

– Alex Schroeder 2014-11-09 18:54 UTC

---

Hi,

ich bin mit der Anleitung der ct, ergänzt um um den Pfad für Index(e), in ein Problem gerannt bei dem Dovecot offenbar die Daten nicht sauber gelesen hat. Nachdem ich (vergeblich) das Thema “Daten im NFS” (hatte sie ursprünglich auf den NAS gelegt) beackert habe, bin ich auf Deine Anleitung gestossen.

Habe dann mda `/usr/lib/dovecot/dovecot-lda` benutzt. Bin nicht sicher ob das Nachführen der Indexe jetzt klappt, könnte aber sein.

Zumindest tauchen keine errors mehr im logfile auf🙂 Damit hättest Du meiner lange Suche schon mal ein mögliches Ende bereitet, ich weiss gar nicht mehr wie lange ich an dem System jetzt schon bastele!

Das Problem das ich jetzt habe ist:

Mit der “alten” Lösung habe ich in den .fetchmailrc der einzelnen User die gewünschten Mailboxverzeichnisse mit formail direkt in die “Mailboxen” (.INBOX, .SENT etc) sortieren lassen.

Mit der dovecot-lda-Lösung kann ich a) kein Verzeichnis beim Provider angeben, dann wird nur .INBOX abgeholt oder b) Verzeichnisse (zusätzlich wie der alten Lösung) angeben, dann wird aber trotzdem alles in .INBOX abgelegt. Wenig spassig😉

Wie hast Du das denn gelöst mit den Verzeichnissen?

Zum einen brauche ich .SENT weil die clients direkt über den smtp des Providers gehen (ok zur Not könnte ich sicher auch die Einsatzfähigkeit des exim vorziehen), zum anderen besteht immer noch die Möglichkeit daß jemand direkt im Webmail des Providers arbeitet. Und im Moment werden noch beide Lösungen (imap beim Provider und raspberry) parallel benutzt - das will ich erst ändern wenn der Raspberry 100% läuft. Im Moment würde ich halt gerne die unterschiedlichen Verzeichnisse abfragen. Wenn das geht. Ohne daß das alles in .INBOX landet.

Achja, und für einen speziellen Absender wird auf dem Server auch noch gleich sortiert in ein Verzeichnis.

Muss ich das alles irgendwie über den Sieve basteln? Mit dem hatte ich noch nie zu tun und eigentlich wollte ich an Filter und Spam erst rangehen wenn der Rest läuft... Quasi die Kür nach der Pflicht...

Danke,

Michael.

– Michael 2015-03-31 22:34 UTC

---

Ach, wargs, vergiss die Frage... -m und dann den Folder angeben ist die Lösung... Ich habe heute einfach schon zu lange gebastelt😟

So wie es aussieht - das wird sich erst in den nächsten Tagen zeigen - ist Deine Lösung die Mails nicht mit formail zu verteilen genau die Richtige. Danke, Danke!

Jetzt kann ich wahrscheinlich daran gehen die Daten wieder auf NFS zu schieben von wo ich sie geholt habe weil ich dachte da kämen die defekten Mails her😄

– Michael 2015-03-31 22:42 UTC

---

Hah, viel Glück!

Bei mir läuft der Raspberry Pi inzwischen nicht mehr als vollwertiger Mail Server. Die Mails kommen an, alle Benutzer haben eine `~/.forward` Datei, welche die Mails an Google weiter leiten. Mein Problem: Bei all den Sicherheitsdiskussionen zum Thema SSH, Zertifizierung und so weiter stelle ich fest, wie wenig sattelfest ich bin. Und dann muss ich abwägen:

1. Wenn meine Sicherheitsinfrastruktur gut ist, bin ich gegen Schnüffler und Verbrecher geschützt.

2. Wenn meine Sicherheitsinfrastruktur schlecht ist, bin ich gegen niemanden geschützt.

3. Wenn ich meine Mails bei Google habe, bin ich auf alle Fälle gegen Verbrecher geschützt.

Falls ich zwischen tag(1) und tag(2) mangels Know How nicht unterscheiden kann, scheint mir tag(3) die beste Alternative.

– Alex Schroeder 2015-04-01 08:29 UTC

---

@Alex: Deine Überlegungen finde ich sehr gut, gerade wenn man solche Lösungen auf günstigen vHost installiert. Mir scheint allerdings die Lösung 3 dann doch etwas übertrieben, da Google und die NSA nicht evtl. Deine Mails lesen, sondern es definitiv tun. Da empfehle ich lieber Dienste wie posteo https://posteo.de/de da werden die Daten auf Wunsch komplett verschlüsselt gespeichert. Die einzige Lücke ist, wenn jemand Dein Passwort herausbekommt, was ein Server-Anbieter natürlich immer tun kann. Das ganze für 1€/Monat.

https://posteo.de/de

– niels 2015-04-27 05:14 UTC

---

Vielleicht ist das ja die richtige Lösung. Ich habe von Posteo noch nie gehört und sehe keinen Anlass, denen wirklich zu trauen. Bei Google kenne ich wenigstens ein paar Mitarbeiter, die sehr integer wirken. Aber ich gebe zu, Über Posteo liest sich sehr positiv.

Über Posteo

– Alex Schroeder 2015-04-27 05:57 UTC

---

Alternativ geht auch Mailbox.org (https://mailbox.org/) dahinter steckte eine Firma die schon seid Jahren sich mit Linux beschäftigt. Ich denke beide sind vertrauenswürdig, denn es ist relativ blöd so einen Aufwand zu treiben, wenn man eigentlich doch an die Daten ran will. Aber das muss natürlich jeder selber wissen. Weil ein paar Leute bei Google integer wirken auf die gesamte Mail-Manschaft zu schließen + dem Wissen, dass sie Daten lesen und auch rausgeben müssen, finde ich da schon gewagter.

https://mailbox.org/

– niels 2015-05-17 18:50 UTC

---

Hallo, sehr interessante Diskussion. Ich habe mir einen Pi zugelegt, um damit Smart Home-Themen zu realisieren (vor allem kabelgebundene Temperaturmessung). Mein Mailserver läuft auf einem Synology NAS hinter einer dynamischen IP, holt die Mails vom gleichnamigen Mailkonto auf Strato ab und versendet über das Strato-Relais. Per IMAP greife ich dann problemlos von diversen Clients (iphone, android, Lubuntu, Mac) auf den Server zuhause zu. Die Mails liegen nur ein paar Minuten bei Strato und werden auf dem NAS regelmäßig automatisch auf ein zweites NAS gebackuped. Ich weiß nicht, ob das interessant ist, wollte es hier aber anmerken. Durch die Software von Synology entfällt vieles von der aufwändigen Mailserverkonfiguration. Inwieweit das unsicher sein könnte kann ich allerdings nicht einschätzen.

– Ben 2015-10-11 05:05 UTC

---

Heute habe ich im c't einen äusserst positiven Artikel zu Posteo gelesen.

im c't

– Alex Schroeder 2015-11-02 12:14 UTC

---

Ich habe gerade mein Modem gewechselt und habe damit auch einen neuen Router erhalten.

+------------------+---------------+
|     Local IP     | 192.168.0.199 |
+------------------+---------------+
| Local start port |           993 |
| Enabled          | On            |
+------------------+---------------+

Nun muss ich nur noch schauen, ob ich auch Email versenden und empfangen kann. 🙂

(Mehr Info auch hier: Kallobombus Mail.)

Kallobombus Mail

– Alex Schroeder 2016-06-27 20:20 UTC

---

Zwei weitere Probleme:

1. Mein neues Modem erlaubt mir kein Port Forwarding auf den Port 25. Wie mühsam. Im Moment leite ich den externen Port 587 auf den internen Port 25, wo Exim die SMTP Verbindungen entgegennimmt.

2. How to upgrade a Wheezy image to Jessie

How to upgrade a Wheezy image to Jessie

Ich habe leider so viele Änderungen an den Dovecot, Spam-Assassin, DKIM und sonstigen Konfigurationsdateien gemacht, dass ich beschlossen habe, überall die Kopie der Maintainer zu übernehmen und für Debian Jessie wieder von vorne zu beginnen.

Erster Test:

Kann ich mir selber eine Mail schreiben?

pi@raspberrypi ~ $ mail pi
Subject: test
local delivery
.
EOT
pi@raspberrypi ~ $ mail
No mail for pi

Tönt nach einem Problem.

pi@raspberrypi ~ $ sudo doveadm log errors
pi@raspberrypi ~ $ sudo tail /var/log/exim4/mainlog
pi@raspberrypi ~ $ sudo tail /var/log/exim4/rejectlog

Keine Hinweise. Mist!

Mal schauen:

pi@raspberrypi ~ $ sudo less /var/log/mail.log
...
Jul  7 19:41:33 raspberrypi postfix/pickup[31950]: 5E4E3175: uid=1000 from=<pi>
Jul  7 19:41:33 raspberrypi postfix/cleanup[1892]: warning: connect to Milter service inet:localhost:12301: Connection refused
Jul  7 19:41:33 raspberrypi postfix/cleanup[1892]: 5E4E3175: message-id=<20160707174133.5E4E3175@mail.alexschroeder.ch>
Jul  7 19:41:33 raspberrypi postfix/qmgr[31951]: 5E4E3175: from=<pi@alexschroeder.ch>, size=477, nrcpt=1 (queue active)
Jul  7 19:41:33 raspberrypi postfix/cleanup[1892]: 8551F3D: message-id=<20160707174133.5E4E3175@mail.alexschroeder.ch>
Jul  7 19:41:33 raspberrypi postfix/qmgr[31951]: 8551F3D: from=<pi@alexschroeder.ch>, size=611, nrcpt=1 (queue active)
Jul  7 19:41:33 raspberrypi postfix/local[1894]: 5E4E3175: to=<pi@alexschroeder.ch>, orig_to=<pi>, relay=local, delay=0.27, delays=0.16/0.07/0/0.04, dsn=2.0.0, status=sent (forwarded as 8551F3D)
Jul  7 19:41:33 raspberrypi postfix/qmgr[31951]: 5E4E3175: removed
Jul  7 19:41:33 raspberrypi dovecot: lmtp(1897): Connect from local
Jul  7 19:41:33 raspberrypi dovecot: lmtp(1897, alex): 4Oe4LU2UfldpBwAAE+zmiA: msgid=<20160707174133.5E4E3175@mail.alexschroeder.ch>: saved mail to INBOX
Jul  7 19:41:33 raspberrypi postfix/lmtp[1896]: 8551F3D: to=<alex@alexschroeder.ch>, orig_to=<pi>, relay=mail.alexschroeder.ch[private/dovecot-lmtp], delay=0.42, delays=0.02/0.02/0.18/0.2, dsn=2.0.0, status=sent (250 2.0.0 <alex@alexschroeder.ch> 4Oe4LU2UfldpBwAAE+zmiA Saved)
Jul  7 19:41:33 raspberrypi dovecot: lmtp(1897): Disconnect from local: Successful quit
Jul  7 19:41:33 raspberrypi postfix/qmgr[31951]: 8551F3D: removed
...

Cool, die Mail wurde also irgendwo abgespeichert. Bloss wo? Ich rate mal, `/var/mail/alex` und prüfe das Ende der Datei:

pi@raspberrypi ~ $ sudo tail -n 27 /var/mail/alex
From pi@alexschroeder.ch  Thu Jul 07 19:41:33 2016
Return-Path: <pi@alexschroeder.ch>
Delivered-To: <alex@alexschroeder.ch>
Received: from mail.alexschroeder.ch
	by mail.alexschroeder.ch (Dovecot) with LMTP id 4Oe4LU2UfldpBwAAE+zmiA
	for <alex@alexschroeder.ch>; Thu, 07 Jul 2016 19:41:33 +0200
Received: by mail.alexschroeder.ch (Postfix)
	id 8551F3D; Thu,  7 Jul 2016 19:41:33 +0200 (CEST)
Delivered-To: pi@alexschroeder.ch
Received: by mail.alexschroeder.ch (Postfix, from userid 1000)
	id 5E4E3175; Thu,  7 Jul 2016 19:41:33 +0200 (CEST)
Date: Thu, 07 Jul 2016 19:41:33 +0200
To: pi@alexschroeder.ch
Subject: test
User-Agent: Heirloom mailx 12.5 6/20/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20160707174133.5E4E3175@mail.alexschroeder.ch>
From: pi@alexschroeder.ch
X-UID: 14343
Status:
X-Keywords:
Content-Length: 15

local delivery

OK, das Allerwichtigste funktioniert also.

Im Moment funktioniert der Mail Zugriff von aussen allerdings nicht. Das heisst IMAP, das heisst Dovecot, das heist Port 993 prüfen, SSL prüfen, Benutzer authorisierung prüfen, und Ordnerstruktur prüfen. Im `/etc/dovecot/conf.d/` hat es ziemlich viele Dateien mit der Endung `.ucf-dist` und `.ucf-old`. Die muss ich mir mal anschauen.

Mittels `egrep` filtere ich alle Leerzeilen und alle reinen Kommentarzeilen raus, damit ich klarer sehe, was denn überhaupt eingestellt wird.

pi@raspberrypi /etc/dovecot/conf.d $ egrep -v '^( *#|$)' 10-auth.conf
disable_plaintext_auth = yes
auth_username_format = %Ln
auth_mechanisms = plain
!include auth-system.conf.ext

Sieht vernünftig aus?

pi@raspberrypi /etc/dovecot/conf.d $ egrep -v '^( *#|$)' 10-mail.conf
mail_location = mbox:~/mail:LAYOUT=maildir++:INBOX=/var/mail/%u:CONTROL=~/mail/control:INDEX=~/mail/indexes
namespace inbox {
  inbox = yes
}
mail_privileged_group = mail

Das mit der `mail_location` bleibt ein Mist, bin ich einverstanden. Aber so weiss ich wenigstens, dass die INBOX die Datei `/var/mail/pi` ist. Und dort habe ich ja meine Test Mail gefunden. Also sieht das auch vernünftig aus.

Bei `10-ssl.conf` gab es Änderungen, die nicht so vernünftig aussehen. Also schnell `sudo vi 10-ssl.conf` angeworfen, so dass das Resultat dann so aussieht:

pi@raspberrypi /etc/dovecot/conf.d $ egrep -v '^( *#|$)' 10-ssl.conf
ssl = required
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

Also habe ich `ssl` zwingend gemacht und die schon früher mal generierten `.pem` Dateien auskommentiert...

Mit `20-lmtp.conf` bin ich auch nicht zufrieden. Da ist `sieve` rausgefallen. Also wieder editieren bis es wie folgt aussieht:

pi@raspberrypi /etc/dovecot/conf.d $ egrep -v '^( *#|$)' 20-lmtp.conf
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

Konfiguration neu laden mit `sudo doveadm reload` und dann wieder versucht, Mail mit meinem iPhone zu lesen...

Und es hat geklappt!

pi@alexschroeder.ch
test
local delivery

Yay!

– Alex Schroeder 2016-07-07

---

Hallo Alex,

danke für das Tutorial! Ich habe aber eine Frage im Vorfeld, bevor ich das umsetzen möchte. Ich betreibe meinen eigenen Exchange Server. Der läuft im Prinzip ohne Probleme. Nur...wenn es welche gibt und ich “Hand anlegen muss”, habe ich keine Lust bei Strato den dortigen Backup-Mail-Server zu aktivieren. Bequemer wäre es einen MX-Eintrag einzustellen, der auf (in diesem Fall der Raspberry) einen anderen Mail-Server verweist.

Wäre das damit möglich? Lieben Dank für Deine Antwort Gysbert

– Gysbert 2019-01-13 11:48 UTC

---

Hallo Gysbert

Leider betreibe ich den Raspberry Pi schon lange nicht mehr als E-Mail Server und habe deswegen keine Ahnung. MX-Einträge ändern sollte problemlos sein. Dafür ist die ganze Sache ja gemacht.

– Alex Schroeder 2019-01-13 13:58 UTC

---

Hallo Alex, ich habe bei Strato eine Domain und meinen eigenen Exchange Server zu Hause. In meiner Fritte habe ich als DynDNS folgendes Update-Schema eingetragen: https://dyndns.strato.com/nic/update?system=dyndns&hostname=beispiel.de&myip=&mx=beispiel.de&wildcard=ON&backmx=YES “beispiel.de” muss natürlich in die eigene Domain umbenannt werden. Dies gilt nur für STRATO, bei anderen weiß ich nicht. Als DynDNS-Anbieter im Router sollte man aber nicht STRATO auswählen, auch wenn es angeboten wird. Nimm bitte Benutzerdefiniert. Der Standardeintrag aktualisiert keine MX-Einträge. Beim Eintrag “backmx=” kannst du auch den Strato Server eintragen oder ganz deaktivieren.

https://dyndns.strato.com/nic/update?system=dyndns&hostname=beispiel.de&myip=&mx=beispiel.de&wildcard=ON&backmx=YES

– David 2020-02-06 08:04 UTC

---

Self-hosting mail requires a minimum of knowledge and dedication, it is not a two-clicks thing, you need to have some basic knowledge and you have to be willing to pour some time into it. If you’ve never touched a DNS zone or if you think that taking an hour to setup something is hard, then this will not be easy and I don’t recommend you do it unless you WANT to learn a ton of stuff. – Setting up a mail server with OpenSMTPD, Dovecot and Rspamd

Setting up a mail server with OpenSMTPD, Dovecot and Rspamd

– Alex 2021-09-15 04:20 UTC

---

I implemented all the acronyms, secured antispam measures, verified my domain, made sure my server is neither breached nor used to relay actual spam, added new servers with supposedly clean IPs from reputable providers, tried all the silver bullets recommended by Hacker News, used kafkaesque request forms to prove legitimity, contacted the admins of some blacklists. – After self-hosting my email for twenty-three years I have thrown in the towel. The oligopoly has won.

After self-hosting my email for twenty-three years I have thrown in the towel. The oligopoly has won.

– Alex 2022-09-05 10:05 UTC