Inhaltsverzeichnis

Mailserver

MTA (Postfix):

  Nimmt E-Mails vom Client entgegen und leitet sie an andere Mailserver weiter
  Nimmt E-Mails von anderen Servern entgegen und leitet diese E-Mails an den MDA weiter
  => Transportaufgaben
Typ Beschreibung Einsatzszenarien
"Internet Site" Standard. Mail wird empfangen und verschickt. Echter Mailserver mit fester IP-Adresse, z.B. Root-Server
"Internet mit Smarthost" Wie Internet Site, aber Mail wird nicht direkt an den entfernten Server zugestellt, sondern über einen anderen Server (etwa beim ISP) geleitet. Mailserver mit dynamischer IP-Adresse, die sonst sehr oft als potentielle Spam- oder Virenversender blockiert werden.
"Satellite System" Keine Mail wird empfangen, alle ausgehende Mail über einen Smarthost (s.o.) verschickt. Mail durch Admin-Skripte oder Webapplikationen verschicken lassen.
"Local only" Mail wird lokal auf dem Rechner zugestellt, es wird keine Mail von außen empfangen bzw. nach außen geschickt. Wie "Satellite System", aber die Mail soll direkt auf demselben System gelesen werden.

MDA (Dovecot):

  „Einsortierung“ der ankommenden E-Mails in die korrekten Postfächer
  => „Logistik“

IMAP Server (Dovecot):

  Gibt auf Anfrage den Inhalt der Mailbox zurück
  Abgleich der Mailbox über mehrere Geräte hinweg
  => Speicher-/Mailboxverwaltung

Mails über seinen Provider versenden

Mailversand mit Postfix

Postfix SMTP Relay auf FreeBSD 14.2
cd /usr/ports/mail/postfix
make clean
make config
  >>SASL<< auswählen
make install
make clean
 
vim /etc/rc.conf
  postfix_enable="YES"
  sendmail_enable="NONE"
 
vim /etc/periodic.conf
  daily_clean_hoststat_enable="NO"
  daily_status_mail_rejects_enable="NO"
  daily_status_include_submit_mailq="NO"
  daily_submit_queuerun="NO"
 
vim /usr/local/etc/postfix/main.cf
  mynetworks_style = host
  myorigin = example.com
  relayhost = [smtp.example.com]:465
  sender_canonical_maps = regexp:/usr/local/etc/postfix/sender_canonical
  smtp_sasl_auth_enable = yes
  smtp_sasl_mechanism_filter = plain, login
  smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
  #smtp_sasl_security_options = noplaintext, noanonymous
  smtp_sasl_security_options = noanonymous
  smtp_tls_security_level = secure
  smtp_tls_wrappermode = yes
 
touch /usr/local/etc/postfix/sender_canonical
chmod 0600 /usr/local/etc/postfix/sender_canonical
vim /usr/local/etc/postfix/sender_canonical
  /^.*$/ noreply@example.com
 
touch /usr/local/etc/postfix/sasl_passwd
chmod 0600 /usr/local/etc/postfix/sasl_passwd
vim /usr/local/etc/postfix/sasl_passwd
  [smtp.example.com]:465 username:P@ssw0rd
 
postmap /usr/local/etc/postfix/sender_canonical
postmap /usr/local/etc/postfix/sasl_passwd
 
service postfix restart
 
# Mail-Queue anzeigen:
mailq
postqueue -p
 
# Mails aus der Queue löschen:
postsuper -d ALL
postsuper -d "${QUEUE_ID}"
 
# Test-Mail abschicken (oneliner):
printf "From: sender@example.com\nTo: recipient@example.com\nSubject: Test\n\ntest body" | sendmail -t -i
 
# Test-Mail abschicken:
cat << "EOF" | sendmail -t -i
From: sender@example.com
To: recipient@example.com
Subject: Test
 
test body
EOF

Sieve

S/MIME-Mail-Verschlüsselung

mit openssl

E-Mail-Text (Body) mit openssl verschlüsseln:

> openssl smime -encrypt -des3 -out message_encrypted.txt zertifikat.cer < message.txt

so wird auch gleich noch der Header ("From:", "To:" und das "Subject:") mit angebaut und es entsteht eine vollwertige E-Mail, die einen verschlüsselten Body

> openssl smime -encrypt -des3 -out message_encrypted.eml -from absender@domain1.tld -to empfaenger@domain2.tld -subject "Eine geheime Nachricht" zertifikat.cer < message.txt

mit Content-Filter im Postfix

Postfix bietet verschiedene Möglichkeiten, externe Content-Filter zu implementieren. Eine relativ einfache Variante ist, das Postfix Kommando "pipe" zu verwenden, und damit ein beliebiges Skript mit den Daten der Email auf der Standardeingabe zu versehen.

Angenommen, es existiert ein Skript /usr/local/bin/mein_filter.sh, dass Emails (Header+Body) auf der Standardeingabe akzeptiert und dann - wie auch immer - weiter verarbeitet und zurück in das Mailsystem gibt.

Um dieses Skript als Filter zu verwenden, muss zuerst in /etc/postfix/master.cf ein entsprechender Transport-Mechanismus definiert werden:

> vi /etc/postfix/master.cf
...
meinfilter unix - n n - 2 pipe
    flags=Rq user=filter null_sender=
    argv=/usr/local/bin/mein_filter.sh -f ${sender} -- ${recipient}
...

Dadurch existiert ein neuer Transport-Mechanismus mit dem Namen "meinfilter", der bei Verwendung unter dem Benutzeraccount "filter" das Skript /usr/local/bin/mein_filter.sh aufruft und mit der Email auf der Standardeingabe versorgt.

