Using Raspberry Pi or Beaglebone Black as Mail-Server

If you are working with more than one computer you might know this problem – your incoming and outgoing mails are spread over your several computers and often enough you have to search one specific mail on several machines.

To avoid that an IMAP-Mailbox with enough storage ist the best solution. But if you are not in the comfortable situation that someone has already done that for you, you might want to build one on your own.

I decided to use my Raspberry Pi to achieve that.

Of course there is more than one way to setup a mail-server with Linux, but after a while of trying my choice was getmail and dovecot.
For me the main advantage of getmail is, that you dont need a third-party-tool such as postfix to handle the Maildir-Format. And Maildir-Format is the first choice for my mailbox, because you can create subfolders from within your mail-client and store the incoming mail in those subfolders.

The plan is that getmail collects the emails from different mailboxes and stores them in the local mailbox of each user. Dovecot is then responsible for the delivery of the mails to the different users.
Then you can create a new mailbox in your mail client, where the incoming e-mail server is then the own server.
Credentials are then the user name and password that will be created.
Outgoing mail server remains the the SMTP server of your provider, such as Web.de or GMail.

So to get your little mailserver up and running you of course have to install the needed packages first.
( On a Rasperry Pi become user root with

sudo su

)

Type

sudo apt-get install dovecot-imapd getmail4

to install the packages.

Prepare user and group

After a fresh install only the user „root“ or „pi“ on a Raspberry are available. So to give different users each a own mailbox, these users need to be added.
For this type

root@server ~ # adduser USER
Lege Benutzer »USER« an ...
Lege neue Gruppe »USER« (9999) an ...
Lege neuen Benutzer »USER« (9999) mit Gruppe »USER« an ...
Erstelle Home-Verzeichnis »/home/USER« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues UNIX-Passwort ein: 
Geben Sie das neue UNIX-Passwort erneut ein: 
passwd: Passwort erfolgreich geändert
Benutzerinformationen für USER werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
	Vollständiger Name []: Your Name
	Zimmernummer []: 
	Telefon geschäftlich []: 
	Telefon privat []: 
	Sonstiges []: 
Sind die Informationen korrekt? [J/n] 

Of course the name USER has to be replaced by the real name of the user.

Now create the mail directory for every user and set the right permissions:

mkdir /home/USER/Maildir
chown -R USER:mail /home/USER/Maildir
chmod -R 770 /home/USER/Maildir

If dovecot is installed it has no group by default. So to give dovecot the rights that it needs to handle your mailbox correctly you should add a group, that dovecot will belong to – lets say the group ‚mail‘.
So create the group ‚mail‘ first with the command

sudo groupadd mail

If the group already exist you will get a notification.
Then dovecot needs to be added to this group with

sudo usermod -G mail dovecot

After that you have to make some changes in the config file of dovecot, so that dovecot knows, where the mail is stored. To do so type

nano /etc/dovecot/dovecot.conf

In that file add or uncomment the following lines:

listen = *

mail_location = maildir:~/Maildir:LAYOUT=fs
mail_access_groups=mail

With these lines you tell dovecot, that it has to listen on every incoming IPv4 connection, that the folder of the stored mails is in the users home directory ( ~ ) and is named Maildir, that the mails have to be stored in the maildir-format and that it belongs to the system-group mail.

This is all we have to do with dovecot.
Now getmail needs to be configured.

All getmail configuration occurs in the .getmail/ folder of the user’s home directory. The configuration is stored in a resource-file. If you have multiple accounts, define each account in a seperate file in the ~/.getmail/ directory. The resource-files can be named as you like. Create the required directories and set their permissions with the following commands:

mkdir ~/.getmail/
chmod 700 ~/.getmail/

And now lets define a resource file, for example for a google-account.
Create the file with

nano .getmail/myGoogleAccount

and add the following lines.

[retriever]
type = SimplePOP3SSLRetriever
server = pop.gmail.com
port = 995
username = your-user-name
password = your-password

[destination]
type = Maildir
path = ~/Maildir

[options]
delete = true
verbose = 1

