E-Mail-Antworten
Wenn ein Admin im Admin-Panel aus einer Unterhaltung heraus an eine Veranstalter:in oder eine Familie schreibt, verschickt fepli die Nachricht per E-Mail. Sind E-Mail-Antworten eingerichtet, antwortet die Empfänger:in, indem sie auf diese E-Mail antwortet: fepli empfängt die Antwort über Brevo und fügt sie der Unterhaltung als Kommentar mit dem Kanal email hinzu. Ohne Einrichtung gehen Antworten an die Antwortadresse der Organisation, wie bei jeder anderen E-Mail von fepli.
Diese Seite richtet sich an Integrator:innen, die das fepli-Image betreiben. Wenn fepli Ihre Instanz hostet, ergänzen Sie nur DNS-Einträge: siehe Instanzen, die fepli hostet.
Wie eine Antwort zurückkommt
- Nur die E-Mail Nachricht aus einer Unterhaltung erhält eine eigene Antwortadresse, z. B.
kommentar+0192d0e83a4b7c5d9e6f7a8b9c0d1e07.4f2a9c1e0b7d3a65@reply.example.fepli.eu. Der Teil nach dem+benennt die Nachricht, signiert mitAPP_SECRET. Die Domain ist die Antwortdomain der Organisation. Jede andere E-Mail behält ihre gewohnte Antwortadresse. - Die MX-Einträge der Antwortdomain liefern die Antwort an Brevo aus.
- Brevo sendet sie per POST an den Webhook, der für diese Domain registriert ist, auf der eigenen Domain der Organisation:
https://example.fepli.eu/webhook/brevo_inbound?secret=…. - fepli prüft das Geheimnis in der URL und die Signatur in der Adresse, behält den neuen Text ohne die zitierte E-Mail und fügt ihn der Unterhaltung hinzu. Gehört die Adresse des Absenders zu einem Konto, ordnet fepli die Antwort diesem Konto zu, sonst nennt es den Namen des Absenders. Admins erhalten im Admin-Panel eine Benachrichtigung.
Brevo sendet jede Antwort für eine Domain an einen Webhook, und fepli behandelt eine Webhook-Anfrage für den Mandanten, an dessen Domain sie eingeht. In einer Installation mit mehreren Mandanten hat deshalb jeder Mandant eine eigene Antwortdomain und einen eigenen Webhook.
Wenn Sie APP_SECRET ändern, ändern sich auch die Signaturen. Antworten
auf E-Mails, die vor der Änderung verschickt wurden, erreichen fepli dann
nicht mehr.
In Ihrer Installation einrichten
Sie brauchen:
- Ein Brevo-Konto und einen API-Schlüssel dafür. Brevo empfängt nur die Antworten: fepli verschickt seine E-Mails weiterhin über den Server in
MAILER_DSN. - Eine Antwortdomain, z. B.
reply.example.fepli.eu, in einer DNS-Zone, die Sie verwalten: eine für die Installation oder, bei mehreren Mandanten, eine pro Mandant. Sie muss sich von der Domain unterscheiden, von der fepli sendet, und sonst darf nichts E-Mails für sie empfangen. - Domains, die Brevo über HTTPS erreichen kann: Der Webhook liegt auf der eigenen Domain des Mandanten oder, in einer Installation mit einem Mandanten, auf der Domain in
APP_BASE_URL.
1. Die Antwortdomain bei Brevo verifizieren
Brevo empfängt E-Mails nur für Domains, die es verifiziert hat. Fügen Sie die Antwortdomain in Brevo unter Senders, Domains & IPs → Domains hinzu und tragen Sie die Einträge, die Brevo dafür nennt, in Ihre DNS-Zone ein. Die Einträge erklärt die Hilfe von Brevo.
2. Die MX-Einträge auf Brevo ausrichten
Jede Antwort geht an eine eigene Adresse unter der Antwortdomain, deshalb muss die ganze Domain an Brevo ausliefern:
| Host | Typ | Priorität | Wert |
|---|---|---|---|
reply.example.fepli.eu | MX | 10 | inbound1.sendinblue.com. |
reply.example.fepli.eu | MX | 20 | inbound2.sendinblue.com. |
DNS-Änderungen können Stunden brauchen, bis sie sich verbreiten. Tragen Sie die Einträge deshalb früh ein.
3. fepli konfigurieren
Setzen Sie diese Variablen, in derselben env-Datei für Web, Worker und Cron, und starten Sie die Container neu. Der Worker schreibt die Antwortadresse in die E-Mails, der Web-Container empfängt die Antworten.
- Name
INBOUND_SECRET- Typ
- string
- Beschreibung
Ein Geheimnis, das die Webhooks schützt: fepli weist Anfragen, deren URL es nicht enthält, mit
403ab. Erzeugen Sie es mitopenssl rand -hex 32. Leer schaltet E-Mail-Antworten für jeden Mandanten aus.
- Name
INBOUND_DOMAIN- Typ
- host
- Beschreibung
Die Antwortdomain, nur bei einer Installation mit einem Mandanten, z. B.
reply.example.fepli.eu. Leer schaltet E-Mail-Antworten aus. Eine Installation mit mehreren Mandanten ignoriert sie.
- Name
BREVO_API_KEY- Typ
- string
- Beschreibung
Der API-Schlüssel Ihres Brevo-Kontos. fepli registriert damit die Webhooks und lädt damit Anhänge herunter. Derselbe Schlüssel verschickt die Textnachrichten jedes Mandanten, über den Schlüssel, den Admins im Admin-Panel hinterlegen (siehe Optionale Variablen).
In einer Installation mit mehreren Mandanten trägt jeder Mandant seine Antwortdomain im Admin-Panel ein, als Einstellung Empfangsdomain der App Antworten per E-Mail. Seine Super-Admins tun das unter Einstellungen → App-Store, wenn sie die App einschalten. fepli lehnt eine Domain ab, die ein Mandant bedient oder von der er sendet, und eine, an der ein anderer Mandant schon Antworten empfängt. Eine Antwortdomain beantwortet keine Anfrage und gehört deshalb nicht in TRUSTED_HOSTS.
Frühere Versionen nahmen die Antwortdomain als Mandanten-Domain mit dem Zweck E-Mail-Empfang. Eine Migration verschiebt jede davon in die Einstellungen ihres Mandanten und löscht die Domain. Ein Mandant, der nie eine Einstellung gespeichert hat, hat keinen Ort, an dem sie bleiben kann: Die Ausgabe der Migration nennt diese Domain, und der Mandant trägt sie erneut ein.
4. Die Webhooks registrieren
In einer Installation mit mehreren Mandanten registriert die App Antworten per E-Mail den Webhook ihres Mandanten selbst: wenn ein Super-Admin sie einschaltet oder die Empfangsdomain speichert. Einen Webhook, den Brevo noch für eine frühere Antwortdomain hat, ersetzt sie dabei. Nimmt Brevo den Webhook nicht an, z. B. weil Brevo nicht antwortet oder APP_BASE_URL keine öffentliche HTTPS-Adresse ist, speichert die App trotzdem und zeigt einen Hinweis; Einrichtung prüfen in der App zeigt, was fehlt. Schaltet der Mandant die App aus, bleibt der Webhook bestehen, damit Antworten auf früher verschickte E-Mails weiter ankommen.
In einer Installation mit einem Mandanten, und für alles, was die App nicht registrieren konnte, gibt es den Befehl brevo:inbound. Prüfen Sie zuerst, was fepli an Brevo senden würde, und registrieren Sie dann die Webhooks:
docker compose exec web php bin/console brevo:inbound --dry-run
docker compose exec web php bin/console brevo:inbound
App und Befehl legen pro Antwortdomain einen Webhook im Brevo-Konto von BREVO_API_KEY an:
| Feld | Wert |
|---|---|
| type | inbound |
| events | inboundEmailProcessed |
| domain | die Antwortdomain |
| url | https://example.fepli.eu/webhook/brevo_inbound?secret=<INBOUND_SECRET>, auf der eigenen Domain der Organisation |
- In einer Installation mit mehreren Mandanten registriert der Befehl für jeden Mandanten, der eine Antwortdomain eingetragen hat, einen Webhook, auf der eigenen Domain dieses Mandanten. Er liest die Domain aus der Einstellung der App, wie die App selbst. Mandanten, die offline sind, überspringt er. Mit
--tenant=<slug>registriert er nur den Webhook dieses Mandanten. - fepli beantwortet den Webhook eines Mandanten auf jeder Domain, die es für den Mandanten ausliefert, auch auf einer, die nur das Admin-Panel ausliefert. Eine Antwort, die an die Plattform-Konsole gesendet wird, verwirft fepli: Sie gehört dort zu keinem Mandanten.
- In einer Installation mit einem Mandanten liegt der Webhook auf der Domain in
APP_BASE_URL. - Wenn Sie den Befehl erneut ausführen, ändert er nichts, solange ein Webhook existiert.
--forcelöscht ihn und legt ihn neu an. - Hat Brevo den Webhook für eine andere Antwortdomain gespeichert, z. B. weil der Mandant seine Domain gewechselt hat, meldet der Befehl das. Führen Sie ihn für diesen Mandanten erneut mit
--forceaus. Die App ersetzt einen solchen Webhook von selbst, wenn der Mandant die Domain speichert. - Er überspringt den Webhook mit einer Warnung, solange
INBOUND_SECRETleer ist oder die Antwortdomain fehlt. - Liegt fepli hinter HTTP Basic Auth, ergänzen Sie
--auth=user:pass. Brevo sendet die Zugangsdaten dann in der URL. Die App kennt die Zugangsdaten nicht: Führen Sie den Befehl mit--authund--forceaus, nachdem der Mandant die App eingeschaltet hat. - Nachdem Sie
INBOUND_SECRETgeändert haben, führen Sie den Befehl erneut aus. Er legt Webhooks mit dem neuen Geheimnis an; löschen Sie die mit dem alten Geheimnis in Brevo unter Webhooks. - Den Webhook für Zustellberichte registriert ein eigener Befehl,
brevo:engagement.
Sie können einen Webhook auch von Hand in Brevo unter Webhooks anlegen, mit denselben Werten.
5. Im Admin-Panel einschalten
Sobald INBOUND_SECRET gesetzt ist, finden Super-Admins im Admin-Panel unter Einstellungen → Allgemein → E-Mail die Option Antworten im System empfangen und, bei mehreren Mandanten, unter Einstellungen → App-Store die App Antworten per E-Mail. In einer Installation mit einem Mandanten braucht es dafür auch INBOUND_DOMAIN. Die Option ist standardmäßig eingeschaltet. Hat ein Mandant sie eingeschaltet, aber keine Antwortdomain eingetragen, sieht er einen Hinweis, dass er eine braucht. Das Handbuch beschreibt die Einstellung.
Im Seitenfenster der App prüft Einrichtung prüfen, was der Mandant gespeichert hat: ob eine Domain eingetragen ist, ob ihre MX-Einträge auf inbound1.sendinblue.com und inbound2.sendinblue.com zeigen und auf nichts sonst, und ob Brevo einen Inbound-Webhook für diese Domain hält, der an einen Host des Mandanten sendet. Sie prüft nur. Den Webhook registriert weiterhin der Befehl aus Schritt 4. Das Handbuch nennt die Meldungen.
In einer Installation mit mehreren Mandanten zeigt die Plattform-Konsole unter Installation → Systemwerte bei Eingang für Antworten, wie viele Mandanten eine Antwortdomain haben.
Instanzen, die fepli hostet
fepli betreibt das Brevo-Konto und registriert die Webhooks. Ihr Teil ist das DNS Ihrer Domains:
- Die Domain, von der Sie senden, also die Domain Ihrer Absenderadresse unter Einstellungen → Allgemein → E-Mail. Brevo sendet nur von Domains, die es verifiziert hat. Ihre Einträge, ein Brevo-Code, DKIM und DMARC, gehören zum Brevo-Konto, das sendet, und das ist das von fepli.
- Eine Antwortdomain, auf einem von zwei Wegen:
- eine eigene Subdomain, z. B.
reply.vor Ihrer Domain. Brevo verifiziert sie mit denselben Arten von Einträgen, und sie erhält die beiden MX-Einträge aus Schritt 2. Tragen Sie sie als Empfangsdomain in der App Antworten per E-Mail unter Einstellungen → App-Store ein. - eine Subdomain, die fepli für Sie betreibt, z. B.
reply.elmsbrueck.fepli.eu. Das fepli-Team richtet sie ein, und Sie tragen dafür keine Einträge ein.
- eine eigene Subdomain, z. B.
Die Einträge für Ihre Domains oder eine Subdomain von fepli erhalten Sie, wenn Sie an support@fepli.de schreiben. Antworten kommen an, sobald die Einträge gesetzt sind und fepli den Webhook für Ihre Antwortdomain registriert hat.
Anhänge
Antworten können Dateien enthalten, z. B. ein unterschriebenes Formular. fepli lädt sie von Brevo herunter, prüft sie und speichert sie bei den übrigen Uploads: im Volume storage oder, wenn Sie einen Objektspeicher konfigurieren, im Bucket für Dateien. Admins laden sie aus der Unterhaltung herunter; der Browser zeigt sie nie an.
- Höchstens 10 Dateien pro Antwort, jede bis 15 MB.
- PDF, JPEG, PNG, GIF, WebP, HEIC, TXT, CSV, DOC, XLS, PPT, DOCX, XLSX, PPTX, ODT und ODS. Der Inhalt einer Datei muss zu ihrer Endung passen.
- fepli verwirft jede andere Datei und protokolliert das. Die Antwort selbst kommt trotzdem an.
Die Dateien enthalten, was Familien und Veranstalter:innen gesendet haben: Nehmen Sie sie in Ihre Backups auf.
Wenn Antworten nicht ankommen
Jede Anfrage an einen Webhook hinterlässt eine Zeile im Log des Web-Containers, docker compose logs web: Webhook accepted oder Webhook rejected, mit dem Status.
| Was Sie sehen | Ursache |
|---|---|
| Das Admin-Panel zeigt Antworten im System empfangen nicht. | INBOUND_SECRET ist im Web-Container leer oder, in einer Installation mit einem Mandanten, INBOUND_DOMAIN. |
| Antworten im System empfangen zeigt einen Hinweis statt der Antwortadresse. | Der Mandant hat in der App Antworten per E-Mail keine Empfangsdomain eingetragen. |
Die E-Mail trägt die Antwortadresse der Organisation, keine kommentar+…. | Antworten im System empfangen ist ausgeschaltet, der Mandant hat keine Antwortdomain oder dem Worker fehlen die Variablen. |
| Keine Webhook-Zeile im Log. | Brevo empfängt die Antworten nicht oder leitet sie nicht weiter: Die MX-Einträge sind noch nicht gesetzt, die Antwortdomain ist nicht verifiziert oder ihr Webhook ist nicht registriert. |
Webhook rejected mit 403. | Das Geheimnis in der URL des Webhooks ist nicht INBOUND_SECRET. Registrieren Sie den Webhook erneut. |
Inbound reply rejected: no conversation for token. | Der Webhook für diese Antwortdomain zeigt auf die Domain eines anderen Mandanten, z. B. nachdem die Domain zu einem anderen Mandanten gewechselt ist. Führen Sie den Befehl mit --force aus. Möglich ist auch, dass die Nachricht gelöscht wurde. |
Inbound reply rejected: invalid or expired token. | Die Antwort bezieht sich auf eine E-Mail, die vor einer Änderung von APP_SECRET verschickt wurde, oder die Antwortadresse wurde unterwegs verändert. |