In dieser Anleitung zeige ich euch, wie ihr innerhalb weniger Minuten “getmail” mittels Docker bereitstellen könnt.
Bei “getmail” handelt es sich um ein kleines Python-Skript um Mails von externen Mail-Accounts (wie z.B. GMX oder Gmail) via IMAP abzuholen und diese direkt in eure Mailcow-Inbox zu kopieren. Dabei werden die Mails nicht in einem festen Intervall abgerufen (wie es z.B. in der Mailcow via IMAP-Synchronisierung gehen würde), sondern diese werden direkt nach Empfang im externen Account synchronisiert.
1. Vorraussetzung
- Docker mit Docker Compose installiert (Anleitung für Ubuntu / Debian)
- Mailcow installiert (nach der Anleitung von Christian)
2. Repository klonen und Verzeichnis anlegen
Als ersten Schritt wechseln wir in unser Container-Verzeichnis:
cd /opt/containers
Nun klonen wir das komplette Repository (wir räumen gleich noch auf):
git clone https://github.com/christianbur/docker_projects.git
Danach verschieben wir den Unterordner “getmail” in unsere normale Verzeichnisstruktur:
mv /opt/containers/docker_projects/getmail /opt/containers/getmail
Den ursprünglichen Ordner können wir nun löschen:
rm -rf docker_projects/
3. Anlegen der settings.ini
Die Settings-Datei ist natürlich sehr individuell, da ihr dort eure externen Mail-Accounts eintragen müsst. Beispielhaft könnt ihr in der Datei “settings.ini.example” einige Möglichkeiten finden. Ich zeige euch hier am Beispiel von nicht-existierenden GMX- und Gmail-Accounts wie ihr die Einstellungen treffen könntet.
Wir legen also unsere Settings-Datei an:
nano /opt/containers/getmail/conf/settings.ini
Inhalt der settings.ini
[DEFAULT] imap_debug: False imap_move_enable: False imap_move_folder: getmail imap_sync_folder: INBOX imap_ssl: True lmtp_hostname: dovecot-mailcow lmtp_port: 24 lmtp_debug: False [irgendeine_mail_adresse_at_gmail_com] imap_hostname: imap.gmail.com imap_port: 993 imap_username: irgendeine-mail-adresse@gmail.com imap_password: euerganzsicheresgmailpasswort lmtp_recipient: euer-mail-account@eure-mailcow-domain.de [irgendeine_mail_adresse_at_gmx_de] imap_hostname: imap.gmx.net imap_port: 993 imap_username: irgendeine-mail-adresse@gmx.de imap_password: euerganzsicheresgmxpasswort lmtp_recipient: euer-mail-account@eure-mailcow-domain.de
Anmerkungen zu den Beispieldaten:
Die Default-Werte funktionieren bei mir genau so. Ich habe die Mailcow so eingerichtet wie in der Mailcow-Anleitung von Christian, daher sollten diese bei euch auch funktionieren.
Die “Überschrift” über den Account-Blöcken (z.B. “[irgendeine_mail_adresse_at_gmail_com]”) ist frei wählbar und später für die Logs wichtig. Die übrigen IMAP-Settings sollten selbsterklärend sein. Diese müsst ihr evtl. bei den Anbietern in den FAQ suchen.
Die Einstellung “lmtp_recipient” entspricht eurer Mail-Adresse bei der Mailcow. Dort landen dann die Mails des jeweiligen externen Accounts.
4. Anlegen der docker-compose.yml
nano /opt/containers/getmail/docker-compose.yml
Inhalt der docker-compose.yml
version: '2.4' services: getmail: image: cb/getmail container_name: getmail build: ./Dockerfiles volumes: - ./conf/settings.ini:/app/settings.ini:ro - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro restart: always mem_limit: 100m mem_reservation: 20m networks: getmail: networks: getmail: external: true
Notwendige Anpassungen:
Die “docker-compose.yml” kann exakt so übernommen werden. Allerdings müsst ihr noch das externe Netzwerk anlegen:
docker network create getmail
5. Editieren der docker-compose.override.yml
nano /opt/containers/mailcow/docker-compose.override.yml
Inhalt der docker-compose.override.yml
version: '3.9' services: dovecot-mailcow: networks: getmail: networks: getmail: external: true
Notwendige Anpassungen:
Ihr müsst die relevanten Teile oben in eure Override-Datei hinzufügen. Im Prinzip muss nur das externe “getmail”-Netzwerk definiert werden und Dovecot muss in das “getmail”-Netzwerk rein – mehr braucht es nicht.
6. Mailcow neu starten
cd /opt/containers/mailcow docker compose down docker compose up -d
7. “getmail” starten
cd /opt/containers/getmail docker compose -f docker-compose.yml up -d
Nach einer kurzen Wartezeit könnt ihr dann die Logs des “getmail”-Containers prüfen:
docker logs getmail -f
Zu Beginn werden alle Verbindungen aufgebaut und die Verbindung wird dann mittels IMAP IDLE gehalten. Das kann dann im Log zum Beispiel so aussehen:
2022-10-15 16:38:40,140 - MainThread - INFO: use config file: ./settings.ini 2022-10-15 16:38:45,142 - Thread-user_at_external_mail_server_com - INFO: Start Getmail - server: imap.external-mail-server.com:993, username: user@external-mail-server.com 2022-10-15 16:38:45,494 - Thread-user_at_external_mail_server_com - INFO: Login - status: b'user@external-mail-server.com authenticated (Success)' 2022-10-15 16:38:45,577 - Thread-user_at_external_mail_server_com - INFO: IMAP fetch mail - inital 2022-10-15 16:38:45,689 - Thread-user_at_external_mail_server_com - INFO: Join infinite loop and wait for new mails, cancel with Ctrl-c
Wenn eine neue Mail auf dem externen Account erkannt wurde, steht im Log zum Beispiel dies:
2022-10-16 10:06:11,458 - Thread-user_at_external_mail_server_com - INFO: LMTP deliver: start -- LMTP host: dovecot-mailcow:24 2022-10-16 10:06:11,496 - Thread-user_at_external_mail_server_com - INFO: LMTP deliver: new eMail from: [Irgendjemand <irgendjemand@irgendwo.de>], subject: [Irgendein Betreff] 2022-10-16 10:06:11,515 - Thread-user_at_external_mail_server_com - INFO: IMAP delete: delete email (uid: 1234)
So könnt ihr immer prüfen, ob “getmail” eure Mails auch ordnungsgemäß abruft.
8. Quellen
https://github.com/christianbur/docker_projects/blob/master/getmail/INSTALL.TXT
Hallo allerseits,
kurze Frage, jetzt steht in meiner docker-compose.override.yml noch unter networks -> proxy (laut Anleitung hier). Wenn ich getmail integrieren möchte, muss das raus und alles läuft im Netzwerk getmail? Ist das richtig so?
Liebe Grüße
Frank
Hallo Christian,
vielen Dank für die Anleitung – funktioniert super!!!
Gibt es eigentlich noch eine Möglichkeit die importierten Mails durch rspamd zu schicken. Jetzt werden sie ja einfach ohne Tests/Prüfung importiert. Das wäre perfekt wenn es da etwas gäbe. Danke
Grüße