A full documentation of the resource-files can be found here

After saving the file you can test your configuration with the command

getmail --rcfile myGoogleAccount

If everything went right you should see something like this

getmail version 4.xxx.xxx
Copyright (C) 1998-2012 Charles Cazabon.  Licensed under the GNU GPL version 2.
SimplePOP3SSLRetriever:your-user-name@pop.gmail.com:995:
  0 messages (0 bytes) retrieved, 0 skipped

After testing set the verbose-level to 0 (verbose = 0) in your resource file to avoid any output.

Unfortunately getmail does not run as a daemon, so to run getmail every x minutes you will have to create a cron-job.

So to edit the CRon-Table of the user USER you need to become USER with the command

su - USER

To create the cron-job use the command

crontab -e

This will open your crontab in your default text-editor.
So to fetch your new Mail every 10 minutes add the following line

*/10 * * * * getmail --rcfile myGoogleAccount (--rcfile anOtherAccount)

Usually on a Raspberry or a Beaglebone the crontab should have opend in the text-editor Nano. So type strg+o for saving the crontab and close the editor with strg+x.

A more detailed description of cron can be found here

Now save the file and your job is done.

14 Gedanken zu “Using Raspberry Pi or Beaglebone Black as Mail-Server

  1. Hallo Bjoern,
    Glückwunsch für die einfache Darstellung des Aufgabe. Dies ist die einfachste Beschreibung die ich bislang gefunden habe.

    Eine Frage hätte ich aber:
    Da ja oftmals der Wunsch besteht von vielen Geräten auf die mails zugreifen zu können, entsteht folgendes Problem: Gesendete Dateien werden nur auf dem gesendeten Gerät angezeigt. Hier würde sich doch anbieten die ges. mails beim Hosten zu speichern und wie eingehende mails abzurufen.
    Wie würden diese mails aus send abgerufen und gleichzeitig als gelesen markiert?

    Danke für Hinweise
    Martin

    • Hey Martin

      Das ist eigentlich gar kein Problem. Ich habe das im E-Mail-Client ( bei mir Thunderbird ) geregelt. Dort kannst du einstellen, wo er Kopien der gesendeten Nachrichten speichern soll ( im Thunderbird unter Konten-Einstellungen / Kopien und Ordner ).
      Da gibst du dann einen Ordner deiner Wahl auf deinem Server an und das war es.
      Leider habe ich im mobilen Sektor unter Android noch nichts gefunden, das das kann – aber vom Computer geht es so erstmal.

      Ich hoffe, das war das, was du gesucht hast.

      Gruß Bjoern

  2. Könntest du vielleicht noch hinzufügen, wie man die E-mails dann letztendlich abruft bzw. was für Kontoeinstellungen man in seinem Mailclient einstellen muss. Das wäre echt super!

    • Hey Jan

      Na die Mails rufst du ganz normal mit einem Mail-Client ab. Als Server-Adresse stellst du dann die Adresse deines Pis ein und als Postfachart nimmst du IMAP. Das war es auch schon.

      Eine andere Möglichkeit ist, dass du zum Beispiel Programme wie Roundcube installierst. Damit kannst du dann über eine Weboberfläche an deine Mails.

      Gruß Bjoern

  3. Hallo Bjoern,
    ich bin auch dabei, einen IMAP Server auf meinem Raspberry zu installieren…
    Das Installieren klappt auch alles, jedoch habe ich Probleme mich mit ihm zu verbinden. Ich verwende SSL und die Authentifizierung funktioniert nicht…

    Hättest du Zeit und Lust dieses Tutorial um SSL (IMAPS) zu erweitern?

    LG
    samuel

    • Hey Samuel

      Ich verwende für meinen IMAP auch SSL.
      Ich schreibe mal die Verbindungsdaten:
      Server ist natürlich die Adresse/IP von deinem Raspberry
      Port: 993
      Verbindungssicherheit: SSL/TLS

      Zusätzlich musst du noch darauf achten, dass an deinem Router der entsprechende Port frei geschaltet ist, wenn du von außen darauf zugreifen möchtest.

      Ich hoffe, das hilft weiter

      Gruß Bjoern

      • Hey, danke fürs Antworten 🙂

        Nach anfänglichen Schwierigkeiten, hatte ich das „Problem“ (konnte private key nicht parsen) mit dem Zertifikat gelöst. telnet hat funktioniert.

        Jedoch komm ich mit den Thunderbird immer noch nicht drauf. Er brachte iein Problem mit dem „user“ in den Logs. (Authentifizierung meine ich)

        Ich habe inzwischen dovecot neu installiert und vesuche mich damit gerade nochmal neu. Werde dann wenn ich Zeit habe weiter testen und hier mehr Details zu dem Fehler posten.

        Aber schon mal vielen Dank für Hilfe 🙂

      • Dann melde ich mich mal zurück 😉

        Darf ich dich fragen, wie du die Authentifizierung in deiner Konfiguration gestaltest? Hab da meine Problem mit 😉

      • Das ist der Fehler in den Logs:
        —–
        Feb 05 17:00:25 auth: Fatal: No passdbs specified in configuration file. PLAIN mechanism needs one
        Feb 05 17:00:25 master: Error: service(auth): command startup failed, throttling for 2 secs
        —–

        Ich werde nur nicht so schlau draus, was er konkret von mir will.
        Wenn ich zur Authentifizierung in der Config nichts angebe, müsste der doch die lokalen Benutzer zur Authentifizierung verwenden oder?

        • Hey Samuel

          Gib mal den Befehl
          doveconf -n
          Ein und vergleich mal die Ausgaben. Ich hab nur die relevanten Sachen rein kopiert.

          root@bananaserv ~ # doveconf -n                                                                                     # 2.1.7: /etc/dovecot/dovecot.conf
          # OS: Linux 3.4.104+ armv7l Debian 7.9
          mail_access_groups = mail
          mail_location = maildir:~/.Maildir:LAYOUT=fs
          [ ...... ]
          passdb {
            driver = pam
          }
          [ ...... ]
          ssl_cert = 
          
          Gruß Bjoern
          • Hey Danke fürs Antworten 🙂

            Das mit dem passdb hat bei mir gefehlt.
            Habs eingefügt und siehe da, er bringt den Fehler in der Log nicht mehr 🙂

            Leider komm ich mit Thunderbird aber immer noch nicht drauf :/
            Wenn ich folgenden Befehl eingebe
            >telnet ‚IP‘ 993 -l ‚user’Trying 192.168.0.161…
            Connected to 192.168.0.161.
            Escape character is ‚^]‘. Connection closed by foreign host. <
            Jedoch kein fehler in den Logs…

            Was mach ich falsch? :/

          • Oh, iwie ist das die Formatierung verloren gegangen…

            telnet verbindet sich, wenn ichmich dann aber versuche einzuloggen kommt:
            Connection closed by foreign host.

            Sorry wenn ich dich damit belästige. Bitte antworte nur, wenn du auch die Zeit und den Nerv dazu hast!

          • Hey

            Du belästigst doch hier keinen. Dafür ist die Seite doch schließlich da. Leider habe ich zur Zeit leider nicht sehr viel Zeit, mich um die Seite zu kümmern.
            Außerdem weiß ich gerade auch nicht mehr so wirklich, wie ich dir da weiter helfen kann.
            Was du noch versuchen kannst, ist aus Thunderbird heraus ein Log-File zu erzeugen und nachschauen, od ihm noch irgendwas nicht passt.

            Wie das geht, steht hier beschrieben:
            https://wiki.mozilla.org/MailNews:Logging#imap

            Gruß Bjoern

          • Also,

            ich hab mal noch

            userdb {
            driver = passwd
            }

            mit in die conf übernommen und dann versucht mit:
            openssl s_client -connect IP:993
            drauf zu kommen und siehe da, es funktioniert und ich kann mich auch einloggen, er findet auch die INBOX etc 🙂

            Jedoch komm ich mit Thunderbird nicht drauf :/

            (http://wiki2.dovecot.org/TestInstallation)

Schreibe einen Kommentar