Mailversand von selbst programmierten Scripten oder selbst installierter Spezialsoftware
Wen betrifft dieser Artikel?
Dies sind nicht die Maileinstellungen für Endanwender.
Diese Maileinstellungen empfehlen wir zum Beispiel für automatisch verschickte Bestätigungsmails von Webformularen o.ä.
Verbindungsdaten
Wenn es in einer Ubuntu-VM im ESX der ITO ist oder einer ähnlichen Linux-Installation:
- SMTP-Server: localhost
- Port: 25
- Kein Login, kein Passwort
- Kein TLS/SSL
- Alternativ "sendmail"-Command
Von anderen Rechnern in den internen Netzen der ITO:
- SMTP-Server: mail.cit.tum.de
- Port: 587 (oder 25) mit StartTLS oder Port 465 mit smtps
- Kein Login, kein Passwort (evtl. in Zukunft geplant)
Konfiguration mit Smarthost in den internen Netzen der ITO:
- SMTP-Server: mailrelay.rbg.tum.de
- Port: 25
Bitte beachten
Es ist wichtig, dass Sie diese Hinweise beachten. Was passiert, wenn Sie es nicht beachten?
- Wenn Ihre Mails von Benutzern externer Provider (z.B. Outlook.com) als Spam markiert werden oder dort automatisch als Spam erkannt werden, kann es sein, dass dieser Provider unseren Mailserver auf eine Sperrliste setzt. Im schlimmsten Fall kann dann niemand an der CIT mehr E-Mails versenden.
- Bei falscher Konfiguration kann es auch leicht passieren, dass Mails in großer Anzahl entstehen, die unser Mailsystem überlasten.
- Sie laufen Gefahr, dass wir Ihren Host sperren.
- Sie laufen Gefahr, dass Ihr Host automatisch gesperrt wird von uns oder vom LRZ.
- Ihre Benutzer können Ihre Services im wichtigsten Moment nicht benutzen oder Ihre Mails nicht empfangen. Ihr Projekt scheitert.
Deswegen folgende Hinweise:
- Schicken Sie niemandem Mails gegen ihren Willen. Idealerweise sollten sich alle Empfänger vorher explizit einverstanden erklärt haben, dass Sie Mails von Ihnen erhalten werden, und aus der Mail sollte explizit hervorgehen, warum die Empfänger sie erhalten.
- Schicken Sie von einer gültigen Absenderadresse. Verwenden Sie keinen Absender wie "noreply@...". Einige Provider stufen das als spammig ein. Es auch ist wichtig, dass auch Bounces an diese Adresse geregelt empfangen werden können. Sonst können Double Bounces entstehen, was insbesondere in größerer Anzahl das Mailsystem zusätzlich belasten kann und die Fehlersuche erschwert.
- Beachten Sie, dass es zwei Absenderadressen gibt: 1. Die Absenderadresse aus dem "From"-Header und 2. den Envelope Sender (auch bekannt als Bounce-Adresse). Beide müssen gültig sein. Sie können für beides die gleiche Adresse verwenden.
- Optional gibt es als drittes noch die Reply-To-Adresse, was aber kein Ersatz für gültige Absender und Bounce-Adresse ist.
- Testen Sie, ob Sie die Bounces erhalten, falls Ihr Script an eine nichtzustellbare Adresse schickt.
- Testen Sie, ob Ihre Mails von externen Providern oder von einer Software wie SpamAssassin als Spam eingestuft werden.
- Wenn Sie HTML-Mails versenden, fügen Sie eine Plain-Text-Version mit ein.
- Überlegen Sie, wie viele Mails in Ausnahmesituationen entstehen können, und implementieren Sie ggf. ein Ratelimit. Hinweise zu Massenmails
- Statt große Attachments (inbesondere an viele Empfänger gleichzeitig) zu verschicken, suchen Sie nach einer anderen Lösung, z.B. schicken Sie Links auf Dateien in der Nextcloud.
- Achtung vor Webformular-Spam: Wenn eine Webseite für Fremde erreichbar ist, eine frei wählbare Mailadresse eingegeben werden kann und die Möglichkeit besteht, in einem Textfeld eine URL oder einen Werbetext einzugeben, werden Spammer diese Webseite irgendwann finden und Spam darüber verschicken.
Hinweise hauptsächlich für selbstprogrammierte Scripte / Anwendungen:
- Setzen Sie alle Header auf korrekte Werte.
- Der Header "Date" muss auf ein syntaktisch korrektes Datum gesetzt werden, es soll nicht in der Vergangenheit oder Zukunft liegen. Verwenden Sie Libraries o.ä., um den Header zu erzeugen.
- Der Header Message-ID sollte auch von einer Library erzeugt werden.
- Implementieren Sie Fehlerbehandlung, wenn der SMTP-Server oder das sendmail-Command einen Fehler liefert.
Beispiel-Code in Python
from email.mime.text import MIMEText
import email.utils
import email.charset
import smtplib
body = 'Dies wäre eine Test-Message, sie hätte sogar Umlaute.'
subject = 'Bloß ein Test'
sender_name = 'Vorname Nachname'
sender_addr = '........@cit.tum.de'
recipient = '......@cit.tum.de'
charset = email.charset.Charset('utf-8')
# Quoted Printable: So bleibt der Quelltext der E-Mail menschenlesbar.
charset.body_encoding = email.charset.QP
mime = MIMEText(body, _charset=charset)
mime['From'] = email.utils.formataddr((sender_name, sender_addr)) # Ergibt Vorname Nachname <addr>
mime['To'] = recipient
mime['Subject'] = subject
mime['Date'] = email.utils.formatdate(localtime=True)
mime['Message-ID'] = email.utils.make_msgid()
try:
smtp = smtplib.SMTP(
host='localhost',
port=25)
smtp.send_message(
mime,
from_addr=sender_addr, # Envelope Sender
to_addrs=[recipient])
smtp.quit()
except (smtplib.SMTPException, ConnectionRefusedError) as e:
print('Es gab einen SMTP-Fehler:', e)
Fehlersuche
Im oben erwähnten Setup mit localhost oder sendmail gestaltet sich die Fehlersuche besonders einfach für Sie:
- Der Befehl mailq zeigt Mails an, die noch aufgestaut sind.
- Die Datei /var/log/mail.log zeigt Erfolgs- und Fehlermeldung von verschickten Mails.
- Wenn Sie wegen Ratelimit oder Spam von uns gesperrt wurden, sehen Sie an diesen Stellen auch entsprechende Fehlermeldungen.