E-Mail-Versand
PHPs mail() funktioniert auf jeder PHP-Website, deren Domain ihre E-Mails bei uns hat. Eine solche Website bekommt eine eigene Adresse, die nur versendet, und mail() übergibt jede Nachricht unter dieser Adresse an unseren Mailserver. Du musst nichts einrichten: Alles, was über mail() versendet, nutzt sie, auch WordPress ohne SMTP-Plugin, Cronjobs und Befehle in der Konsole.
In der Übersicht der Website steht die Karte E-Mail-Versand aus PHP. Sie zeigt die Adresse und die geltenden Limits, oder den Grund, warum die Website keinen Absender hat.
Wann eine Website einen Absender bekommt
Die Domain der Website muss alles hiervon erfüllen:
- Sie gehört zu deinem Konto.
- E-Mail ist für sie eingeschaltet, und die Domain ist verifiziert.
- Ihre MX-Einträge zeigen auf uns.
- Ihr SPF- oder DKIM-Eintrag ist gesetzt.
Eine Website auf einer Subdomain nutzt die Domain, zu der sie gehört, also qualifiziert sich shop.example.com über example.com. Statische Websites führen kein PHP aus und bekommen keinen Absender.
Eine neue Website bekommt ihren Absender innerhalb von 10 Minuten. Wenn du DNS oder E-Mail-Einstellungen einer Domain änderst, kann es bis zu einer Stunde dauern, bis die Website nachzieht.
Wenn die Karte statt einer Adresse einen Grund nennt:
| Die Karte sagt | Was du tun kannst |
|---|---|
| Die E-Mails liegen bei einem anderen Anbieter | Siehe E-Mail bei einem anderen Anbieter |
| E-Mail ist ausgeschaltet oder nicht enthalten | Schalte E-Mail unter E-Mail → Domain-Einstellungen ein. Liegen ihre E-Mails bei einem anderen Anbieter, siehe E-Mail bei einem anderen Anbieter |
| Die Domain ist für E-Mail noch nicht verifiziert | Verifiziere die Domain unter E-Mail → DNS & Einrichtung |
| Der SPF- oder DKIM-Eintrag fehlt | Lege die Einträge unter E-Mail → DNS & Einrichtung an |
| Füge eine eigene Domain hinzu | Die Website hat nur einen Plattform-Hostnamen. Füge ihr eine Domain hinzu |
| Die Website ist gestoppt | Eine gestoppte Website hat keinen Absender. Sie bekommt wieder einen, sobald sie weiterläuft |
Die Adresse
| Hostname der Website | Absenderadresse |
|---|---|
example.com oder www.example.com | website@example.com |
shop.example.com | website-shop@example.com |
Ist diese Adresse schon vergeben, kommt eine Zahl dazu, etwa website-2@example.com.
Die Adresse versendet nur:
- Sie empfängt nichts. E-Mails an sie werden abgelehnt, Antworten und Unzustellbarkeitsnachrichten an sie gehen also verloren. Trag die Adresse, die Antworten bekommen soll, in
Reply-Toein. - Sie kann keine E-Mails lesen. Das Portal zeigt ihr Passwort nicht an, und sie kann sich weder per IMAP noch per POP3 anmelden.
- Der Name ist reserviert. Auf keiner Domain lässt sich ein Postfach oder Alias anlegen, dessen Name mit
websitebeginnt.
Die From-Adresse
Jede Adresse in From, und in Sender oder Resent-From, falls dein Code sie setzt, muss auf der Domain der Absenderadresse der Website oder einer Subdomain davon liegen. Setzt dein Code kein From, wird die Adresse der Website verwendet. Alles andere wird abgelehnt:
550 5.7.1 From address not permitted for this senderMeistens betrifft das Kontaktformulare. Die Adresse des Besuchers gehört in Reply-To, damit eine Antwort auf die Nachricht trotzdem bei ihm ankommt:
mail('info@example.com', 'Kontaktformular', $body, [
'From' => 'website@example.com',
'Reply-To' => 'besucher@example.org',
]);Limits
Jede Website hat ihr eigenes Limit, gezählt in Empfängern: Eine Nachricht an drei Personen zählt drei.
| Zeitraum | Empfänger |
|---|---|
| Pro Stunde | 200 |
| Pro Tag | 1.000 |
In den ersten 30 Tagen nach der Registrierung deines Kundenkontos gilt stattdessen das strengere Versandlimit für neue Konten: 30 Empfänger pro Stunde und 100 pro Tag. Eine abgelehnte Nachricht zählt nicht. Braucht eine Website ein höheres Limit, melde dich beim Support.
Was auf diesem Weg versendet wird, zählt außerdem zu den monatlichen ausgehenden Nachrichten der Domain, genau wie E-Mails aus einem Postfach. Siehe E-Mail.
Nichts landet in einer Warteschlange
Lehnt der Server eine Nachricht ab, wegen der From-Regel, eines Limits oder eines vorübergehenden Problems bei uns, gibt mail() false zurück und die Nachricht ist weg. Nichts versucht es erneut, prüf also den Rückgabewert.
Die Antwort des Servers steht in den Logs der Website, unter Fehler-Logs:
msmtp: server message: 452 4.7.1 Rate limit exceededBei E-Mails aus einem Cronjob steht sie stattdessen in der Ausgabe dieses Laufs: Cron, dann Läufe, dann Ausgabe.
Zum Testen führst du das hier in der Konsole aus, mit deiner eigenen Adresse:
php -r 'var_dump(mail("du@example.com", "Test", "Testnachricht"));'bool(true) heißt, der Server hat die Nachricht angenommen. Bei bool(false) steht der Grund in der Ausgabe der Konsole.
E-Mail bei einem anderen Anbieter
Zeigen die MX-Einträge der Domain zu einem anderen Anbieter, etwa Microsoft 365 oder Google Workspace, bekommt die Website keinen Absender. Unser Server versendet nicht für eine Domain, deren E-Mails woanders liegen. Eine Domain ganz ohne MX-Einträge zählt genauso. Sollen ihre E-Mails bei uns liegen, lege die Einträge unter E-Mail → DNS & Einrichtung an.
Versende stattdessen über deinen Anbieter, mit einem SMTP-Plugin oder der SMTP-Einstellung deines Frameworks, mit dem Server deines Anbieters, Port 587 oder 465 und einem Postfach-Login dort. In WordPress übernimmt ein SMTP-Plugin auch wp_mail().
Weiter
- E-Mail-Limits für die Limits, die für Postfächer gelten
- Fehlersuche, wenn E-Mails einer Website nicht ankommen