Newsletter Management: Installation und Betrieb
Installation des Newsletter-Management-Plugins für Sylius per Composer, Setup-Command, Update, Cronjobs für Versand und Bereinigung, eigener Mailer-Transport und Deinstallation
Newsletter Management: Installation und Betrieb
Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.
Installation
Composer (Packeton)
Hinweis: Das Repository ist privat und wird über Packeton verwaltet (
https://packeton.markus-michalski.net). Zugangsdaten bekommst du nach dem Lizenzkauf.
Packeton als Repository in der composer.json deines Shops eintragen:
{ "repositories": [{ "type": "composer", "url": "https://packeton.markus-michalski.net" }] }
Dann das Plugin installieren:
composer require mmd/sylius-newsletter-management-plugin
Danach, in genau dieser Reihenfolge:
-
Bundle registrieren in
config/bundles.php:Mmd\SyliusNewsletterManagementPlugin\MmdSyliusNewsletterManagementPlugin::class => ['all' => true], -
Routen importieren, zum Beispiel in
config/routes/mmd_newsletter_management.yaml:mmd_sylius_newsletter_management_admin: resource: "@MmdSyliusNewsletterManagementPlugin/config/routes/admin.yaml" mmd_sylius_newsletter_management_shop: resource: "@MmdSyliusNewsletterManagementPlugin/config/routes/shop.yaml"Die Admin-Routen hängen am Parameter
sylius_admin.path_name, einen eigenen Präfix brauchst du nicht. -
Setup-Command ausführen:
bin/console mmd:newsletter-management:setup
Grids, Twig Hooks und das Mail-Template registrieren sich selbst, das Plugin bringt keine Assets mit, die du installieren müsstest. Ein assets:install ist deshalb nicht nötig.
Der Setup-Command
mmd:newsletter-management:setup ersetzt doctrine:migrations:migrate und tut Folgendes:
- Er führt nur die noch offenen Migrationen dieses Plugins aus, nichts von deiner App oder von anderen Plugins.
- Er ist idempotent: Gibt es keine neue Migration, passiert nichts. Du kannst ihn nach jedem
composer updategefahrlos erneut ausführen. Als einzige Quelle dient die Tabelledoctrine_migration_versions, deshalb bemerkt er auch eine Migration, die nach einem Datenbank-Restore fehlt. - Er prüft, ob die Routen aus Schritt 2 importiert sind, und gibt andernfalls den Snippet aus. In
config/schreibt er nie. - Er bricht ab, wenn Migrationen aus dem Sylius-Core noch offen sind, mit dem Hinweis, zuerst
bin/console doctrine:migrations:migrateauszuführen. - Er fragt interaktiv um Bestätigung. In Skripten nutzt du
--no-interaction. - Führe ihn als derselbe User aus wie deine übrigen Console-Commands.
Auch
bin/console doctrine:migrations:migratefunktioniert, führt aber alle offenen Migrationen deines Projekts aus, nicht nur die dieses Plugins.
Erste Schritte nach der Installation
- Im Admin zu MMKreativ Plugins → Newsletterverwaltung gehen.
- Für jeden Channel, der einen Newsletter anbieten soll, eine Konfiguration anlegen und aktivieren.
Ein Channel ohne aktivierte Konfiguration bietet keine Anmeldung an:
/newsletterund die Shop API antworten mit 404, es gibt kein Footer-Formular, und die Newsletter-Checkbox des Sylius-Cores bleibt unangetastet.
Die Einstellungen im Detail stehen unter Konfiguration.
Optional kannst du die Farben des Bestätigungs-Buttons in den Mails an dein Theme anpassen:
# config/packages/mmd_sylius_newsletter_management.yaml
mmd_sylius_newsletter_management:
email:
button_color: '#1663CC'
button_text_color: '#ffffff'
Ohne diese Angabe gelten #1abb9c (Button) und #ffffff (Text). Beide Werte müssen Hex-Farben sein.
Update
composer update mmd/sylius-newsletter-management-plugin
bin/console mmd:newsletter-management:setup
bin/console cache:clear
Der Setup-Command ist idempotent und führt nur neue Migrationen aus.
Cronjobs
Newsletter werden von einem Console-Command verschickt, nicht innerhalb der Admin-Anfrage.
Ohne den Cronjob für
mmd:newsletter:sendgeht kein Newsletter hinaus: „Jetzt senden" und „Planen" im Admin stellen den Versand nur in die Warteschlange.
| Command | Intervall | Beschreibung |
|---|---|---|
mmd:newsletter:send |
jede Minute | Startet fällige geplante Newsletter und versendet danach ein Paket ausstehender Mails |
mmd:newsletter:subscription:purge |
täglich | Löscht abgemeldete und nie bestätigte Abos nach Ablauf der Fristen des Channels |
mmd:newsletter:tracking:purge |
täglich | Löscht anonyme Tracking-Zähler und personenbezogene Tracking-Ereignisse nach Ablauf der Fristen des Channels |
Optionen:
| Command | Option | Standard | Beschreibung |
|---|---|---|---|
mmd:newsletter:send |
--limit |
100 |
Höchstzahl der Mails pro Lauf; bleibe unter dem Mail-Limit deines Hosters |
mmd:newsletter:send |
--delay-ms |
0 |
Pause zwischen zwei Mails in Millisekunden |
mmd:newsletter:subscription:purge |
--older-than |
Frist des Channels | Überschreibt beide Fristen (abgemeldet und unbestätigt) für alle Channels mit dieser Anzahl Tage |
mmd:newsletter:tracking:purge |
--older-than |
Frist des Channels | Überschreibt beide Fristen (anonym und personenbezogen) für alle Channels mit dieser Anzahl Tage |
Beispiel für die Crontab:
* * * * * cd /pfad/zum/shop && php bin/console mmd:newsletter:send --limit=100
15 3 * * * cd /pfad/zum/shop && php bin/console mmd:newsletter:subscription:purge
20 3 * * * cd /pfad/zum/shop && php bin/console mmd:newsletter:tracking:purge
Überlappende Läufe von mmd:newsletter:send sind sicher: Jede Zustellung wird atomar reserviert, und eine Reservierung, die ein abgestürzter Lauf nie beendet hat, wird nach 15 Minuten wieder freigegeben. Warum das Plugin Messenger nicht nutzt, steht unter Technische Details.
Die Aufbewahrungsfristen selbst stellst du pro Channel ein, siehe Konfiguration und Tracking und Statistiken.
Eigener Mailer-Transport
Empfohlen: In den Newsletter-Einstellungen des Channels nennt das Feld Mailer-Transport für Newsletter den Namen eines Symfony-Mailer-Transports aus framework.mailer.transports. So kann Massenversand weder den Transport deiner Shop-Mails (Bestellungen, Passwort-Reset) auslasten noch dessen Ruf beschädigen. Leer bedeutet: Standard-Transport. Die Absenderadresse muss zu SPF und DKIM dieses Transports passen.
Deinstallation
Reihenfolge einhalten, damit die Migrationen bei noch registriertem Bundle zurückgerollt werden:
-
Eigene Template-Overrides des Plugins entfernen (
templates/bundles/MmdSyliusNewsletterManagementPlugin/, falls vorhanden) sowie eigene Aufrufe seiner Twig-Funktionen und Hooks. -
Migrationen zurückrollen, pro Version einzeln, neueste zuerst. Das löscht alle Newsletter-Tabellen samt Abonnenten:
bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20261001110000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20261001100000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930170000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930160000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930150000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930140000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930130000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930120000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930110000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260930100000' bin/console doctrine:migrations:execute --down 'Mmd\SyliusNewsletterManagementPlugin\Migrations\Version20260929094744' -
Routen-Import (
config/routes/mmd_newsletter_management.yaml), Bundle-Eintrag inconfig/bundles.phpund gegebenenfallsconfig/packages/mmd_sylius_newsletter_management.yamlentfernen. -
Plugin entfernen:
composer remove mmd/sylius-newsletter-management-plugin
Beim Zurückrollen werden Abonnenten, Newsletter, Zustellprotokoll und Tracking-Daten unwiderruflich gelöscht. Exportiere vorher die Abonnentenliste als CSV und sichere die Datenbank.