# Dovecot - POP3/IMAP {#Dovecot - POP3/IMAP} =================== Wir setzen dovecot ein. Dovecot verwendet hier den \'\'\'[Maildir](https://en.wikipedia.org/wiki/Maildir)\'\'\'-Format in /srv/vmail/USER. Dieser Speicherformat eignet sich auch gut für Backups, denn: \'\'Maildir is designed to work without locks. Most required operations are atomic on modern file systems. This means that you do not have to care much about race conditions like inconsistent read. But there are still some issues if you want to backup a Maildir while the mail-server is running.\'\' Doku dazu in der [Dovecot-Wiki/Maildir](http://wiki.dovecot.org/MailboxFormat/Maildir) und auch Diskussion dazu in diesem [ServerFault-Thread](https://serverfault.com/questions/758450/make-consistent-copy-of-maildir). Debugging mit Telnet {#Debugging mit Telnet} -------------------- Zum testen ob mailboxen existieren und funktionieren: telnet efeu.mur.at 25 mail from: rcpt to: quit Debugging TLS auf der Commandline IMAP/SMTP {#Debugging TLS auf der Commandline IMAP/SMTP} ------------------------------------------- Für den TLS-Verbindungsaufbau zuerst openssl verwenden, und dann die IMAP/SMTP-Kommandos zum einloggen: ##### IMAP {#IMAP} jogi@pc5 ~ % openssl s_client -connect imap.mur.at:143 -quiet -starttls imap depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root verify error:num=19:self signed certificate in certificate chain verify return:0 . OK Pre-login capabilities listed, post-login capabilities have more. a1 login fischer PASSWORD * CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE QUOTA ACL RIGHTS=texk a1 OK Logged in a2 LIST "" "*" * LIST (\HasChildren) "." INBOX * LIST (\HasNoChildren \Drafts) "." INBOX.Drafts * LIST (\HasNoChildren \Trash) "." INBOX.Trash * LIST (\HasNoChildren \Junk) "." INBOX.Junk * LIST (\HasNoChildren \Sent) "." INBOX.Sent * LIST (\HasNoChildren) "." INBOX.Queue * LIST (\Noselect \HasChildren) "." shared * LIST (\HasChildren) "." shared.fischer-office * LIST (\HasNoChildren) "." shared.fischer-office.Trash a2 OK List completed. a3 logout * BYE Logging out a3 OK Logout completed. jogi@pc5 ~ % ##### SMTP {#SMTP} murmin@polynom ~ » openssl s_client -connect efeu.mur.at:25 -quiet -starttls smtp depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 verify return:1 depth=0 CN = efeu.mur.at verify return:1 250 DSN EHLO polynome.mur.at 250-efeu.mur.at 250-PIPELINING 250-SIZE 30720000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: 250 2.1.0 Ok RCPT TO: 250 2.1.5 Ok DATA 354 End data with . Subject: Testmessage This is a Test :-) . 250 2.0.0 from MTA(smtp:[172.16.16.42]:10042): 250 2.0.0 Ok: queued as 82D613FF49 QUIT 221 2.0.0 Bye murmin@polynom ~ » shared Mailboxen {#shared Mailboxen} ---------------- Nach der Anleitung im [Dovecot Wiki](http://wiki2.dovecot.org/SharedMailboxes/Shared) konfiguriert. - Für jede shared Mailbox braucht es eine Gruppe mit dem Namen der Mailbox (zb forum-info, gr-camp,..). Bitte \"sprechende\" Namen verwenden, zb tib- fuer therater im bahnhof. Ausserdem muss unter den Maileinstellungen keine \@mur.at als primäre mailadresse stehen. - Die Rechte für USER in der Mailbox SHARED sind in der Datei \'\'\'/srv/vmail/SHARED/Maildir/dovecot-acl\'\'\' zu sehen: user=USER akxeilprwts Details dazu im [Dovecot Wiki](http://wiki2.dovecot.org/ACL). - Zur Anzeige/Manipulation von ACLs sollte \'\'\'doveadm acl\'\'\' verwendet werden. - Komplettes Beispiel für eine shared Mailbox: # Anlegen der shared Mailbox und gleichzeitiges setzen der ACLs root@klee:~# doveadm acl set -u jogi shared.verein user=jogi all # einen (weiteren) User hinzufügen root@klee:~# doveadm acl add -u jogi shared.verein user=jogi all # Kontrolle root@klee:~# doveadm acl get -u verein shared.verein ID Global Rights user=almutb admin create delete expunge insert lookup post read write write-deleted write-seen user=jogi admin create delete expunge insert lookup post read write write-deleted write-seen user=renatn admin create delete expunge insert lookup post read write write-deleted write-seen # debug-Mode root@klee:~# doveadm acl debug -u almutb shared.verein doveadm(almutb): Info: Mailbox 'INBOX' is in namespace 'shared.verein.' doveadm(almutb): Info: Mailbox path: /srv/vmail/verein/Maildir doveadm(almutb): Info: Per-user private flags in mailbox: \Seen doveadm(almutb): Info: User almutb has rights: lookup read write write-seen write-deleted insert post expunge create delete admin doveadm(almutb): Info: Mailbox found from dovecot-acl-list doveadm(almutb): Info: User verein found from ACL shared dict doveadm(almutb): Info: Mailbox shared.verein is visible in LIST ### Bugs {#Bugs} - Das Setzen von Rechten auf shared Mailboxen reicht nicht aus, wenn User\_innen auch Unterordner anlegen möchten. Dazu ist zusätzlich ein Eintrag in \'\'\'/etc/dovecot/global-acls\'\'\' nötig: shared.MAILBOXNAME user=USER akxeilprwts Kopieren/moven von Mails & erstellen/löschen von Subfoldern {#Kopieren/moven von Mails & erstellen/löschen von Subfoldern} ----------------------------------------------------------- Es gibt die Kommandos doveadm import doveadm move doveadm copy doveadm mailbox list|create|rename|delete Es gibt für alles die man-pages, ich fand die Beispiele dort nur leider nicht besonders verständlich\... man doveadm-search-query man doveadm-move man doveadm-mailbox doveadm -D -v copy -u almutb user fischer mailbox INBOX ^^^^^ ^^^^^^^ ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^ verbose zieluser ziel quelluser filterkriterium doveadm mailbox list -u danielaz doveadm mailbox create -u danielaz -s inbox-jangroos doveadm mailbox create -u danielaz -s inbox-jangroos.spam doveadm mailbox create -u danielaz -s prints.sent-jangroos doveadm -v copy -u danielaz prints user jang MAILBOX INBOX \( TO prints@six OR CC prints@six OR BCC prints@six \) doveadm -v move -u danielaz prints.sent-jangroos user jang MAILBOX INBOX.Sent all doveadm -v move -u danielaz inbox-jangroos.spam user jang MAILBOX INBOX SUBJECT "****SPAM****" Wiederherstellen von Mails aus Backups/ZFS-Snapshots {#Wiederherstellen von Mails aus Backups/ZFS-Snapshots} ---------------------------------------------------- Die Backups bestehen als ZFS-Snapshots des ZFS-Volumes \"banane/vmail\". Am Hamster reichen die täglichen ZFS-Snapshots 60 Tage in die Vergangenheit. Auf der Banane selbst liegen umfangreichere ZFS-Snapshots: murmin@banane ~ » sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT mailspool/banane@6months 23.9G - 1.29T - mailspool/banane@5months 9.84G - 1.31T - mailspool/banane@4months 8.91G - 1.33T - mailspool/banane@3months 8.31G - 1.35T - mailspool/banane@2months 9.57G - 1.37T - mailspool/banane@1month 4.01G - 1.38T - mailspool/banane@14days 774M - 1.38T - mailspool/banane@13days 522M - 1.38T - mailspool/banane@12days 750M - 1.38T - mailspool/banane@11days 949M - 1.38T - mailspool/banane@10days 833M - 1.39T - mailspool/banane@9days 824M - 1.39T - mailspool/banane@8days 764M - 1.39T - mailspool/banane@7days 557M - 1.39T - mailspool/banane@6days 474M - 1.39T - mailspool/banane@5days 614M - 1.39T - mailspool/banane@4days 1.20G - 1.39T - mailspool/banane@3days 704M - 1.39T - mailspool/banane@48hours 248M - 1.39T - mailspool/banane@47hours 159M - 1.39T - mailspool/banane@46hours 147M - 1.39T - mailspool/banane@45hours 146M - 1.39T - mailspool/banane@44hours 122M - 1.39T - mailspool/banane@43hours 108M - 1.39T - mailspool/banane@42hours 97.0M - 1.39T - mailspool/banane@41hours 78.9M - 1.39T - mailspool/banane@40hours 66.4M - 1.39T - mailspool/banane@39hours 60.4M - 1.39T - mailspool/banane@38hours 50.5M - 1.39T - mailspool/banane@37hours 42.1M - 1.39T - mailspool/banane@36hours 33.9M - 1.39T - mailspool/banane@35hours 33.7M - 1.39T - mailspool/banane@34hours 45.2M - 1.39T - mailspool/banane@2days 133K - 1.39T - mailspool/banane@33hours 133K - 1.39T - mailspool/banane@32hours 74.3M - 1.39T - mailspool/banane@31hours 106M - 1.39T - mailspool/banane@30hours 136M - 1.39T - mailspool/banane@29hours 198M - 1.39T - mailspool/banane@28hours 214M - 1.39T - mailspool/banane@27hours 268M - 1.39T - mailspool/banane@26hours 239M - 1.39T - mailspool/banane@25hours 206M - 1.39T - mailspool/banane@24hours 221M - 1.39T - mailspool/banane@23hours 156M - 1.39T - mailspool/banane@22hours 144M - 1.39T - mailspool/banane@21hours 143M - 1.39T - mailspool/banane@20hours 171M - 1.39T - mailspool/banane@19hours 168M - 1.39T - mailspool/banane@18hours 122M - 1.39T - mailspool/banane@17hours 86.4M - 1.39T - mailspool/banane@16hours 81.8M - 1.39T - mailspool/banane@15hours 96.0M - 1.39T - mailspool/banane@14hours 53.2M - 1.39T - mailspool/banane@13hours 34.9M - 1.39T - mailspool/banane@12hours 38.4M - 1.39T - mailspool/banane@11hours 39.7M - 1.39T - mailspool/banane@10hours 41.0M - 1.39T - mailspool/banane@1day 4.27M - 1.39T - mailspool/banane@9hours 3.83M - 1.39T - mailspool/banane@8hours 64.0M - 1.39T - mailspool/banane@7hours 98.2M - 1.39T - mailspool/banane@6hours 143M - 1.39T - mailspool/banane@5hours 194M - 1.39T - mailspool/banane@4hours 226M - 1.40T - mailspool/banane@3hours 157M - 1.40T - mailspool/banane@2hours 144M - 1.40T - mailspool/banane@1hour 139M - 1.40T - #### Mounten eines ZFS-Snapshots und kopieren von Emails einer Mailbox {#Mounten eines ZFS-Snapshots und kopieren von Emails einer Mailbox} mkdir ~/mailspool.snapshot sudo mount -t zfs banane@4months ~/mailspool.snapshot sudo su ls -al ~/mailspool.snapshot/jang/Maildir/cur/ cp -av ~/mailspool.snapshot/jang/Maildir/cur/* /srv/vmail/jang/Maildir/cur cp -av ~/mailspool.snapshot/jang/Maildir/new/* /srv/vmail/jang/Maildir/new sudo umount ~/mailspool.snapshot Dovecot authentification {#Dovecot authentification} ======================== dovecot AUTH: das geht über pam (/etc/pam.d/dovcot) dovecot userdb: das geht direkt über LDAP und nsswitch zeigt weitere Account Info an (z.B. wenn das Passwort abzulaufen beginnt). Das wir das aufteilen hat schon seinen Grund. AUTH direkt gegen LDAP lässt abgelaufene Passwörter zu. Daher AUTH über pam. Pam wiederum reicht für die userdb Settings nicht aus, daher direkt via LDAP. Und zu allem Überfluss authentifiziert postfix auf efeu die User auch gegen dovecot. Konfiguration von Email-Adressen im GOsa {#Konfiguration von Email-Adressen im GOsa} ======================================== Der LDAP-Zweig \'\'\'Aliases\'\'\' ist mehr oder weniger Geschichte! Neue Adressen ab sofort in GOsa konfigurieren! Persönliche Adressen {#Persönliche Adressen} -------------------- Persönliche Adressen sind einer/einem Benutzer\_in zugeordnet. Die passende Konfiguration erfolgt im Tab \'\'\'Mail\'\'\' im Bereich \'\'\'Benutzer\'\'\' im GOsa-Webinterface. Jede Person hat eine primäre Adresse, die bei uns prinzipiell \'\'\' \'\'\' lautet. Aliases, weitere Adressen {#Aliases, weitere Adressen} ------------------------- Wenn es sich um persönliche Aliases handelt, dann empfiehlt sich die Verwendung des Feldes \'\'\'Alternative Adressen\'\'\'. Eine Adresse einfach dort eintragen und sie ist sofort verwendbar. Damit der Alias funktioniert, auf efeu die Datei /etc/postfix/virtual\_mailbox\_domains editieren: cd /etc/postfix/ sudo nano virtual_mailbox_domains sudo postmap virtual_mailbox_domains Mailbox oder Forward {#Mailbox oder Forward} -------------------- Was mit Email einer Person oder Gruppe passieren soll wird unter \'\'\'Nachrichten weiterleiten an\'\'\' konfiguriert. 1. Ein leeres Feld bedeutet, nichts passiert mit Email für die Person. Der Mailserver antwortet mit \'\'\'550 5.1.1 \< \>: Recipient address rejected: User unknown in virtual alias table;\'\'\' 2. Ein einziger Eintrag in der Form \'\'\' \'\'\' bedeutet, der Mailserver stellt Email via LMTP zu. 3. Ein Eintrag in der Form \'\'\' \'\'\' ist eine Weiterleitung. Bei 2. und 3. können auch mehrere Adressen stehen. Mailverteiler {#Mailverteiler} ------------- Mailverteiler können mittels der Mail-Einstellungen für eine Gruppe konfiguriert werden. Die Gruppe unbedingt korrekt in die LDAP-Hierarchie einordnen, dann haben auch etwaige Admins die Chance, die Gruppe selber (weiter) zu bearbeiten. Bei der Namensgebung sollten folgende Dinge beachtet werden: 1. Ein eindeutig einer Person/einem Projekt zuzuordnender Name kann als Gruppenname verwendet werden (Beispiel: die Gruppe \'\'\'hofos\'\'\' gehört Reni und Jogi, sonst geht das keine\_n was an). 2. Bei Namen von allgemeinem Interesse muss ein Präfix vorangestellt werden, der auf die/den Eigentümer\_in verweist. (Beispiel: forum-info für die Gruppe über die konfiguriert ist). Weiters emfpiehlt es sich, im Feld \'\'\'Beschreibung\'\'\' einer Gruppe, die für Email verwendet wird, einen Hinweis auf die Verwendung zu geben: 1. Mailverteiler 2. Weiterleitung 3. Shared Mailbox Bei Gruppen kann die primäre Adresse sofort die eigentlich gewünschte sein (Besipiel: ). Shared Mailbox {#Shared Mailbox} -------------- Auch eine Shared Mailbox sollte als Gruppe konfiguriert sein. \'\'\'Achtung! Hier ist noch zusätzliche Konfiguration (Permissions) am IMAP-Server notwendig!\'\'\' Mailinglisten/Mailman {#Mailinglisten/Mailman} ===================== Seit September 2017 sind sämtliche Listen über (bzw. einen lists.example.com Eintrag bei Domains von Mitgliedern) erreichbar! Alle Listen, die schon zuvor existierten, und daher als erreichbar waren, werden noch bis 30. September 2018 so funktionieren, aber auch eine automatische Antwort an die/den Absender\_in schicken. Neue Liste werden daher nur mehr auf der birke (aka lists.mur.at) angelegt, und zwar wie folgt: birke:/var/lib/mailman/bin# ./newlist LISTE ... Dann das, was mailman ausspuckt in /etc/aliases eintragen und ![]({newaliases)} ausführen. Fertig. ### Email in Listen finden und aus der Liste entfernen {#Email in Listen finden und aus der Liste entfernen} auf birke, am besten root werden cd /var/lib/mailman/bin/ ./find_member zum löschen echo |./remove_members --fromall -f - ### Eigene lists.example.com Domain {#Eigene lists.example.com Domain} Damit lists.mur.at auch Emails für \'\'\'lists.example.com\'\'\' annimmt, muss letztes in /etc/postfix/main.cf als zusätzliche Zeile bei \'\'\'mydestination\'\'\' hinzugefügt werden. Danach empfiehlt sich ein ![]({service postfix reload)}. Mails für example.com entgegennehmen {#Mails für example.com entgegennehmen} ==================================== Wir spielen ja für viele Domains (außer mur.at) MX. Damit eine Domain einmal funktioniert, muss sie auf efeu in die Datei \'\'\'/etc/postfix/virtual\_mailbox\_domains\'\'\' eingetragen werden. Danach den Befehl ![]({postmap virtual_mailbox_domains)} ausführen, damit die passende Hashmap erzeugt wird. Migration von Cyrus 2.1 nach Dovecot (obsolet; bleibt noch zu Dokumentationszwecken) {#Migration von Cyrus 2.1 nach Dovecot (obsolet; bleibt noch zu Dokumentationszwecken)} ==================================================================================== - Geplant ist Migration mittels [dsync](http://wiki2.dovecot.org/Migration/Dsync) Benchmarks {#Benchmarks} ---------- Im Postfixbuch wird eine Benchmarkwerkzeug erwähnt, das \'\'\'postmark\'\'\' heißt. Das ist in Debian vefügbar, und so habe ich es am klee installiert. Folgende Konfigurationsdatei (klee:/home/jogi/postmark-02.config) habe ich angelegt, und damit BTRFS und EXT4 getestet: set size 3072 102400 set report verbose set number 200000 set transactions 500000 set location /srv/vmail/postmark set subdirectories 1000 Damit wird das Verhalten eines Mailservers simuliert, der Dateien zwischen 3KB und 1MB in 1.000 Unterverzeichnissen verarbeitet. Insgesamt werden 200.000 Dateien verarbeitet und 500.000 Transaktionen simuliert. Hier sind die Resultate: ### BTRFS mit LZO Kompression {#BTRFS mit LZO Kompression} Time: 498 seconds total 454 seconds of transactions (1101 per second) Files: 450001 created (903 per second) Creation alone: 200000 files (6666 per second) Mixed with transactions: 250001 files (550 per second) 250007 read (550 per second) 249940 appended (550 per second) 450001 deleted (903 per second) Deletion alone: 200002 files (14285 per second) Mixed with transactions: 249999 files (550 per second) Data: 14705.82 megabytes read (29.53 megabytes per second) 27453.33 megabytes written (55.13 megabytes per second) ### EXT4 {#EXT4} Time: 1268 seconds total 1183 seconds of transactions (422 per second) Files: 450001 created (354 per second) Creation alone: 200000 files (3508 per second) Mixed with transactions: 250001 files (211 per second) 250007 read (211 per second) 249940 appended (211 per second) 450001 deleted (354 per second) Deletion alone: 200002 files (7142 per second) Mixed with transactions: 249999 files (211 per second) Data: 14705.82 megabytes read (11.60 megabytes per second) 27453.33 megabytes written (21.65 megabytes per second) Aufgrund von Anmerkungen aus der Mailinglist, das virtuelle Maschinen nicht für Benchmarks geeignet sind, hab ich die halt nochmal, dirkt auf der wiese gemacht. Hier die Resultate (mit der selben Konfigurationsdatei): ### BTRFS mit LZO {#BTRFS mit LZO} Time: 1100 seconds total 1021 seconds of transactions (489 per second) Files: 450001 created (409 per second) Creation alone: 200000 files (3030 per second) Mixed with transactions: 250001 files (244 per second) 250007 read (244 per second) 249940 appended (244 per second) 450001 deleted (409 per second) Deletion alone: 200002 files (15384 per second) Mixed with transactions: 249999 files (244 per second) Data: 14705.82 megabytes read (13.37 megabytes per second) 27453.33 megabytes written (24.96 megabytes per second) ### EXT4 mit data=ordered,noatime {#EXT4 mit data=ordered,noatime} Time: 2588 seconds total 1367 seconds of transactions (365 per second) Files: 450001 created (173 per second) Creation alone: 200000 files (884 per second) Mixed with transactions: 250001 files (182 per second) 250007 read (182 per second) 249940 appended (182 per second) 450001 deleted (173 per second) Deletion alone: 200002 files (201 per second) Mixed with transactions: 249999 files (182 per second) Data: 14705.82 megabytes read (5.68 megabytes per second) 27453.33 megabytes written (10.61 megabytes per second) ### Proxy {#Proxy} Während der Migrationszeit wird dovecot als Proxy fungieren. User\*innen, deren E-Mail noch auf hornet liegt werden vom dovecot an diesen weitergeleitet. Dasselbe gilt auch für lmtp. ### IMAP {#IMAP} In \'\'\'/etc/dovecot/dovecot-ldap.auth\'\'\' die Variable \'\'\'pass\_attrs\'\'\' erweitern. Zumindest für IMAP funktioniert das so ganz passabel. ### LMTP {#LMTP} Damit lmtp-proxy funktioniert wurde hornet angepasst, weil wir keine passende dovecot-config fuer authentifiziertes lmtp gefunden haben. Folgende 3 configs am hornet wurden angepasst: /etc/services: lmtpo 2002/tcp /etc/hosts.allow: lmtpo: 172.16.16.78: ALLOW /etc/cyrus.conf: lmtpo cmd="lmtpd -a" proto=tcp listen="imap.admin.mur.at:lmtpo" prefork=0 maxchild=100 Fuers proxy gibts die dovecot-ldap\_for\_lmtp.conf.ext. Im LDAP wurden 2 neue Attribute eingefuehrt: ou=imap.admin.mur.at, departmentNumber=y # ohne proxy pass_attrs = uid=user,userPassword=password # mit proxy pass_attrs = uid=user,userPassword=password,=proxy=y,=host=imap.admin.mur.at,=starttls=any-cert Preflight TODOs {#Preflight TODOs} --------------- - Dovecot korrekt installieren und konfigurieren - pop3d - imapd - shared Mailboxen - [sieve](http://wiki2.dovecot.org/Pigeonhole/Sieve) and [Managesieve](http://wiki2.dovecot.org/Pigeonhole/ManageSieve) - lmtpd - [Proxy](http://wiki2.dovecot.org/PasswordDatabase/ExtraFields/Proxy) für lmtp, imap, pop - shared Mailboxen am Cyrus in den shared Namespace übertragen - Temporär braucht es dazu einen murMailForwardTo=sharedboxmngr+shared.MAILBOX Alias - Die bestehenden Mailboxen einfach per rsync kopieren rsync -auvi user/MAILBOX/ shared/MAILBOX/ - Danach Mailbox rekonstruieren: sudo su - cyrus /usr/sbin/cyrreconstruct -C /etc/imapd.conf -rf shared.MAILBOX - Rechte überprüfen!