Ergebnis 1 bis 8 von 8

Thema: Asynchroner Mailversand in Contao 5.3.10+ mit rate limit

  1. #1
    Contao-Nutzer
    Registriert seit
    07.05.2012.
    Beiträge
    19

    Standard Asynchroner Mailversand in Contao 5.3.10+ mit rate limit

    Hallo Community,

    seit Contao 4.13.x nutze ich in einem Projekt den asynchronen Mailversand über den Symfony Messenger (in Kombination mit dem Notification Center). Ich scheitere derzeit daran, den asynchronen Mailversand mit den seit Contao 5.3.10 verfügbaren Umstellungen zu nutzen. Auch nach mehrfachem Studium der Dokumentation hier und hier gelingt es mir nicht, ein funktionierendes Setup unter Contao 5.3.26 zu konfigurieren. Insbesondere unklar ist für mich auch nach dem Lesen der Doku, wie ich die neuen Contao Transports "contao_prio_high", "contao_prio_normal" und "contao_prio_low" tatsächlich einsetze.

    Mit meiner früheren Konfiguration in der config.yml

    Code:
    framework:
    	messenger:
    		transports:
    			async: 'doctrine://default'
    		routing:
    			'Symfony\Component\Mailer\Messenger\SendEmailMessage': async
    	mailer:
    		transports:
    			application: smtp://[url-encoded smtp-info]
    			email: smtp://[url-encoded smtp-info]
    
    contao:
    	mailer:
    		transports:
    			email: ~
    			email:
    				from: Absender <info@info.de>
    in Kombination mit einem Cronjob auf

    Code:
    path/to/contao/vendor/bin/contao-console messenger:consume --limit=10 --time-limit=10
    hat das soweit fehlerfrei funktioniert. Aktuell spricht die Doku aber davon, dass der asynchrone Mailversand mit Symfony Messenger erst ab Contao 5.5 zur Verfügung steht. Gleichzeitig spricht die Entwickler-Doku davon, dass die Funktion ab Contao 5.3.10 überarbeitet wurde. Ich würde mich freuen, wenn mich in diesem Thema jemand in die Richtige Richtung drehen könnte.

    Meine bisherigen Konfigurationsversuche von config.yml und env.local unter Contao 5.3.26 führen bisher zu keinem Ergebnis. Mein Ziel ist ein funktionierender asynchroner Mailversand, gesteuert über einen eigenen Cronjob oder über einen (echten) Contao-Cron, unter Verwendung des Notification Centers und Symfony Messenger.

    Vielen Dank für jeden einzelnen Tipp!

    Heiner
    Geändert von Heiner (02.03.2025 um 21:28 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.191
    Partner-ID
    10107

    Standard

    Das mit 5.5 ist ein Fehler in der Dokumentation.

    Unabhängig davon: in Contao 5.3+ werden Emails von Haus aus asynchron gesendet, du musst das nicht mehr eigens konfigurieren. Du musst nur einen echten Cronjob einrichten und sonst nichts.
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    07.05.2012.
    Beiträge
    19

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das mit 5.5 ist ein Fehler in der Dokumentation.

    Unabhängig davon: in Contao 5.3+ werden Emails von Haus aus asynchron gesendet, du musst das nicht mehr eigens konfigurieren. Du musst nur einen echten Cronjob einrichten und sonst nichts.
    Hallo Spooky,

    tausend Dank für Deine Antwort! Genau das "du musst das nicht mehr eigens konfigurieren" macht mir in Kombination mit der aktuellen Doku einen kompletten Knoten ins Hirn, das hatte ich auch schon an anderer Stelle gelesen. D.h. ich brauche
    • NICHT den Symfony Messenger zu installieren?
    • KEINE Konfiguration von messenger.transports in der config.yml?
    • NUR die Angabe der MAILER_DSN in der env.local und die contao.mailer.transports in der config.yml?

    Kann ich dann in Kombination mit einem echten Contao-Cronjob "einfach" über die config.yml Einfluss auf contao.messenger.workers und die Sendelimits nehmen, oder wo ist dafür die richtige Stelle, nachdem ich keinen eigenen Cronjob mit messenger:consume mehr steuern kann?

    Liebe Grüße,
    Heiner

  4. #4
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.190
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das mit 5.5 ist ein Fehler in der Dokumentation.

    Unabhängig davon: in Contao 5.3+ werden Emails von Haus aus asynchron gesendet, du musst das nicht mehr eigens konfigurieren. Du musst nur einen echten Cronjob einrichten und sonst nichts.
    Bedeutet, dass in dem blauen Kasten in https://docs.contao.org/manual/de/sy...symfony-mailer stehen müsste


    Ab Contao 5.3 werden E-Mails immer asynchron versendet, sofern ein echter Cronjob eingerichtet ist. Die hier aufgeführten Einstellungen sind dann nicht mehr notwendig.


    oder? @spooky

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.191
    Partner-ID
    10107

    Standard

    Zitat Zitat von Heiner Beitrag anzeigen
    • NICHT den Symfony Messenger zu installieren?
    • KEINE Konfiguration von messenger.transports in der config.yml?
    Korrekt, ja.


    Zitat Zitat von Heiner Beitrag anzeigen
    • NUR die Angabe der MAILER_DSN in der env.local und die contao.mailer.transports in der config.yml?
    In deiner aktuellen Konfiguration nutzt du MAILER_DSN gar nicht, insofern ist diese Umgebungsvariable für dich momentan auch irrelevant.


    Zitat Zitat von Heiner Beitrag anzeigen
    Kann ich dann in Kombination mit einem echten Contao-Cronjob "einfach" über die config.yml Einfluss auf contao.messenger.workers und die Sendelimits nehmen, oder wo ist dafür die richtige Stelle, nachdem ich keinen eigenen Cronjob mit messenger:consume mehr steuern kann?
    Wenn du rate limiting brauchst wird es etwas komplizierter. Siehe dazu auch die Diskussion hier auf Github: https://github.com/contao/contao/issues/7495
    » sponsor me via GitHub or Revolut

  6. #6
    Contao-Nutzer
    Registriert seit
    07.05.2012.
    Beiträge
    19

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Korrekt, ja.
    In deiner aktuellen Konfiguration nutzt du MAILER_DSN gar nicht, insofern ist diese Umgebungsvariable für dich momentan auch irrelevant.
    Wenn du rate limiting brauchst wird es etwas komplizierter. Siehe dazu auch die Diskussion hier auf Github: https://github.com/contao/contao/issues/7495
    Hallo Spooky,

    nochmals vielen Dank – langsam wird das klarer, alleine mit der aktuellen Doku habe ich das nicht hinbekommen. Das Dilemma mit dem rate limiting auf dem contao_prio_high Worker kann ich nachvollziehen, allerdings ist es in Umgebungen, die ein restriktives rate limit benötigen ja zumindest m.M.n. diskutabel zweitrangig, welche Prio die Nachricht hat – Hauptsache das Limit wird nicht überschritten.

    Wenn ich das alles richtig verstanden habe, kann ich mit der folgenden beispielhaften config.yml
    • den gesamten Mailverkehr auf den einen neuen "mailer"-Transport umleiten, und
    • dem "mailer"-Transport ein rate limit von 20 Nachrichten alle 15 Minuten zuordnen?


    Code:
    # config/config.yaml
    framework:
        rate_limiter:
            mailer:
                policy: fixed_window
                limit: 20
                interval: 15 minutes
        messenger:
            transports:
                mailer: 
                    dsn: doctrine://default?table_name=tl_message_queue&queue_name=mailer&auto_setup=false
                    rate_limiter: mailer
            routing:
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': mailer
        mailer:
            transports:
                email: '%env(MAILER_DSN)%'
    
    contao:
        localconfig:
            disableCron: true
        mailer:
            transports:
                email: ~
                email:
                    from: Test <test@domain.de>
        messenger:
            workers:
                 -
                    transports:
                        - contao_prio_high
                    options:
                        - '--time-limit=60'
                        - '--sleep=5'
                    autoscale:
                        desired_size: 5
                        max: 10
                        enabled: true
                -
                    transports:
                        - contao_prio_normal
                    options:
                        - '--time-limit=60'
                        - '--sleep=10'
                    autoscale:
                        desired_size: 10
                        max: 10
                        enabled: true
                -
                    transports:
                        - contao_prio_low
                    options:
                        - '--time-limit=60'
                        - '--sleep=20'
                    autoscale:
                        desired_size: 20
                        max: 10
                        enabled: true
               -
                    transports:
                        - mailer
                    options:
                        - '--time-limit=60'
                        - '--sleep=20'
                    autoscale:
                        desired_size: 5
                        max: 10
                        enabled: true
    Noch nicht ganz sicher bin ich mir, ob das eingestellte Limit so tatsächlich greift, und ob der minütliche echte Cronjob auf "contao:cron" das jetzt auch so steuert... Aber das teste ich jetzt mal noch in Ruhe. Zusatzfrage, auch falls das ggf. nochmal jemand braucht: kann ich entsprechend mit der folgenden config.yml das rate limit für den contao_prio_high Worker aktivieren, ohne den zusätzlichen "mailer"-Transport anzulegen?

    Code:
    # config/config.yaml
    framework:
        rate_limiter:
            mailer:
                policy: fixed_window
                limit: 20
                interval: 15 minutes
        messenger:
            transports:
                contao_prio_high: 
                    dsn: doctrine://default?table_name=tl_message_queue&queue_name=prio_high&auto_setup=false
                    rate_limiter: mailer
            routing:
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': contao_prio_high
        mailer:
            transports:
                email: '%env(MAILER_DSN)%'
    
    contao:
        localconfig:
            disableCron: true
        mailer:
            transports:
                email: ~
                email:
                    from: Test <test@domain.de>
        messenger:
            workers:
                -
                    transports:
                        - contao_prio_high
                    options:
                        - '--time-limit=60'
                        - '--sleep=5'
                    autoscale:
                        desired_size: 5
                        max: 10
                        enabled: true
                -
                    transports:
                        - contao_prio_normal
                    options:
                        - '--time-limit=60'
                        - '--sleep=10'
                    autoscale:
                        desired_size: 10
                        max: 10
                        enabled: true
                -
                    transports:
                        - contao_prio_low
                    options:
                        - '--time-limit=60'
                        - '--sleep=20'
                    autoscale:
                        desired_size: 20
                        max: 10
                        enabled: true
    Vielen Dank im Voraus –
    Liebe Grüße,
    Heiner


    Edit:
    Nach ausführlicheren Tests glaube ich jetzt zu wissen, dass der contao_prio_high Worker die Nachrichten sofort und m.E. ohne auf einen Cronjob zu lauschen umgehend versendet, und auch nicht auf ein rate limit hört. Ich denke, mit der folgenden Lösung habe ich mein Ziel soweit erreicht. Ein neuer Transport, der allen Mailverkehr übernimmt und per rate_limiter eingebremst wird:

    Code:
    # config/config.yaml
    framework:
        rate_limiter:
            limited_mailer:
                policy: fixed_window
                limit: 20
                interval: 15 minutes
        messenger:
            transports:
                limited_mailer: 
                    dsn: doctrine://default?table_name=tl_message_queue&queue_name=limited_mailer&auto_setup=false
                    rate_limiter: limited_mailer
            routing:
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': limited_mailer
        mailer:
            transports:
                email: '%env(MAILER_DSN)%'
    
    contao:
        localconfig:
            disableCron: true
        messenger:
            workers:
                -
                    transports:
                        - limited_mailer
                    options:
                        - '--time-limit=60'
                        - '--sleep=20'
                    autoscale:
                        desired_size: 5
                        max: 10
                        enabled: true
        mailer:
            transports:
                email: ~
                email:
                    from: Test <test@domain.de>
    Vielen Dank nochmals für den entscheidenden Tipp, @Spooky!
    Geändert von Heiner (03.03.2025 um 09:17 Uhr)

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.191
    Partner-ID
    10107
    » sponsor me via GitHub or Revolut

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.191
    Partner-ID
    10107

    Standard

    Zitat Zitat von Heiner Beitrag anzeigen
    Edit:
    Nach ausführlicheren Tests glaube ich jetzt zu wissen, dass der contao_prio_high Worker die Nachrichten sofort und m.E. ohne auf einen Cronjob zu lauschen umgehend versendet, und auch nicht auf ein rate limit hört.
    Nein, das sollte - by default - nicht so sein.
    » sponsor me via GitHub or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •