E-Mail-Versand
owncloud.online verschickt Mails an mehreren Stellen: Freigabe-Einladungen,
Passwort-Zurücksetzen, Kontoanlage und Kalendereinladungen. Ist kein Versand
eingerichtet, fallen diese Funktionen aus — meist ohne sichtbare Meldung, der
Fehler landet nur im Serverprotokoll. Diese Seite beschreibt die Einrichtung
über die Oberfläche und über config/config.php, den Testversand sowie die
Fehlersuche.
Was ohne Mailversand ausfällt
| Funktion | Zuständiger Code | Verhalten ohne Versand |
|---|---|---|
| Freigabe-Einladung an interne Benutzer | lib/private/Share/MailNotifications.php |
Die Freigabe entsteht trotzdem; der Fehler wird als „Can't send mail to inform the user about an internal share" im Log unter sharing vermerkt |
| Freigabe-Einladung an eine Link-Adresse | dito | Zusätzlich muss die App-Einstellung shareapi_allow_public_notification auf yes stehen, sonst wird der Versand mit „Public link mail notification is not allowed" (HTTP 403) abgelehnt |
| Passwort vergessen | core/Controller/LostController.php |
Der Benutzer erhält „Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere deinen Administrator." |
| Bestätigung nach Passwortänderung | core/Controller/LostController.php, settings/ChangePassword/Controller.php |
Passwort ist geändert, es kommt keine Benachrichtigung |
| Neues Konto: Link zum Setzen des Passworts | settings/Controller/UsersController.php |
Das Konto existiert, der Benutzer bekommt keinen Zugang |
| Bestätigung und Änderung der eigenen Adresse | settings/Controller/UsersController.php |
Adresswechsel bleibt unbestätigt |
| Kalendereinladungen (iMIP) | apps/dav/lib/CalDAV/Schedule/IMipPlugin.php |
Eingeladene erhalten nichts |
| Aktivitäts-Zusammenfassungen | Plugin activity, lib/MailQueueHandler.php |
Die Warteschlange in der Tabelle activity_mq wird nicht geleert |
Zwei Einschränkungen, die häufig anders erwartet werden:
- Eine eigene Warnmail vor dem Ablauf einer Freigabe verschickt der Kern
nicht. Das Ablaufdatum wird in die Einladungsmail eingesetzt
(
createMailBody()inlib/private/Share/MailNotifications.php), danach erfolgt keine weitere Erinnerung. - Aktivitäts-Zusammenfassungen entstehen erst im Hintergrund-Job der App
activity. Ohne laufenden Cron werden sie nie verschickt, siehe Hintergrund-Jobs (Cron). Ein Nachholen von Hand:
sudo -u www-data php8.4 occ activity:send-emails
Einrichtung über die Oberfläche