Die Parameter für das Skript ( "-f ${sender} -- ${recipient}") sind so gewählt, dass Sie später 1:1 an das Kommando sendmail übergeben werden können.

Zusätzlich wird in der Postfix-Konfiguration für den neuen Transportmechanismus festgelegt, dass er für jeden einzelnen Empfänger einer Email separat aufgerufen werden muss. Das kostet zwar Performance, spart aber etwas Intelligenz im Filter-Skript:

> vi /etc/postfix/main.cf
...
# meinfilter benötigt alle recipients einzeln
meinfilter_destination_recipient_limit = 1
...

Das Filter-Skript

Das Filter-Skript soll die Email auf der Standard-Eingabe entgegennehmen, verarbeiten (also verschlüsseln) und wieder an den MTA übergeben:

/usr/local/bin/mein_filter.sh
#!/bin/bash
 
WORKDIR="/tmp"
SENDMAIL="/usr/sbin/sendmail -G -i"
CERTS="/etc/mailcerts"
EX_UNAVAILABLE=69
SENDER="$2"
RECIPIENT="$4"
 
if test -f "$CERTS/$RECIPIENT.crt" ; then
 
        MESSAGEFILE="$WORKDIR/message.$$"
 
        trap "rm -f $MESSAGEFILE; rm -f $MESSAGEFILE.encrypted" 0 1 2 3 15
 
        umask 077
 
        cat > $MESSAGEFILE || { echo Cannot save mail to file; exit $EX_UNAVAILABLE;}
 
        SUBJECT="$(reformail -x "Subject:" < $MESSAGEFILE)"
 
        openssl smime -encrypt -des3 -out $MESSAGEFILE.encrypted -from $SENDER -to $RECIPIENT -subject "$SUBJECT" $CERTS/$RECIPIENT.crt < $MESSAGEFILE || { echo Problem encrypting message; exit $EX_UNAVAILABLE; }
 
        $SENDMAIL "$@" < $MESSAGEFILE.encrypted
        exit $?
else
        cat | $SENDMAIL "$@"
        exit $?
fi

Falls ein Email-Empfänger mit der Adresse benutzername@domain.tld verschlüsselte Emails erhalten soll, muss dessen Benutzerzertifikat in das Verzeichnis "/etc/mailcerts" unter dem Dateinamen benutzername@domain.tld.crt abgelegt werden. Wird im Skript eine entsprechende Datei gefunden, wird die Email per openssl verschlüsselt. Ist kein Zertifikat hinterlegt, wird die Email ungefiltert an das sendmail-Kommando übergeben.

Verschlüsselung aktivieren

> vi /etc/postfix/master.cf
...
smtp inet n - - - - smtpd -o content_filter=meinfilter:dummy
meinfilter unix - n n - 2 pipe
  flags=Rq user=filter null_sender=
  argv=/usr/local/bin/mein_filter.sh -f ${sender} -- ${recipient}
...

Für genauere Infos siehe "man 5 master".

Mailserver mit FreeBSD

Dovecot-Sieve muss vor Postfix installiert werden, sonst wird Dovecot ohne Sieve-Unterstützung als Abhängigkeit automatisch installiert!

SSL-Schlüssel

Sowohl Dovecot als auch Postfix sollte man ein SSL-Schlüssel/Zertifikat spendieren.

Wie das geht, steht hier: SSL-Schlüssel generieren


http://blog.al-shami.net/index.php/freebsd-postfix-dovecot-and-active-directory/

Mail (Ubuntu 20.04 LTS)

Installation:

root@linux:~# apt install mailutils

E-Mail-Test:

fritz@linux:~$ echo Test001 | mail -s Test001 fritz@linux.lan

Ob eine E-Mail angekommen ist, kann man an diesen beiden Dateien sehen:

fritz@linux:~$ ls -lha /var/mail/fritz /home/fritz/mbox
-rw------- 1 fritz fritz   0 Dec 28 17:21 /home/fritz/mbox
-rw------- 1 fritz mail  464 Dec 28 17:22 /var/mail/fritz

E-Mail lesen:

fritz@linux:~$ mail
"/var/mail/fritz": 1 message 1 new
>N   1 fritz@linux.lan Mon Dec 28 17:22  13/413   Test001
? 

Mit einem Druck auf "[Enter]" öffnen sie die Mail…

Return-Path: <fritz@linux.lan>
X-Original-To: fritz@linux.lan
Delivered-To: fritz@linux.lan
Received: by linux.lan (Postfix, from userid 1001)
        id 6BDCA10064B; Mon, 28 Dec 2020 17:22:06 +0100 (CET)
Subject: Test001
To: <fritz@linux.lan>
X-Mailer: mail (GNU Mailutils 3.7)
Message-Id: <20201228162206.6BDCA10064B@linux.lan>
Date: Mon, 28 Dec 2020 17:22:06 +0100 (CET)
From: fritz@linux.lan

Test001
?

Mit "[Q]" beendet man das Programm:

? q

Fehlermeldungen

bei dieser Meldung im Log, ist das Limit für die maximale Mail-Größe (beim Postfix message_size_limit) anzuheben oder die zu versendende Mail muss verkleinert werden:

... smtp: Failed: 452 4.3.1 Insufficient system storage

oder die Anzahl der Mails in der Warteschlange ist zu groß:

# ls /var/spool/nullmailer/queue/* | wc -l
bash: /bin/ls: Die Argumentliste ist zu lang
0

# for i in /var/spool/nullmailer/queue/* ; do ls ${i} ; done | wc -l
63538