Wiki-Quellcode von Versand von E-Mails durch Web-Applikationen
Zuletzt geändert von gerold_wirnitzer@iteg_at am 2026-02-25 11:36:39
Zeige letzte Bearbeiter
| author | version | line-number | content |
|---|---|---|---|
| 1 | = {{id name="VersandvonE-MailsdurchWeb-Applikationen-Einleitung"/}}Einleitung = | ||
| 2 | |||
| 3 | Diverse Web- bzw. E-Mail-Kunden betreiben Web-Seiten oder andere Applikationen die E-Mails an die eigenen Mitarbeiter und/oder Kunden versenden wollen. | ||
| 4 | |||
| 5 | Dies ist leider nicht ganz unproblematisch, im Folgenden daher technische Informationen und Vorschläge zu dem Thema. | ||
| 6 | |||
| 7 | = {{id name="VersandvonE-MailsdurchWeb-Applikationen-ProblemfelderbeimVersandvonE-MailsdurchApplikationen"/}}Problemfelder beim Versand von E-Mails durch Applikationen = | ||
| 8 | |||
| 9 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-E-MailsdirektvomWeb-ServerhabenschlechtenDefault-Absender"/}}E-Mails direkt vom Web-Server haben schlechten Default-Absender == | ||
| 10 | |||
| 11 | Auf jedem ITEG-Webserver, aber auch auf vielen Webservern anderen Anbietern läuft lokal ein [[SMTP>>url:https://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol||shape="rect"]]-Server der als MTA ([[Message Transfer Agent>>url:https://de.wikipedia.org/wiki/Mail_Transfer_Agent||shape="rect"]]) verwendet werden kann, entweder indem man auf {{code language="none"}}localhost:25{{/code}} verbindet und SMTP spricht, oder indem man Mail-Bodies durch die meist vorhandene {{code language="none"}}sendmail{{/code}}-Kompatibilitäts-Binary piped. | ||
| 12 | |||
| 13 | In beiden Fällen hat das E-Mail einen ungeeigneten Absender (Envelope und Header), wie z.B. {{code language="none"}}kundexy@cwh22.iteg.at{{/code}}. | ||
| 14 | |||
| 15 | An eine solche Adresse kann man keine E-Mails schicken, und sie hält auch keiner Verifikation durch empfangende Mailserver stand, daher kommen solche E-Mails oft nicht zugestellt - und verschlechtern die E-Mail-Reputation des Web-Servers (bis hin zum Landen der IP-Adressen des Servers auf Sperrlisten). | ||
| 16 | |||
| 17 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-E-MailsdirektvomWeb-ServerhabenechtenAbsender,abernichtmitdiesemauthentifiziert"/}}E-Mails direkt vom Web-Server haben echten Absender, aber nicht mit diesem authentifiziert == | ||
| 18 | |||
| 19 | Um obiges Problem zu vermeiden und/oder um ohne Verwendung des [[E-Mail-Header-Feldes ReplyTo>>url:https://de.wikipedia.org/wiki/Header_(E-Mail)#Reply-To:_Antwortadresse||shape="rect"]] (oder [[Sender>>url:https://de.wikipedia.org/wiki/Header_(E-Mail)#Sender:_Technischer_Absender||shape="rect"]]) Antworten auf solche E-Mails zu erhalten werden manchmal echte E-Mail-Adressen als Absender gesetzt. | ||
| 20 | |||
| 21 | Meistens wird nur der Header-Absender gesetzt, d.h. das [[E-Mail-Header-Feld From>>url:https://de.wikipedia.org/wiki/Header_(E-Mail)#From:_Absender||shape="rect"]]. Manchmal wird auch der [[Envelope-Sender>>url:https://de.wikipedia.org/wiki/Envelope_Sender||shape="rect"]] gesetzt (SMTP-Kommando {{code language="none"}}MAIL FROM{{/code}}). Für die Folgen ist der Unterschied eher akademisch, bei der Analyse von Zustell-Problemen und für das Design von Allowlists aber manchmal zu beachten. | ||
| 22 | |||
| 23 | Leider bringt dieser Ansatz neue Probleme auf: | ||
| 24 | |||
| 25 | * Der Web-Server ist oft nicht im [[SPF-Record>>url:https://de.wikipedia.org/wiki/Sender_Policy_Framework#Aufbau_eines_SPF-Records||shape="rect"]] zu der Domain abgedeckt und werden nicht zugestellt | ||
| 26 | * Die E-Mails sind nicht mit [[DKIM>>url:https://de.wikipedia.org/wiki/DomainKeys_Identified_Mail||shape="rect"]] signiert, und werden nicht zugestellt | ||
| 27 | * Strenge empfangende Mail-Server lehnen unauthentifiziert gesendete E-Mails mit dort gehostetem Absender (!) generell ab, und die E-Mails werden nicht zugestellt. Das betrifft auch insbesondere E-Mail-Kunden von ITEG, weil unsere Mailcows eben aus gutem Grund streng sind. Aus diesem Grund werden unsere Mail-Server nicht mehr als halb-offene [[SMTP-Relay-Server>>url:https://de.wikipedia.org/wiki/SMTP-Relay-Server||shape="rect"]] für alle unsere Web-Server freischalten, das würde die Mailserver selbst sehr schnell auf Sperrlisten bringen. | ||
| 28 | |||
| 29 | Alle diese Details verschlechtern die E-Mail-Reputation des Web-Servers (bis hin zum Landen der IP-Adressen des Servers auf Sperrlisten). | ||
| 30 | |||
| 31 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-Seiten-bzw.Folge-EffektefüralleKundendievomgleichenWeb-ServerE-Mailsverschicken"/}}Seiten- bzw. Folge-Effekte für alle Kunden die vom gleichen Web-Server E-Mails verschicken == | ||
| 32 | |||
| 33 | Leider sind viele Empfänger von automatischen E-Mails zu schnell mit dem Klick auf “Junk” / “Spam”. | ||
| 34 | |||
| 35 | Das bringt besonders bei nicht-authentifiziert verschickten E-Mails die sendende IP-Adresse, also den Web-Server, schnell auf Sperrlisten. | ||
| 36 | |||
| 37 | Das verringert dann zusätzlich die Versand-Chance für E-Mails die von Applikationen anderen Kunden vom gleichen Server verschickt werden. | ||
| 38 | |||
| 39 | = {{id name="VersandvonE-MailsdurchWeb-Applikationen-Lösungen:Authentifiziertverschickenbzw.Newsletter-Spezialisten"/}}Lösungen: Authentifiziert verschicken bzw. Newsletter-Spezialisten = | ||
| 40 | |||
| 41 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-LösungfüreinzelneE-Mails:VersandauthentifiziertübereineneigenenMail-Account"/}}Lösung für einzelne E-Mails: Versand authentifiziert über einen eigenen Mail-Account == | ||
| 42 | |||
| 43 | Die Lösung für obige Probleme (für einzelne E-Mails) ist es, E-Mails grundsätzlich über den für die Absender-Domain zuständigen E-Mail-Server zu verschicken, und zwar authentifiziert und verschlüsselt. | ||
| 44 | Verschlüsselung sollte dabei nicht Port 25 und STARTTLS verwenden, sondern den von vornherein verschlüsselten Port 465. Diverse Mail-Server haben aufgehört auf Port 25 überhaupt Authentifizierung zu erlauben. | ||
| 45 | |||
| 46 | Beim Versand von Massen-E-Mails wie Newslettern hat das natürlich den Nachteil die Reputation des eigenen Mail-Servers und der eigenen Mail-Domain zu gefährden. | ||
| 47 | |||
| 48 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-LösungfürNewsletter:SpezialisierteAnbieter,evtl.Sub-Domain"/}}Lösung für Newsletter: Spezialisierte Anbieter, evtl. Sub-Domain == | ||
| 49 | |||
| 50 | Für den Versand von Newslettern oder anderen E-Mails an zig, hunderte, oder gar tausende Empfänger gibt es spezialisierte Anbieter. | ||
| 51 | |||
| 52 | Leider sind einige der Platzhirsche nicht DSGVO-konform und/oder USA-basiert. | ||
| 53 | |||
| 54 | Wir möchten keine einzelnen Anbieter empfehlen, daher sollte betroffene Kunden die Suchmaschine Ihrer Wahl z.B. mit {{code language="none"}}newsletter tools dsgvo{{/code}} befragen. | ||
| 55 | |||
| 56 | = {{id name="VersandvonE-MailsdurchWeb-Applikationen-How-TosfürE-Mail-VersanddurchApplikationen"/}}How-Tos für E-Mail-Versand durch Applikationen = | ||
| 57 | |||
| 58 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-Newsletter:EinfachesOpt-Out!"/}}Newsletter: Einfaches Opt-Out! == | ||
| 59 | |||
| 60 | Newsletter sollten eine möglichst einfache Opt-Out-Möglichkeit bieten, Empfänger sollen mit maximal 3 Klicks aus dem Verteiler kommen. | ||
| 61 | |||
| 62 | Leider prüfen empfangende Mail-Server alle Links in E-Mails so tief, dass teils sogar Java-Script ausgeführt wird, eine pauschale Empfehlung für eine Methode können wir daher nicht geben. | ||
| 63 | |||
| 64 | E-Mail-Empfänger sollten natürlich im Newsletter immer noch sehen, welche Ihrer evtl. mehreren E-Mail-Adressen überhaupt im Verteiler ist. | ||
| 65 | |||
| 66 | Grundsätzlich: Siehe oben, [[Lösung für Newsletter>>doc:CD.Hosting.Mail-Hosting bei ITEG - Übersicht.Versand von E-Mails durch Web-Applikationen.WebHome||anchor="VersandvonE-MailsdurchWeb-Applikationen-Lösung-für-Newsletter:-Spezialisierte-Anbieter,-evtl.-Sub-Domain" shape="rect"]]. | ||
| 67 | |||
| 68 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-Java-Applikationen"/}}Java-Applikationen == | ||
| 69 | |||
| 70 | Java’s normaler Mail-Client ist etwas zickig. | ||
| 71 | |||
| 72 | Unser Code dazu findet sich in unserem freien Tool [[FancyMail>>url:https://clazzes.atlassian.net/wiki/spaces/FANCYMAIL||shape="rect"]]. Das Repository ist unter {{code language="none"}}git://git.clazzes.org/java-libs/util/fancymail-main.git{{/code}} öffentlich clone-bar, der relevante Code ist in {{code language="none"}}fancymail/src/main/java/org/clazzes/fancymail/sending/SMTPClient.java{{/code}} in der Methode {{code language="none"}}createSmtpSession(){{/code}}. Die Properties werden hier via BluePrint aus {{code language="none"}}*.cfg{{/code}}-Dateien geholt und in die Bean gesetzt. Für eigene Applikationen wird man hier ohnehin eigenen Code schreiben, falls man keine andere Bibliothek verwendet, die das kann. | ||
| 73 | |||
| 74 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-Perl-Applikationen"/}}Perl-Applikationen == | ||
| 75 | |||
| 76 | Ja, Perl gibt es noch. Wir haben für Monitoring-Alarme eine Perl-Lösung die [[Net::SMTP>>url:https://perldoc.perl.org/Net::SMTP||shape="rect"]] verwendet, deren Code aber nicht mehr öffentlich ist. | ||
| 77 | |||
| 78 | Die nicht-Öffentlichkeit ist aber mehr Faulheit als Geheimhaltung, bei Interesse können wir auf Anfrage den SMTP-Teil als Code-Beispiel bereitstellen. | ||
| 79 | |||
| 80 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-PHP-Applikationen"/}}PHP-Applikationen == | ||
| 81 | |||
| 82 | Die normale [[mail>>url:https://www.php.net/manual/de/function.mail.php||shape="rect"]]-Funktion versendet leider dumm über eine {{code language="none"}}sendmail{{/code}}-Kompatible binary (wobei wir die dort dokumentierte Variante mit {{code language="none"}}sendmail.ini{{/code}} erst beim Schreiben dieser Zeile entdeckt und nicht näher untersucht haben). Man kann sich - auch in älteren PHP-Umgebungen - ggfs. mit [[msmtp>>url:https://marlam.de/msmtp/||shape="rect"]] bereitstellen, dem man Details zu einem zum Versand zu nutzenden SMTP-Account über eine Konfigurationsdatei {{code language="none"}}~/.msmtprc{{/code}} bzw. auch über Kommandozeile und damit über {{code language="none"}}php.ini{{/code}}-Settings bereitstellen kann. | ||
| 83 | |||
| 84 | Für native PHP-Lösungen bietet sich das [[pear-Modul Mail>>url:https://pear.php.net/package/Mail||shape="rect"]] an. | ||
| 85 | |||
| 86 | Beides ist in den bald für alle ITEG-Hosting-Kunden kommenden dockerisierten PHP-FPM-Umgebungen installiert. | ||
| 87 | |||
| 88 | == {{id name="VersandvonE-MailsdurchWeb-Applikationen-AndereApplikationen"/}}Andere Applikationen == | ||
| 89 | |||
| 90 | Keine Ahnung 😉️ | ||
| 91 | |||
| 92 | Die bei PHP erwähnte Lösung mit {{code language="none"}}msmtp{{/code}} sollte aber in ziemlich jeder Server-Situation helfen. |