Der Abschnitt E-Mail-Server liegt unter Einstellungen → Administration →
Allgemein (settings/Panels/Admin/Mail.php, Abschnitt general).
| Feld | Schlüssel | Anmerkung |
|---|---|---|
| Sendemodus | mail_smtpmode |
Auswahl php und smtp; sendmail erscheint nur, wenn das Binary gefunden wird; qmail nur, wenn es bereits gesetzt ist |
| Verschlüsselung | mail_smtpsecure |
Nichts / SSL/TLS / STARTTLS, nur im Modus smtp sichtbar |
| Absenderadresse | mail_from_address und mail_domain |
zwei Felder, getrennt durch das @ |
| Authentication method | mail_smtpauthtype |
Beschriftung in der deutschen Oberfläche unübersetzt; Auswahl Nichts / Login / Plain / NT LAN Manager |
| Authentifizierung benötigt | mail_smtpauth |
blendet die Zugangsdaten ein |
| Serveradresse | mail_smtphost und mail_smtpport |
zwei Felder, getrennt durch den Doppelpunkt |
| Zugangsdaten | mail_smtpname, mail_smtppassword |
Speichern nur über den Knopf Anmeldeinformationen speichern |
| Test Empfänger E-Mail Adresse | — | wird nicht gespeichert, gilt nur für den Testversand |
Das obere Formular speichert bei jeder Änderung sofort
(settings/js/panels/mail.js sendet bei change an
/settings/admin/mailsettings). Benutzername und Passwort gehen einen eigenen
Weg und werden erst mit dem Knopf übernommen. Wird die Authentifizierung
abgeschaltet, löscht MailSettingsController::setMailSettings() Benutzername
und Passwort aus der Konfiguration.
Ist config_is_read_only auf true gesetzt, entfallen beide Formulare. An
ihrer Stelle steht der Hinweis „Die Konfigurationsdatei ist schreibgeschützt.
Bitte passe deine Einstellungen durch manuelle Bearbeitung der
Konfigurationsdatei selbst an." samt Zusatz zur Synchronisierung im Cluster —
dann führt nur der Weg über config/config.php. Das Feld für den Testversand
und der Knopf E-Mail senden bleiben auch dann sichtbar.
Einrichtung über config.php
Typische SMTP-Anbindung mit STARTTLS auf Port 587:
sudo -u www-data php8.4 occ config:system:set mail_smtpmode --value smtp
sudo -u www-data php8.4 occ config:system:set mail_smtphost --value smtp.example.com
sudo -u www-data php8.4 occ config:system:set mail_smtpport --value 587 --type integer
sudo -u www-data php8.4 occ config:system:set mail_smtpsecure --value tls
sudo -u www-data php8.4 occ config:system:set mail_smtpauth --value true --type boolean
sudo -u www-data php8.4 occ config:system:set mail_smtpauthtype --value LOGIN
sudo -u www-data php8.4 occ config:system:set mail_smtpname --value noreply@example.com
sudo -u www-data php8.4 occ config:system:set mail_smtppassword --value 'CHANGE_ME'
sudo -u www-data php8.4 occ config:system:set mail_from_address --value noreply
sudo -u www-data php8.4 occ config:system:set mail_domain --value example.com
--type ist bei mail_smtpport und mail_smtpauth nötig, sonst landen die
Werte als Zeichenkette in der Datei. Gleichwertig ist der direkte Eintrag in
config/config.php:
'mail_smtpmode' => 'smtp',
'mail_smtphost' => 'smtp.example.com',
'mail_smtpport' => 587,
'mail_smtpsecure' => 'tls',
'mail_smtpauth' => true,
'mail_smtpauthtype' => 'LOGIN',
'mail_smtpname' => 'noreply@example.com',
'mail_smtppassword' => 'CHANGE_ME',
'mail_from_address' => 'noreply',
'mail_domain' => 'example.com',
Kontrolle der gesetzten Werte:
sudo -u www-data php8.4 occ config:system:get mail_smtphost
occ config:list system blendet mail_smtphost, mail_smtpname,
mail_smtppassword, mail_from_address und mail_domain aus — sie stehen in
lib/private/SystemConfig.php als schutzwürdig. config:system:get gibt den
Klartext aus.
Alle mail_-Schlüssel
| Schlüssel | Vorgabe im Code | Bedeutung |
|---|---|---|
mail_smtpmode |
php |
Versandweg. Nur smtp spricht SMTP; alles außer smtp und qmail ruft /usr/sbin/sendmail -bs auf |
mail_smtphost |
127.0.0.1 |
Adresse des SMTP-Servers, nur im Modus smtp |
mail_smtpport |
25 |
Port des SMTP-Servers. Der Wert 465 schaltet zusätzlich implizites TLS ein |
mail_smtpsecure |
leer | Nicht leer bedeutet: Verbindung muss verschlüsselt sein. Die Werte ssl und tls wirken dabei gleich |
mail_smtpauth |
false |
Anmeldung am SMTP-Server durchführen |
mail_smtpauthtype |
LOGIN |
Verfahren. Der Code kennt LOGIN, PLAIN und CRAM-MD5 |
mail_smtpname |
leer | Benutzername für die SMTP-Anmeldung |
mail_smtppassword |
leer | Passwort für die SMTP-Anmeldung |
mail_smtpdebug |
false |
Übergibt den Server-Logger an den Transport, der SMTP-Dialog wird auf Debug-Ebene protokolliert |
mail_smtptimeout |
10 |
Ohne Wirkung — die Zeile, die den Wert setzen würde, ist in lib/private/Mail/Mailer.php auskommentiert |
mail_from_address |
nicht gesetzt | Lokalteil der Absenderadresse |
mail_domain |
nicht gesetzt | Domain der Absenderadresse; ohne Wert der Hostname des Servers |
Zum Sendemodus im Detail (Mailer::getInstance() und
Mailer::getSendMailInstance()):
smtp— Verbindung zumail_smtphost:mail_smtpport. Nach 100 Nachrichten wird die Verbindung neu aufgebaut.qmail— Aufruf von/var/qmail/bin/sendmail -bs.php,sendmailund jeder andere Wert — Aufruf von/usr/sbin/sendmail -bs. Der Modusphpbenutzt also nicht die Funktionmail()und nicht den in derphp.inieingetragenensendmail_path, auch wenn der Beschreibungstext inconfig/config.sample.phpdas nahelegt. Ohne lokal installierten MTA schlägt dieser Weg fehl.
Ergänzend gehört zu diesem Themenblock, ohne mail_-Präfix:
| Schlüssel | Vorgabe | Bedeutung |
|---|---|---|
remove_sender_display_name |
false |
Lässt den Anzeigenamen des Freigebenden aus dem Absender der Freigabemail weg. Hilft gegen Spamfilter, die „Name via owncloud.online" als Identitätsmissbrauch werten |
allow_user_to_change_mail_address |
true |
Auf false dürfen Benutzer ihre Adresse nicht mehr selbst ändern |
Absenderadresse und Antwortadresse
Die Absenderadresse baut \OCP\Util::getDefaultEmailAddress() zusammen. Jede
Stelle im Code gibt einen Standard-Lokalteil vor, den mail_from_address
überschreibt:
| Mailart | Standard-Lokalteil | Registriert in |
|---|---|---|
| Passwort zurücksetzen, Passwortänderung | lostpassword-noreply |
core/Application.php (für LostController), settings/ChangePassword/Controller.php holt ihn selbst |
| Freigabe-Einladungen | sharing-noreply |
lib/private/Share/MailNotifications.php |
| Kontoanlage, Adressbestätigung, Test-Mail | no-reply |
settings/Application.php |
| Aktivitäts-Zusammenfassungen | no-reply |
Plugin activity, lib/MailQueueHandler.php |
Den Domain-Teil liefert mail_domain, ersatzweise der Hostname des Servers.
Ergibt sich daraus keine gültige Adresse, fällt der Code auf
<lokalteil>@localhost.localdomain zurück — solche Mails werden von den
meisten Empfängerservern abgelehnt. Setzen Sie deshalb auf Produktivsystemen
mail_from_address und mail_domain immer explizit, und zwar auf eine Domain,
für die Ihr SMTP-Server versenden darf.
Die Antwortadresse wird nur bei Freigabemails gesetzt
(MailNotifications::getReplyTo()): Es ist die Adresse des Benutzers, der
freigegeben hat. Hat dieser keine Adresse hinterlegt, wird auf die
Standard-Absenderadresse mit dem Lokalteil sharing-noreply zurückgefallen —
also ebenfalls überschrieben von mail_from_address, falls gesetzt. Kalendereinladungen sind ein
Sonderfall: Dort setzt IMipPlugin den Absender der iTIP-Nachricht — je nach
Methode der Organisator oder ein antwortender Teilnehmer — sowohl als Absender-
als auch als Antwortadresse; mail_from_address greift dort nicht. Alle
übrigen Mails haben keine eigene Antwortadresse.
Testversand
Im Abschnitt E-Mail-Server steht unten das Feld Test Empfänger E-Mail Adresse, vorbelegt mit der Adresse des angemeldeten Kontos, und der Knopf E-Mail senden. Ergebnis:
- Erfolg: „E-Mail wurde verschickt".
- Fehler: „Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfe deine Einstellungen. (Fehler: …)" — in der Klammer steht die Meldung des Transports, siehe Fehlersuche.
- Ist das Feld leer — das ist der Fall, wenn beim eigenen Konto keine Adresse
hinterlegt ist —, bricht bereits
settings/js/panels/mail.jsab und zeigt die fest einprogrammierte, unübersetzte Meldung „Please provide an test receiver email". Es wird dann gar nicht erst gesendet.
Die Testmail geht mit dem Standard-Lokalteil no-reply heraus (also
no-reply@<mail_domain>, sofern mail_from_address nicht gesetzt ist), Betreff
„E-Mail-Einstellungen testen". Sie prüft damit nur den Weg vom Server
zum Mailserver, nicht die spätere Zustellbarkeit der Freigabe- und
Passwortmails.
Adressen von Benutzern setzen oder nachtragen:
# Adresse eines vorhandenen Kontos setzen
sudo -u www-data php8.4 occ user:modify benutzername email person@example.com
# Konto samt Adresse anlegen
sudo -u www-data php8.4 occ user:add --email person@example.com benutzername
Benutzer selbst pflegen ihre Adresse unter Einstellungen → Persönlich → Allgemein im Abschnitt E-Mail.
SMTP-Dialog protokollieren
Für die Fehlersuche lässt sich der gesamte SMTP-Dialog mitschreiben. Das protokolliert auch den Benutzernamen, deshalb nur kurzzeitig einschalten:
sudo -u www-data php8.4 occ config:system:set mail_smtpdebug --value true --type boolean
sudo -u www-data php8.4 occ config:system:set loglevel --value 0 --type integer
loglevel 0 ist nötig, weil der Transport auf Debug-Ebene schreibt. Danach
beides zurückstellen (loglevel auf 2, mail_smtpdebug auf false). Zum
Lesen des Protokolls siehe
Serverprotokoll und Fehlermeldungen.
Fehlersuche
| Symptom | Ursache | Abhilfe |
|---|---|---|
| „Unknown authenticator type" beim Senden | mail_smtpauth ist an, aber mail_smtpauthtype steht auf einem Wert, den der Code nicht kennt — über die Oberfläche trifft das die Auswahl NT LAN Manager, außerdem ein von Hand auf einen leeren Wert gesetzter Eintrag in config/config.php. Die Auswahl Nichts ist unkritisch: leere Werte löscht MailSettingsController::setMailSettings() aus der Konfiguration, danach greift die Code-Vorgabe LOGIN |
mail_smtpauthtype auf LOGIN, PLAIN oder CRAM-MD5 setzen; wird keine Anmeldung gebraucht, mail_smtpauth auf false |
| „TLS required but neither TLS or STARTTLS are in use." | mail_smtpsecure ist gesetzt, der Server bietet aber kein STARTTLS an (oder OpenSSL fehlt in PHP) |
Port prüfen (Klartext-Port statt Submission-Port), sonst openssl-Erweiterung nachinstallieren |
| „Unable to connect with STARTTLS." | STARTTLS wird angeboten, der TLS-Aufbau scheitert — meist wegen eines nicht vertrauenswürdigen oder auf einen anderen Namen ausgestellten Zertifikats | Zertifikatskette des Mailservers prüfen, mail_smtphost exakt auf den im Zertifikat geführten Namen setzen |
| Verbindung auf Port 465 kommt nicht zustande | Implizites TLS wird ausschließlich über den Port 465 aktiviert; die Auswahl SSL/TLS in der Oberfläche erzwingt nur Verschlüsselung, sie schaltet kein implizites TLS ein |
Für SMTPS mail_smtpport auf 465 setzen, für Submission mit STARTTLS auf 587 |
| Verschlüsselung angeblich aus, Verbindung ist trotzdem TLS | Ist mail_smtpsecure leer, wird STARTTLS trotzdem benutzt, sobald der Server es anbietet — der leere Wert erzwingt es nur nicht |
Kein Handlungsbedarf; erzwingen lässt sich TLS mit mail_smtpsecure |
| „Connection could not be established with host …" | Falscher Host oder Port, oder eine Firewall blockt ausgehendes SMTP | Erreichbarkeit vom Server aus prüfen; nicht Host und Port zusammen in mail_smtphost schreiben — der Code hängt mail_smtpport immer an und erzeugt sonst host:24:25 |
| Versand hängt lange, bevor er abbricht | mail_smtptimeout wirkt nicht; maßgeblich ist default_socket_timeout aus der php.ini (Vorgabe 60 Sekunden) |
default_socket_timeout in der php.ini von FPM und CLI anpassen |
| Nur der Weg über die Oberfläche funktioniert, Aktivitäts- und Benachrichtigungsmails bleiben aus | Der Versand hängt am Hintergrund-Job | Cron prüfen, siehe Hintergrund-Jobs (Cron) |
| Kein Zurücksetzen des Passworts möglich | Das Konto hat keine Adresse. Im Log steht „Could not send reset email because there is no email address for this username." | Adresse mit occ user:modify … email … nachtragen |
| Zweite Reset-Mail kommt nicht an | Innerhalb von fünf Minuten wird keine weitere verschickt („The email is not sent because a password reset email was sent recently.") | Warten, nicht mehrfach anfordern |
| Benutzer können Links nicht per Mail verschicken | App-Einstellung shareapi_allow_public_notification steht auf no |
Einstellungen → Administration → Teilen, Haken bei „Benutzern erlauben, E-Mail-Benachrichtigungen für freigegebene Dateien zu senden" |
| Mails landen im Spam oder werden abgewiesen | Absenderadresse passt nicht zur versendenden Domain, oder der Anzeigename im Absender stört den Filter | mail_from_address und mail_domain auf die eigene Domain setzen, SPF/DKIM dort pflegen, notfalls remove_sender_display_name auf true |
| Änderungen in der Oberfläche werden nicht übernommen | config_is_read_only ist gesetzt |
Werte direkt in config/config.php pflegen, im Cluster auf allen Knoten |
Bleibt die Ursache unklar, den SMTP-Dialog wie oben beschrieben mitschreiben — darin steht die Antwort des Mailservers im Klartext.