Wiki source code of Mailversand von selbst programmierten Scripten oder selbst installierter Spezialsoftware
Last modified by Christoph Bußenius on 2025/02/05 12:20
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | == Wen betrifft dieser Artikel? == | ||
2 | |||
3 | Dies sind **nicht** die Maileinstellungen für Endanwender. | ||
4 | |||
5 | Diese Maileinstellungen empfehlen wir zum Beispiel für **automatisch verschickte** Bestätigungsmails von Webformularen o.ä. | ||
6 | |||
7 | Es betrifft alle, die über die Mail-Server der ITO automatisch Mails verschicken möchten. Wenn Sie Mailserver des LRZ oder anderen benutzen, gelten andere Regeln, die Sie beim jeweiligen Betreiber nachfragen sollten. | ||
8 | |||
9 | == Verbindungsdaten == | ||
10 | |||
11 | Wenn es in einer **Ubuntu-VM** im ESX der ITO ist oder einer ähnlichen Linux-Installation: | ||
12 | |||
13 | * SMTP-Server: **localhost** | ||
14 | * Port: 25 | ||
15 | * Kein Login, kein Passwort | ||
16 | * Kein TLS/SSL | ||
17 | * Alternativ **"sendmail"**-Command | ||
18 | |||
19 | Von anderen Rechnern in den **internen Netzen** der ITO: | ||
20 | |||
21 | * SMTP-Server: mail.cit.tum.de | ||
22 | * Port: 587 (oder 25) mit StartTLS oder Port 465 mit smtps | ||
23 | * Kein Login, kein Passwort (evtl. in Zukunft geplant) | ||
24 | |||
25 | Konfiguration mit Smarthost in den internen Netzen der ITO: | ||
26 | |||
27 | * SMTP-Server: mailrelay.rbg.tum.de | ||
28 | * Port: 25 | ||
29 | |||
30 | == Bitte beachten == | ||
31 | |||
32 | Es ist wichtig, dass Sie diese Hinweise beachten. **Was passiert**, wenn Sie es **nicht beachten?** | ||
33 | |||
34 | * 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**. | ||
35 | * Bei falscher Konfiguration kann es auch leicht passieren, dass Mails in großer Anzahl entstehen, die unser Mailsystem **überlasten**. | ||
36 | * Sie laufen Gefahr, dass wir Ihren Host oder Account **sperren**. | ||
37 | * Sie laufen Gefahr, dass Ihr Host oder Account automatisch **gesperrt** wird von uns oder vom LRZ. | ||
38 | * Ihre Benutzer können Ihre Services im wichtigsten Moment nicht benutzen oder Ihre Mails nicht empfangen. Ihr Projekt scheitert. | ||
39 | |||
40 | Deswegen folgende Hinweise: | ||
41 | |||
42 | * 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. (Dies bezieht sich hauptsächlich auf unpersönliche Mails, insbesondere wenn sie regelmäßig geschickt werden oder für etwas werben oder einladen. Das gilt auch für Einladungen zu Konferenzen.) | ||
43 | * Schicken Sie von einer **gültigen (existierenden) 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. | ||
44 | ** 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. | ||
45 | ** Optional gibt es als drittes noch die **Reply-To**-Adresse, was aber kein Ersatz für gültige Absender und Bounce-Adresse ist. | ||
46 | * Die **Absenderdomain** muss eine der von der ITO verwalteten Domains sein. Das sind i.A. die Domains **cit.tum.de, in.tum.de, ma.tum.de**, und Subdomains davon. Insbesondere können Sie **kein @tum.de** benutzen, und auch kein @gmail.com oder andere. Das würde Probleme mit SPF und DKIM geben. | ||
47 | * Testen Sie, ob Sie die **Bounces** erhalten, falls Ihr Script an eine nichtzustellbare Adresse schickt. | ||
48 | * Testen Sie, ob Ihre Mails von externen Providern oder von einer Software wie SpamAssassin **als Spam eingestuft** werden. | ||
49 | * Wenn Sie HTML-Mails versenden, fügen Sie eine **Plain-Text**-Version mit ein. | ||
50 | * Überlegen Sie, wie viele Mails in Ausnahmesituationen entstehen können, und implementieren Sie ggf. ein **Ratelimit**. [[Hinweise zu Massenmails>>https://wiki.ito.cit.tum.de/bin/view/Informatik/Benutzerwiki/MassenMails/]] | ||
51 | * 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. | ||
52 | * 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. | ||
53 | * Falls Sie mit Ihrem Benutzerpasswort Mails verschicken, speichern Sie das Passwort nicht oder nur gesichert. | ||
54 | |||
55 | Hinweise hauptsächlich für selbstprogrammierte Scripte / Anwendungen: | ||
56 | |||
57 | * Setzen Sie alle **Header auf korrekte Werte**. | ||
58 | ** 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. | ||
59 | ** Der Header **Message-ID** sollte auch von einer Library erzeugt werden. | ||
60 | * Implementieren Sie **Fehlerbehandlung**, wenn der SMTP-Server oder das sendmail-Command einen Fehler liefert. | ||
61 | |||
62 | == Beispiel-Code in Python == | ||
63 | |||
64 | ##from email.mime.text import MIMEText | ||
65 | import email.utils | ||
66 | import email.charset | ||
67 | import smtplib## | ||
68 | |||
69 | |||
70 | ##body = 'Dies wäre eine Test-Message, sie hätte sogar Umlaute.' | ||
71 | subject = 'Bloß ein Test' | ||
72 | sender_name = 'Vorname Nachname' | ||
73 | sender_addr = '........@cit.tum.de' | ||
74 | recipient = '......@cit.tum.de'## | ||
75 | |||
76 | |||
77 | ##charset = email.charset.Charset('utf-8') | ||
78 | # Quoted Printable: So bleibt der Quelltext der E-Mail menschenlesbar. | ||
79 | charset.body_encoding = email.charset.QP## | ||
80 | |||
81 | ##mime = MIMEText(body, _charset=charset) | ||
82 | mime['From'] = email.utils.formataddr((sender_name, sender_addr)) # Ergibt Vorname Nachname <addr> | ||
83 | mime['To'] = recipient | ||
84 | mime['Subject'] = subject | ||
85 | mime['Date'] = email.utils.formatdate(localtime=True) | ||
86 | mime['Message-ID'] = email.utils.make_msgid()## | ||
87 | |||
88 | ##try: | ||
89 | smtp = smtplib.SMTP( | ||
90 | host='localhost', | ||
91 | port=25) | ||
92 | smtp.send_message( | ||
93 | mime, | ||
94 | from_addr=sender_addr, # Envelope Sender | ||
95 | to_addrs=[recipient]) | ||
96 | smtp.quit() | ||
97 | except (smtplib.SMTPException, ConnectionRefusedError) as e: | ||
98 | print('Es gab einen SMTP-Fehler:', e)## | ||
99 | |||
100 | |||
101 | == Fehlersuche == | ||
102 | |||
103 | Im oben erwähnten Setup mit ##localhost## oder ##sendmail## gestaltet sich die Fehlersuche besonders einfach für Sie: | ||
104 | |||
105 | * Der Befehl **mailq** zeigt Mails an, die noch aufgestaut sind. | ||
106 | * Die Datei **/var/log/mail.log** zeigt Erfolgs- und Fehlermeldung von verschickten Mails. | ||
107 | * Wenn Sie wegen Ratelimit oder Spam von uns gesperrt wurden, sehen Sie an diesen Stellen auch entsprechende Fehlermeldungen. |