Installation Sendmail / Cyrus IMAP
Installation Cyrus IMAP
Es gibt jetzt einen sasl-mysql Port, daher kann man Cyrus ganz normal über die Ports installieren:
pkg install cyrus-sasl-sql
pkg install cyrus-imapd23
pkg install sendmail+tls+sasl2
Konfiguration
/etc/services
Datei /etc/services editieren und folgenden Eintrag hinzufügen (falls nicht bereits vorhanden):
sieve 4190/tcp #ManageSieve Protocol
sieve 4190/udp #ManageSieve Protocol
ACHTUNG! Früher war Sieve auf Port 2000. Der Port hat im Jahr 2009 gewechselt:
7 Dec 2009.... sieve service moves from 2000/tcp to 4190/tcp
/etc/rc.conf
#-----------------------------------------------#
# Mail Server #
#-----------------------------------------------#
# Cyrus
cyrus_imapd_enable="YES"
# Sendmail
sendmail_enable="YES" # Run the sendmail inbound daemon (YES/NO).
sendmail_submit_enable="YES" # Start a localhost-only MTA for mail submission
MySQL Anbindung
Cyrus Table erstellen:
CREATE TABLE `cyrus_email` ( `id` int(11) NOT NULL auto_increment, `username` varchar(50) NOT NULL default '', `password` varchar(50) NOT NULL default '', `real_name` varchar(150) NOT NULL default '', `active` tinyint(4) NOT NULL default '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;
Eventuell bestehende cyrus_email einträge Importieren (falls der Server neu aufgesetzt wird)
In der mysql DB noch Berechtigungen geben:
MySQL User erstellen:
INSERT INTO `user` ( `Host` , `User` , `Password` , `Select_priv` , `Insert_priv` , `Update_priv` , `Delete_priv` , `Create_priv` , `Drop_priv` , `Reload_priv` , `Shutdown_priv` , `Process_priv` , `File_priv` , `Grant_priv` , `References_priv` , `Index_priv` , `Alter_priv` , `Show_db_priv` , `Super_priv` , `Create_tmp_table_priv` , `Lock_tables_priv` , `Execute_priv` , `Repl_slave_priv` , `Repl_client_priv` , `ssl_type` , `ssl_cipher` , `x509_issuer` , `x509_subject` , `max_questions` , `max_updates` , `max_connections` ) VALUES ( 'localhost', 'cyrus', PASSWORD( 'yourpass' ) , 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0' );
Berechtigung:
INSERT INTO `db` VALUES('%', 'Corky_admin', 'cyrus', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');
Nach Anpassungen an den den Berechtigungen sollte man entweder die Datenbank neu starten oder die forcieren, die Privilegien-Datenbank neu zu laden:
mysqladmin -u root -p flush-privileges Enter password:
imapd.conf
Um weiterzufahren, muss man das File /usr/local/etc/imapd.conf anpassen. Welche Änderungen man alle machen kann, erfährt man, indem man man imapd.conf eingibt. Leider fehlen die sasl_sql_* Direktiven.
cp /usr/local/etc/imapd.conf /usr/local/etc/imapd.conf-dist
vi /usr/local/etc/imapd.conf
configdirectory: /var/imap partition-default: /var/spool/imap allowplaintext: yes timeout: 30 poptimeout: 10 admins: admin autocreatequota: 0 duplicatesuppression: yes reject8bit: no sieveusehomedir: false sievedir: /var/imap/sieve postmaster: postmaster sieve_maxscriptsize: 64 sieve_maxscripts: 5 sasl_pwcheck_method: auxprop sasl_auxprop_plugin: sql sasl_sql_engine: mysql
sasl_sql_hostnames: localhost
sasl_sql_user: dbuser
sasl_sql_passwd: dbpass
sasl_sql_database: dbname
sasl_sql_verbose: no
sasl_sql_select: SELECT password FROM mail_entries WHERE ( username = '%u' OR ( username = '%u' AND domain = '%r' ) ) AND is_active = 1 AND is_mainaccount = 1
sasl_sql_usessl: 0 sasl_mech_list: login plain cram-md5 digest-md5 tls_cert_file: /var/imap/server.pem tls_key_file: /var/imap/server.pem tls_ca_file: /var/imap/server.pem log_level: 1
Damit sich er admin auch im cyradm einloggen kann, muss man in der MySQL Table dbname.cyrus_email noch den user „admin“ erstellen.
cyrus.conf
Das File /usr/local/etc/cyrus.conf muss in der Regel nicht modifziert werden. Es beschreibt, welche Daemons gestartet werden sollen (z.B. imap, imaps, pop3s, etc.)
Verzeichnisstrukturen erstellen
Anschliessend fürt man als root folgenden befehl aus:
/usr/local/cyrus/bin/mkimap reading configure file... i will configure directory /var/imap. i saw partition /var/spool/imap. done configuring /var/imap... creating /var/spool/imap... done
Somit wäre mal das Grundgerüst von Cyrus erstellt.
SSL Zertifikat installieren
# rm /var/imap/server.pem
# openssl req -new -x509 -nodes -out /var/imap/server.pem -keyout /var/imap/server.pem -days 365
Generating a 1024 bit RSA private key
.++++++
.......++++++
writing new private key to '/var/imap/server.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CH
State or Province Name (full name) [Some-State]:ZH
Locality Name (eg, city) []:Zürich
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Deine Firma
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:server.example.com <--Wichtig: muss gleich Servername sein!
Email Address []:meine@emailadresse.com
#
chmod 600 /var/imap/server.pem chown cyrus:cyrus /var/imap/server.pem
Syslog Anpassung
Ich will, dass er nicht die ganzen Logs im /var/log/messages abspeichert, sondern in ein separtes File /var/log/imapd.log Dazu packe ich folgende Zeile ins /etc/syslog.conf rein:
# alles wird geloggt # local6.debug /var/log/imapd.log #Damit Loggst Du alles was local6 ist und nicht debug oder info ist nach /var/ #log/cyrus: local6.*;local6.!=debug;local6.!=info -/var/log/imapd.log
Erstelle die Datei:
true > /var/log/imapd.log
Und restarte anschliessend syslog:
/etc/rc.d/syslogd restart
Bestehende Mailboxen Importieren
1) Self Scripts kopieren:
cd /usr/local/cyrus/ mkdir self cd self scp <username>@oldserver.com:/usr/local/cyrus/self/* . chown cyrus:cyrus *
2) User vom bestehenden System kopieren:
Alter Server:
/etc/rc.d/sendmail stop
/usr/local/etc/rc.d/imapd stop
tar cvfzpP /var_spool_imap.tar.gz /var/spool/imap
tar cvfzpP /var_imap.tar.gz /var/imap
Neuer Server (Ich speichere meine Mailboxen auf einer Separaten (/data) Partition:
cd /data
scp <username>@oldserver.com:/var_spool_imap.tar.gz .
scp <username>@oldserver.com:/var_imap.tar.gz .
tar xzfv var_spool_imap.tar.gz
tar xzfv var_imap.tar.gz
mv /var/spool/imap/user /var/spool/imap/user_bak
cd /var/spool/imap/
ln -s /data/var/spool/imap .
mv /var/imap/mailboxes.db /var/imap/mailboxes.db.backup cp /data/var/imap/mailboxes.db /var/imap/mailboxes.db chown cyrus:cyrus /var/imap/mailboxes.db
Testen, ob auch alles da ist:
cyradm localhost -u admin Password: localhost.myserver.ch> lm INBOX (HasNoChildren) user.abfab (HasNoChildren) user.cruiser (HasChildren) user.cruiser.Registrations (HasChildren) user.cruiser.Registrations.SearchEngines (HasNoChildren) user.cruiser.Registrations.eurogay (HasNoChildren) user.cruiser.Registrations.hddialer (HasNoChildren) user.cruiser.TopLists (HasNoChildren) user.cruiser.werbung_von_uns (H [..]
4) Sieve Scripts kopieren
cd /var/imap/ cp -r /data/var/imap/sieve/* /var/imap/sieve/ chown cyrus:cyrus /var/imap/sieve/
5) Nun alles testen auf dem neuen Server:
/usr/local/etc/rc.d/imapd start
6) Wenn es keine Fehlermeldungen gibt, die DNS Einträge auf den neuen Mailserver ändern. Auf dem alten Mailserver IMAP nicht mehr starten, damit nicht aus versehen noch Mails angenommen werden.
Installation Sendmail
Vorbereitungen
Pfade für eigene Konfigurationen etc. erstellen:
mkdir /etc/mail/bin mkdir /etc/mail/my_prefs mkdir /etc/mail/header mkdir /etc/mail/certs true > /etc/mail/certs/revocation.list chmod 600 /etc/mail/certs/revocation.list
Nun die Header Files hinzufügen
access
vi /etc/mail/header/access.header
->paste
# # With this file you can control the access # to your mailserver, example: # # cyberspammer.com 550 We don't accept mail from spammers # okay.cyberspammer.com OK # sendmail.org OK # 128.32 RELAY # # Take a look at /usr/share/sendmail/README for a full description 127.0 RELAY # Eigenes Relaying für MX myserver.com RELAY # autogenerated entries below
aliases
vi /etc/mail/header/aliases.header
-> paste
# $FreeBSD: src/etc/mail/aliases,v 1.20 2004/06/30 16:47:08 maxim Exp $ # @(#)aliases 5.3 (Berkeley) 5/24/90 # # Aliases in this file will NOT be expanded in the header from # Mail, but WILL be visible over networks. # # >>>>>>>>>> The program "newaliases" must be run after # >> NOTE >> this file is updated for any changes to # >>>>>>>>>> show through to sendmail. # # # See also RFC 2142, `MAILBOX NAMES FOR COMMON SERVICES, ROLES # AND FUNCTIONS', May 1997 # Pretty much everything else in this file points to "root", so # you would do well in either reading root's mailbox or forwarding # root's email from here. # root: me@my.domain # Basic system aliases -- these MUST be present MAILER-DAEMON: postmaster postmaster: root root: /dev/null www: root # General redirections for pseudo accounts _pflogd: root bin: root bind: root daemon: root games: root kmem: root mailnull: postmaster man: root news: root nobody: root operator: root pop: root proxy: root smmsp: postmaster sshd: root system: root toor: root tty: root usenet: news uucp: root # Well-known aliases -- these should be filled in! # manager: # dumper: # BUSINESS-RELATED MAILBOX NAMES # info: # marketing: # sales: # support: # NETWORK OPERATIONS MAILBOX NAMES abuse: root # noc: root security: root # SUPPORT MAILBOX NAMES FOR SPECIFIC INTERNET SERVICES ftp: root ftp-bugs: ftp # hostmaster: root # webmaster: root # www: webmaster # NOTE: /var/msgs and /var/msgs/bounds must be owned by sendmail's # DefaultUser (defaults to mailnull) for the msgs alias to work. # # msgs: "| /usr/bin/msgs -s" # bit-bucket: /dev/null # dev-null: bit-bucket # ---------- BEGIN OF AUTOGENERATED STUFF --------------
sendmail.cw
vi /etc/mail/header/sendmail.cw.header
-> paste
# Lokale Hostnamen, für die Mail angenommen und an einen User auf diesem System gesandt wird # (kann über /etc/aliases) weitergeleitet werden. Die Datei wird bei neueren Versionen auch # als /etc/mail/local-host-names gespeichert. mail.myserver.com localhost 127.0.0.1 localhost.myserver.com
virtusertable
vi /etc/mail/header/virtusertable.header
-> paste
@mail.myserver.com root
Installation
Anschliessend im
vi /etc/make.conf
folgendes hinzufügen:
#-----------------------------------------------#
# Sendmail #
#-----------------------------------------------#
SENDMAIL_WITHOUT_IPV6=yes
SENDMAIL_WITHOUT_MILTER=no
SENDMAIL_WITH_TLS=yes
SENDMAIL_WITH_SMTPS=yes
SENDMAIL_WITH_SASL2=yes
SENDMAIL_WITH_CYRUSLOOKUP=yes
SENDMAIL_MC=/etc/mail/my_prefs/corky.mc
SENDMAIL_SUBMIT_MC=/etc/mail/my_prefs/corky.submit.mc
SENDMAIL_CFLAGS+= -DMILTER -DSASL=2
SENDMAIL_LDADD+= -lsasl2
Nun Sendmail aus den Ports installieren:
cd /usr/ports/mail/sendmail-sasl make install clean
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Options for cyrus-sasl-saslauthd 2.1.25 x
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x [*] BDB Use Berkeley DB x x
x x [ ] OPENLDAP Use OpenLDAP x x
x x [ ] HTTPFORM Enable HTTP form authentication x x
x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
x < OK > <Cancel> x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
mailer.conf generieren
FreeBSD benutzt eine Datei namens /etc/mail/mailer.conf um rauszusuchen, welchen Mailer er nehmen soll. Nach der obigen Installation müssen wir daher das entsprechende File anpassen, damit er unser Sendmail aus den Ports nehmen soll, und nicht mehr jene aus der Base installation:
cd /usr/ports/mail/sendmail make mailer.conf
Output:
/bin/mv /etc/mail/mailer.conf.new /etc/mail/mailer.conf
Prüfen der Kompilation
Wir möchten nachtürlich wissen, ob Cyrus, SSL, wie auch Milter aktiv ist im Sendmail, denn das sind die wichtigsten drei Sachen, die wir unbedingt haben wollen.
sendmail -d0.1 < /dev/null Version 8.14.5 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS TCPWRAPPERS USERDB XDEBUG
Konfiguration
Cyrus SASL / MySQL für Benutzer Authentisierung benutzen
Analog zum /usr/local/etc/imapd.conf richten wir SASL dazu ein, dass man den Benutzernamen ebenfalls mit der gleichen Datenbank authentisieren kann. Dazu erstellen resp. ändern wir das File:
vi /usr/local/lib/sasl2/Sendmail.conf
pwcheck_method: auxprop auxprop_plugin: sql sql_engine: mysql sql_hostnames: localhost sql_user: cyrus sql_passwd: <sqlpass> sql_database: Corky_admin sql_verbose: no sql_select: SELECT password FROM cyrus_email WHERE username = '%u' AND active='1' sql_usessl: 0 mech_list: login plain cram-md5 digest-md5 log_level: 1
Sendmail
Die Konfiguration bei Sendmail geschieht am besten über sogenannte m4 Macros. Man kann, wenn man Lust hat, auch das ganze sendmail.cf von Hand editieren – ist jedoch nicht empfehlenswert, da ein Space und ein Tabulator zuviel oder an der falschen Stelle das ganze Sendmail schon abschalten kann…
Am einfachsten kopiert man /etc/mail/freebsd.submit.mc nach /etc/mail/my_prefs/default.submit.mc und /etc/mail/hostname.mc nach /etc/mail/default.mc (gemäss den Pfaden im /etc/make.conf) und linkt die .cf Dateien schön zurück:
mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.ORIGINAL mv /etc/mail/submit.cf /etc/mail/submit.cf.ORIGINAL mv /etc/mail/freebsd.submit.mc /etc/mail/my_prefs/default.submit.mc mv /etc/mail/freebsd.mc /etc/mail/my_prefs/default.mc touch /etc/mail/my_prefs/default.cf touch /etc/mail/my_prefs/default.submit.cf ln -s /etc/mail/my_prefs/default.cf /etc/mail/sendmail.cf ln -s /etc/mail/my_prefs/default.submit.cf /etc/mail/submit.cf
Anschliessend heisst es, vorallem das default.mc zu editieren. Bei Cyrus gibt es einige Sachen, die man speziell anpassen muss. Hier ist mein default.mc für einen Überblick der Funktionen.
Und wenn alles gut geklappt hat, kann man so schnell das ganze .cf File erstellen/editeren und anschliessend installieren lassen:
cd /etc/mail/ make cf install
Output:
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/my_prefs/corky.mc > /etc/mail/my_prefs/corky.cf /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/my_prefs/corky.submit.mc > /etc/mail/my_prefs/corky.submit.cf install -m 444 /etc/mail/my_prefs/corky.cf /etc/mail/sendmail.cf install: /etc/mail/my_prefs/corky.cf and /etc/mail/sendmail.cf are the same file *** Error code 64 Stop in /etc/mail.
–> Fehler ignorieren, wenn die .cf files erstellt worden sind. Sind die Files nicht erstellt worden, einfach eine kleine Modifikation (z.B. dnl## ) in den *.mc hinzufügen, dann nochmals make cf install ausführen. Dann sollten die CF Files generiert werden.
SSL Zertifikat
openssl req -newkey rsa:1024 -keyout /etc/mail/certs/mycert.pem -nodes -x509 -days 365 -out /etc/mail/certs/cacert.pem
Generating a 1024 bit RSA private key ................................................++++++ ...................++++++ writing new private key to '/etc/mail/certs/mycert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CH State or Province Name (full name) [Some-State]:ZH Locality Name (eg, city) []:Zürich Organization Name (eg, company) [Internet Widgits Pty Ltd]:Meine Firma GmbH Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:name.myserver.com <-- Wichtig: muss gleich Servername sein! Email Address []:meine@emailadresse.com echo "" >> /etc/mail/certs/mycert.pem cat /etc/mail/certs/cacert.pem >> /etc/mail/certs/mycert.pem
Anschliessend nur noch die Berechtigungen richtig anpassen:
chmod 400 /etc/mail/certs/*
sendmailmake
Dieses kleine hilfreiche Tool hab ich von Steven. Es generiert alle nötigen Sendmail Files aus der MySQL Datenbank heraus.
Mysql Tables erstellen:
# -------------------------------------------------------- # # Table structure for table `mail_add_cyrus_sasl` # CREATE TABLE `mail_add_cyrus_sasl` ( `id` int(11) NOT NULL auto_increment, `username` varchar(250) NOT NULL default '', `password` varchar(250) NOT NULL default '', `active` tinyint(4) NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY `id_2` (`id`), UNIQUE KEY `username` (`username`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; # -------------------------------------------------------- # # Table structure for table `mail_alias_entries` # CREATE TABLE `mail_alias_entries` ( `id` int(4) NOT NULL auto_increment, `username` varchar(50) NOT NULL default '', `alias` text NOT NULL, `domain` varchar(50) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; # -------------------------------------------------------- # # Table structure for table `mail_auto_replys` # CREATE TABLE `mail_auto_replys` ( `id` int(11) NOT NULL auto_increment, `user` varchar(50) NOT NULL default '', `message` text NOT NULL, `active` tinyint(4) NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY `id_2` (`id`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; # -------------------------------------------------------- # # Table structure for table `mail_domain_forwarding` # CREATE TABLE `mail_domain_forwarding` ( `id` int(11) NOT NULL auto_increment, `source_domain` varchar(50) NOT NULL default '', `destination_domain` varchar(50) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `id_2` (`id`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; # -------------------------------------------------------- # # Table structure for table `mail_entries` # CREATE TABLE IF NOT EXISTS `mail_entries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`comment` text NOT NULL,
`username` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL DEFAULT '',
`domain` varchar(50) NOT NULL DEFAULT '',
`alias` varchar(50) NOT NULL DEFAULT '',
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`is_mainaccount` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`,`is_mainaccount`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; # -------------------------------------------------------- # # Table structure for table `mail_mx_entries` # CREATE TABLE `mail_mx_entries` ( `id` int(11) NOT NULL auto_increment, `domain` varchar(150) NOT NULL default '', UNIQUE KEY `domain` (`domain`), UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='MX Eintr?ge'; # -------------------------------------------------------- # # Table structure for table `nonexisting_email` # CREATE TABLE `nonexisting_email` ( `id` int(11) NOT NULL auto_increment, `nonexist` varchar(250) NOT NULL default '', `message` varchar(250) NOT NULL default 'error:nouser No such User here!', UNIQUE KEY `id` (`id`), KEY `nonexist` (`nonexist`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Installation
sendmail-build-autoresponder.tar.gz downloaden und installieren:
cd /usr/local/software
fetch http://www.teslina.com/wp-content/uploads/2012/03/sendmail-build-autoresponder.tar.gz
tar xzfv sendmail-build-autoresponder.tar.gz
Konfiguration
DB username/passwd etc. anpassen:
cd sendmail-build-autoresponder-new
vi header.h
nun das Sendmailmake generieren und ins /etc/mail/bin Verzeichnis kopieren:
make # <- warnings einfach ignorieren cp sendmailmake /etc/mail/bin/
jetzt noch das sendmailmake ausführen
/etc/mail/bin/sendmailmake
Starten/Testen
Alias im .bashrc hinzufügen:
cd vi .bashrc
alias rcsendmail='/etc/rc.d/sendmail'
Starte Cyrus
/usr/local/etc/rc.d/imapd start
Starte Sendmail
rcsendmail start
Testen
# telnet localhost imap
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS AUTH=LOGIN AUTH=PLAIN AUTH=CRAM-MD5 AUTH=DIGEST-MD5 SASL-IR COMPRESS=DEFLATE]
my.testserver.ch Cyrus IMAP v2.3.16 server ready . login <mail username> <mail password> . OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID LOGINDISABLED COMPRESS=DEFLATE ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UIDPLUS NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT SORT=MODSEQ THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE CATENATE CONDSTORE SCAN IDLE URLAUTH] User logged in
um telnet zu verlassen:
. logout
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost. Escape character is '^]'. +OK my.testserver.ch Cyrus POP3 v2.3.16 server ready <4056458412.1126900089@my.testserver.ch> user <mail username> +OK Name is a valid mailbox pass <mail pass> +OK Mailbox locked and ready stat +OK 47 2630366 quit +OK Connection closed by foreign host.
Mail über Remote Server senden
Um zu testen, ob ich von einem entfernten Server über den soeben konfigurierten Sendmail Server Mails versenden kann, nutzt man am einfachsten mailx.
Achtung: das auf FreeBSD vorinstallierte mailx kann nicht verwendet werden:
mailx -V
mailx: illegal option -- V
Usage: mailx [-dEiInv] [-s subject] [-c cc-addr] [-b bcc-addr] [-F] to-addr ...
[-sendmail-option ...]
mailx [-dEHiInNv] [-F] -f [name]
mailx [-dEHiInNv] [-F] [-u user]
mailx [-d] -e [-f name]
Daher am Besten kurz heirloom-mailx installieren:
pkg install heirloom-mailx
nun klappts:
/usr/local/bin/mailx -V
12.4 7/29/08
Und das Testmail kann verschickt werden:
echo "Das ist eine Testnachricht" | /usr/local/bin/mailx -v
-r "absender@test.com"
-s "Testmail"
-S smtp="mail.example.com:587"
-S smtp-use-starttls
-S ssl-verify=ignore
empfaenger@adresse.com
Probleme & Fehlermeldungen
Cyrus
badlogin: localhost [::1] LOGIN [SASL(-13): user not found: checkpass failed]
Nach grossem Portupgrade ( pkg-static upgrade -f ) kann man sich per IMAP nicht mehr einloggen.
# cyradm localhost -u admin
# testsaslauthd -u <user> -p <password>
0: NO "authentication failed"
Die Fehlermeldungen sehen so aus:
# tail -f /var/log/messages
May 3 18:43:01 corky imap[86844]: badlogin: 123-123-123-123.x.y.ch [123.123.123.123] CRAM-MD5 [SASL(-13): user not found: no user in db]
auth.log:
May 3 19:57:07 corky saslauthd[2193]: do_auth : auth failure: [user=xyz] [service=imap] [realm=] [mech=pam] [reason=PAM auth error]
May 3 19:57:10 corky sm-mta[2583]: unknown password verifier(s) auxprop
#tail -f auth.log
May 3 18:42:19 corky sm-mta[87735]: unknown password verifier(s) auxprop
*lach* da hab ich schon fast aufgegeben und wollte Dovecot installieren, als ich von Google darauf aufmerksam gemacht wurde, dass ich die Lösung schon vor einem Jahr gefunden habe 😉 Hier der Lösungsweg:
DBERROR: critical database situation
Nach einer Reinstallation von Cyrus / bzw. Port-/Serverupgrade gab es viele Fehlermeldungen:
Jul 11 13:04:47 corky lmtpunix[93579]: DBERROR: dbenv->open '/var/imap/db' failed: BDB0091 DB_VERSION_MISMATCH: Database environment version mismatch
Jul 11 13:04:47 corky lmtpunix[93579]: DBERROR: init() on berkeley
Jul 11 13:04:47 corky lmtpunix[93579]: DBERROR db5: BDB0633 DB_AUTO_COMMIT may not be specified in non-transactional environment
Jul 11 13:04:47 corky lmtpunix[93579]: DBERROR: opening /var/imap/deliver.db: Invalid argument
Jul 11 13:04:47 corky lmtpunix[93579]: DBERROR: opening /var/imap/deliver.db: cyrusdb error
Jul 11 13:04:47 corky lmtpunix[93580]: DBERROR db5: BDB1539 Build signature doesn't match environment
Jul 11 13:55:49 corky imap[1073]: DBERROR: critical database situation
Jul 11 13:55:49 corky imap[1074]: DBERROR db5: BDB0060 PANIC: fatal region error detected; run recovery
Lösung:
Ich habe dann von allen DB Files Backups gemacht und gelöscht. Also:
service imapd stop
cd /var/imap/
mkdir backup
cp *.db backup/
Jetzt mal DB neu Builden:
/usr/local/cyrus/bin/ctl_cyrusdb -r
imapd wieder starten und log checken.
service imapd start
Ist der Error noch nicht weg, alle db Files löschen (ist safe!), nochmals rebuilden und dann erneut testen.
rm *.db
Jetzt wäre schonmal dieser Error weg.
Falls nun vorher ein einfaches Rebuilden nicht geklappt hat und wir die *.db Files löschen mussten, ist nun das Problem, dass wir die Users neu erstellen müssen (die Daten Verzeichnisse sind ja noch da unter
/var/spool/imap/user/
Aber die User müssen halt neu in die DB geschrieben werden, sonst heisst es
Mailbox nicht gefunden
Mailboxen wieder erstellen (falls Login mit user admin nicht geht, siehe Lösung weiter unten):
cyradm localhost -u admin
Erstellen mit
cm user.username
Sobald alle erstellt sind, die Mailboxen wieder flicken:
su cyrus /usr/local/cyrus/bin/reconstruct -r -f user.username
Folders nicht gefunden
Nun, nachdem die Mailboxen erstellt wurden, konnte ich zwar endlich auf die INBOX zugreifen, aber alle anderen Imap Folders waren weg. So hab ich das wieder hingekriegt:
su cyrus
/usr/local/cyrus/bin/ctl_mboxlist -v
Jetzt werden alle Folders aufgelistet, die keinen DB eintrag haben.
'user.ddjdjdj.498' has a directory '/var/spool/imap/L/user/ddjdjdj/498' but no DB entry
Wenn ich jetzt
/usr/local/cyrus/bin/reconstruct -r -f user.username
nochmals laufenlasse (natürlich für jeden einzelnen User, der über ctl_mboxlist
aufgelistet wurde) sollte es endgültig wieder laufen 🙂
Falls der Fehler danach weiterhin existiert (war bei mir der Fall)
'user.xyuser.folder1.folder2.folder3' has a directory '/var/spool/imap/user/xyuser/folder1/folder2/folder3' but no DB entry
bin ich so zur Lösung gekommen, dass ich über den Email Client den ersten Folder (in diesem Beispiel den folder1) erstellt habe und danach
/usr/local/cyrus/bin/reconstruct -r -f user.xyuser
nochmals ausgeführt habe. Danach wurden die restlichen fehlenden Mailboxen ebenfalls in die Datenbank zurückgeschrieben.
Crash nachdem Nachrichten in ein Sub-Directory verschoben werden
Nach einem DB Error habe ich die Datenbanken neu gebuildet mit ctl_cyrusdb -r
Es lief dann auch alles wieder normal, aber sobald über den Email Client man eine Nachricht in einen anderen IMAP Folder verschoben hatte, kamen kurz darauf wieder die DBERRORs:
Jul 12 09:00:00 corky master[32801]: service imap pid 72247 in READY state: terminated abnormally
Jul 12 09:00:01 corky pop3[72252]: DBERROR db5: BDB0060 PANIC: fatal region error detected; run recovery
Jul 12 09:00:01 corky imaps[72251]: DBERROR db5: BDB0060 PANIC: fatal region error detected; run recovery
Jul 12 09:00:01 corky imaps[72251]: DBERROR: critical database situation
Die Lösung brachte ctl_mboxlist -v
und danach reconstruct -r -f user.username
– wie unter „Folders nicht gefunden“ beschrieben.
cyradm localhost -u admin -> Login failed
cyradm localhost -u admin
Password:
IMAP Password:
Login failed: authentication failure at /usr/local/lib/perl5/site_perl/mach/5.18/Cyrus/IMAP/Admin.pm line 120.
cyradm: cannot authenticate to server with as admin
Mit grösster Wahrscheinlichkeit läuft das Login nicht wegen dem fehlenden Mysql Plugin
Wenn man mysql über auxprop aber nicht auf die Schnelle hinkriegt, kann man temporär Abhilfe schaffen und den User admin kurz so erstellen:
saslpasswd2 admin
So kann man die Admin Arbeiten trotzdem als user admin erledigen, auch wenn die Anbindung an MySQL noch nicht funktioniert.
imap[87354]: IOERROR: opening /var/imap/user_deny.db: No such file or directory
touch /var/imap/user_deny.db
chown cyrus:cyrus /var/imap/user_deny.d
löst das Problem.
SQUAT failed to open index file
Jul 13 11:14:35 corky imap[37158]: SQUAT failed to open index file
Jul 13 11:14:35 corky imap[37158]: SQUAT failed
Das Squat Index File wurde nicht gefunden. Squatter erstellt einen Index aller Nachrichten in einer Mailbox. Wenn man den Index neu buildet, verschwindet die Nachricht:
su cyrus
/usr/local/cyrus/bin/squatter
Das dauert jetzt recht lange, bis alles indexiert ist. Um den Index dauerhaft auf dem neusten Stand zu halten, im cyrus.conf die squatter Lines aktivieren:
EVENTS { # this is required checkpoint cmd="ctl_cyrusdb -c" period=30 # this is only necessary if using duplicate delivery suppression, # Sieve or NNTP delprune cmd="cyr_expire -E 3" at=0400 # this is only necessary if caching TLS sessions tlsprune cmd="tls_prune" at=0400 # for index searches # get rid of "SQUAT failed to open index file" error uncomment this # or change to higher debug level in /etc/syslog.conf # squatter cmd="squatter -r user" period=1440 # squatter cmd="/usr/local/cyrus/bin/squatter -r" at=0401
squatter cmd="squatter -r" period=1440 }
-r steht für rekursiv (alle Subfolders).
period=1440 bedeutet, dass der Befehl alle 1440 Minuten ausgeführt werden soll (=alle 24 Stunden).
und Service neu starten
service imapd restart
Sendmail
sendmail[24971]: gethostbyaddr(IPv6:xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx) failed: 1
Der Fehler kam bei mir, als ich den Versand zu Gmail testete:
sendmail -v -Am -i testadresse@gmail.com
dann im maillog:
Sep 14 14:12:45 corky sendmail[38838]: gethostbyaddr(IPv6:xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx) failed: 1
Lösung:
IPv6 Adresse im /etc/hosts
File eintragen:
::1 localhost localhost.my.domain
127.0.0.1 localhost localhost.my.domain
xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx localhost localhost.my.domain
Nun ist der Fehler weg.
IPv6 Versand in Sendmail deaktivieren (Gmail Problem)
Gmail verweigert die Mails, wenn der PTR Record fehlt. Den IPv6 SPF Record habe ich bereits hinzugefügt, doch dies löst das Problem mit Google nicht, da explizit der PTR Record gefordert wird. Dummerweise kann ich für unsere Adressen (noch) keine IPv6 PTR Records erstellen lassen, da dies von unserem Hosting Provider noch nicht unterstützt wird. Daher muss man den IPv6 Versand über Sendmail deaktivieren.
Folgendes Problem:
echo "Subject: test" | sendmail -v -Am -i testmail@gmail.com
Bedeutung der Flags:
-Am Use sendmail.cf even if the operation mode indicates an initial
mail submission.
-i Do not strip a leading dot from lines in incoming messages, and
do not treat a dot on a line by itself as the end of an incoming
message. This should be set if you are reading data from a
file.
-v Go into verbose mode. Alias expansions will be announced, etc.
Output
testmail@gmail.com... Connecting to gmail-smtp-in.l.google.com. via esmtp...
220 mx.google.com ESMTP x132-v6si1486162wmb.122 - gsmtp
>>> EHLO name.testserver.com
250-mx.google.com at your service, [xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
>>> STARTTLS
220 2.0.0 Ready to start TLS
>>> EHLO name.testserver.com
250-mx.google.com at your service, [xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx]
250-SIZE 157286400
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
>>> MAIL From:<teslina@name.testserver.com> SIZE=14
250 2.1.0 OK x132-v6si1486162wmb.122 - gsmtp
>>> RCPT To:<testmail@gmail.com>
>>> DATA
250 2.1.5 OK x132-v6si1486162wmb.122 - gsmtp
354 Go ahead x132-v6si1486162wmb.122 - gsmtp
>>> .
550-5.7.1 [xxxx:xxxx:x:xx:xxxx:xxxx:xxxx:xxxx] Our system has detected that this
550-5.7.1 message does not meet IPv6 sending guidelines regarding PTR records
550-5.7.1 and authentication. Please review
550-5.7.1 https://support.google.com/mail/?p=IPv6AuthError for more information
550 5.7.1 . x132-v6si1486162wmb.122 - gsmtp
sunci... Connecting to /var/run/dovecot/lmtp via local...
220 name.testserver.com Dovecot ready.
>>> LHLO name.testserver.com
250-name.testserver.com
250-8BITMIME
250-CHUNKING
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-STARTTLS
250 VRFY
>>> STARTTLS
220 2.0.0 Begin TLS negotiation now.
>>> LHLO name.testserver.com
250-name.testserver.com
250-8BITMIME
250-CHUNKING
250-ENHANCEDSTATUSCODES
250-PIPELINING
250 VRFY
>>> MAIL From:<>
250 2.1.0 OK
>>> RCPT To:<teslina>
>>> DATA
250 2.1.5 OK
354 OK
>>> .
250 2.0.0 <teslina> oNBrD/mnm1trngAAB3XiVw Saved
teslina... Sent
Closing connection to localhost
>>> QUIT
221 2.0.0 Bye
Closing connection to gmail-smtp-in.l.google.com.
>>> QUIT
Lösung:
Im sendmail.mc
folgende Zeilen unterhalb DAEMON_OPTIONS
einfügen:
dnl ### Daemon Options
DAEMON_OPTIONS(`Port=smtp, Name=MTA')
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')
DAEMON_OPTIONS(`Family=inet, Port=smtps, Name=MTA-SSL, M=s')
dnl ## disable ipv6:
CLIENT_OPTIONS(`Family=inet6, Address=::1')dnl
CLIENT_OPTIONS(`Family=inet, Address=0.0.0.0')dnl
Jetzt sendmail Files rebuilden und sendmail neu starten.
Jetzt sollte es funktionieren!
root@testserver(/etc/mail)> echo "Subject: test" | sendmail -v -Am -i testmail@gmail.com
testmail@gmail.com... Connecting to gmail-smtp-in.l.google.com. via esmtp...
220 mx.google.com ESMTP a21-v6si6414675edc.228 - gsmtp
>>> EHLO name.testserver.com
250-mx.google.com at your service, [xxx.xx.xx.xx]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
>>> STARTTLS
220 2.0.0 Ready to start TLS
>>> EHLO name.testserver.com
250-mx.google.com at your service, [xxx.xx.xx.xx]
250-SIZE 157286400
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
>>> MAIL From:<teslina@name.testserver.com> SIZE=14
250 2.1.0 OK a21-v6si6414675edc.228 - gsmtp
>>> RCPT To:<testmail@gmail.com>
>>> DATA
250 2.1.5 OK a21-v6si6414675edc.228 - gsmtp
354 Go ahead a21-v6si6414675edc.228 - gsmtp
>>> .
250 2.0.0 OK 1536931108 a21-v6si6414675edc.228 - gsmtp
testmail@gmail.com... Sent (OK 1536931108 a21-v6si6414675edc.228 - gsmtp)
Closing connection to gmail-smtp-in.l.google.com.
>>> QUIT
221 2.0.0 closing connection a21-v6si6414675edc.228 - gsmtp
.
Cyrus Admin Scripts
Leider ist es bei cyrus schon öfters passiert, dass ich alles neu builden musste. Daher habe ich hier ein paar Scripts geschrieben, die das ganze etwas einfacher machen. Grundsätzlich wird einfach alles durchlaufen, was in den oben genannten Fehlermeldungen zur Behebung beschrieben wird.
Damit die Scripts funktionieren, muss expect
vorhanden sein.
pkg install expect
mkdir ~/cyrus
cd ~/cyrus
Hauptscript, welches die komplette Recovery durchführt, inkl. Backup:
Scripts
START_RECOVERY.sh
vi START_RECOVERY.sh
paste:
#!/usr/local/bin/bash
source ./config.cfg
DATE=`date +"%Y%m%d-%H%M"`
BACKUPDIR=$IMAP_DIR/backup.$DATE/
echo "Stopping imapd..."
$IMAPD_STARTUP stop
echo "Backing up old data to $BACKUPDIR ..."
mkdir $BACKUPDIR
mv $IMAP_DIR/*.db $BACKUPDIR
echo "Re-Build Database..."
su -m cyrus -c "$CYRUS_BIN_DIR/ctl_cyrusdb -r"
touch $IMAP_DIR/user_deny.db
chown cyrus:cyrus $IMAP_DIR/user_deny.db
echo "Starting imapd..."
$IMAPD_STARTUP start
# fuer cyradm muss imapd gestartet sein
echo "Recreating Mailboxes by cyradm..."
./recreate.mailboxes.sh
echo "Reconstructing Mailboxes..."
./reconstruct.mailboxes.sh
printf "nn---------- RECONSTRUCTION DONE! ------------nn"
echo "Checking for missing DB Entries..."
su -m cyrus -c "$CYRUS_BIN_DIR/ctl_mboxlist -v"
printf "nnFalls hier Fehler ausgegeben wurden, hier findest du den Loesungsweg: https://www.teslina.com/tutorials/freebsd/installation-software/installation-sendmail-cyrus-imap/#Folders_nicht_gefundennn"
config.cfg
Das Config File dazu:
vi config.cfg
Paste:
IMAPD_STARTUP="/usr/local/etc/rc.d/imapd"
IMAP_DIR="/var/imap"
CYRUS_BIN_DIR="/usr/local/cyrus/bin"
POP_DIR="/var/spool/imap/user"
CYR_PW="YOUR_CYRADM_PASSWORD"
cyradm.createbulkusers.exp
Dieses Script wird von recreate.mailboxes.sh aufgerufen. Es connected zu cyradm
und führt die gewünschten Befehle aus.
Bitte beachte, dass dafür expect
installiert sein muss.
vi cyradm.createbulkusers.exp
#!/usr/local/bin/expect -f
#
# usage: cyrus.createbulkusers.exp COMMANDS
#
set commands [lindex $argv 0]
#
#
spawn /usr/local/bin/cyradm -u admin localhost
expect "assword:"
expect_user -re "(.*)n"
set mypw $expect_out(1,string)
send "$mypwr"
expect "host>"
#
send "$commandsr"
expect "host>"
#
send "exitr"
expect eof
#
cyradm.createuser.exp
Dies ist einfach ein Helperscript (gehört nicht zum Rebuild), welches eine Mailbox erstellt. Aufruf:
cyradm.createuser.exp USERNAME
vi cyradm.createuser.exp
Paste:
#!/usr/local/bin/expect -f
#
# usage: cyradm.createuser.exp USERNAME
#
set user [lindex $argv 0]
#
#
spawn /usr/local/bin/cyradm -u admin localhost
expect "assword:"
expect_user -re "(.*)n"
set mypw $expect_out(1,string)
send "$mypwr"
expect "host>"
#
send "cm user.$user r"
expect "host>"
#
send "exitr"
expect eof
#
reconstruct.mailboxes.sh
Rekonstruiert alle Mailboxen, für die ein Verzeichnis auf dem Server existiert. Dieses Script wird über START_RECOVERY.sh
aufgerufen – es kann bei Bedarf aber auch standalone aufgerufen werden.
vi reconstruct.mailboxes.sh
Paste:
#!/usr/local/bin/bash
source ./config.cfg
USERS=`cd $POP_DIR; ls -d *`
echo "Stopping imapd..."
$IMAPD_STARTUP stop
for USER in $USERS; do
echo "Reconstructing Mailbox for $USER ..."
su -m cyrus -c "$CYRUS_BIN_DIR/reconstruct -r -f user.$USER"
done
echo "Starting imapd..."
$IMAPD_STARTUP start
recreate.mailboxes.sh
Hier werden die vorhandenen Mailboxen aufgelistet und an cyradm übergeben per cyradm.createbulkusers.exp
. Dieses Script wird über START_RECOVERY.sh
aufgerufen – es kann bei Bedarf aber auch standalone aufgerufen werden.
vi recreate.mailboxes.sh
Paste:
#!/usr/local/bin/bash
source ./config.cfg
USERS=`cd $POP_DIR; ls -d *`
echo "Stopping imapd..."
$IMAPD_STARTUP stop
for USER in $USERS; do
echo "Reconstructing Mailbox for $USER ..."
su -m cyrus -c "$CYRUS_BIN_DIR/reconstruct -r -f user.$USER"
done
echo "Starting imapd..."
$IMAPD_STARTUP start
root@corky(~/cyrus)> cat recreate.mailboxes.sh
#!/usr/local/bin/bash
# fuer cyradm muss imapd gestartet sein
source ./config.cfg
USERS=`cd $POP_DIR; ls -d *`
for USER in $USERS; do
echo "Creating Mailbox for $USER"
#echo "cm user.$USER"
# unsafe, ich will pw nicht sichtbar uebergeben
cyradm -u admin -w $CYR_PW localhost << CYRADMSCRIPT
cm user.$USER
CYRADMSCRIPT
#COMMANDS+="cm user.$USER r"
done
# prompt for login and execute bulk commands
#./cyradm.createbulkusers.exp $COMMANDS
Berechtigungen setzen
chmod 775 *.sh
chmod 775 *.exp
Usage
Nachdem das Config File angepasst wurde (bei Bedarf auch die *.exp Scripts wegen dem Pfad zu den Cyrus Binaries), können mit
./START_RECOVERY.sh
alle Mailboxen neu erstellt werden.
Beachte: Da die DB Files bei diesem Prozess gelöscht werden, erscheinen nachher in den Email Programmen alle Nachrichten als ungelesen. Ansonsten sollte alles so funktionieren wie gewünscht.
Den Script
./cyradm.createuser.exp meinusername
kann man ausführen, um eine neue Mailbox zu erstellen
.
Manche Deiner Anleitungen sind ja ganz nett. Aber diese hier kann man echt überhaupt nicht gebrauchen. Einige Sachen fehlen, andere Sachen sind falsch und wieder andere Sachen sind vollkommen unnötig.