Ergebnis 1 bis 15 von 15

Thema: Mailverlust bei asynchronem Mailversand mit größeren Anhängen

  1. #1
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard Mailverlust bei asynchronem Mailversand mit größeren Anhängen

    Moin,

    ich muss über ein Formular aktuell Mails mit größeren Anhängen bis 20MB verschicken. Entsprechend große Mailanhänge sind für den Mailprovider kein Problem. Leider braucht der Versand aus Contao sehr lang, weshalb ich das gerne asynchron lösen möchte. Die Mails werden über das Notification Center verschickt. Aktuell habe ich aber den Verdacht, dass es nicht mit dem Notification-Center zusammen hängt, da die Vorverarbeitung bis zum Schreiben in die Datenbank in jedem Fall funktioniert.

    In der Dokumentation gibt es dazu den Eintrag "Asynchrone E-Mails mit Symfony Mailer".

    https://docs.contao.org/manual/de/system/einstellungen/

    Nach der Installation des symfony/messenger und der Anpassung in der config.yaml funktionieren E-Mails ohne Anhang auch wunderbar.

    Code:
    framework:
        messenger:
            transports:
                async: 'doctrine://default'
            routing:
                'Symfony\Component\Mailer\Messenger\SendEmailMessage': async
    Verschicke ich die Mails mit kleineren Anhängen funktioniert das Ganze auch wunderbar. Verschicke ich Mails mit Anhängen von knapp 10 MB verschwinden diese aber im Nirvana.

    Ich sehe in jedem Fall nach dem Abschicken einen entsprechenden Eintrag in der Tabelle "messenger_messages" meiner MySQL-Datenbank.

    Rufe ich nun folgenden Befehl auf, verschwindet der Eintrag aus der Datenbank auch wieder.

    Code:
    php vendor/bin/contao-console messenger:consume --verbose --time-limit=60 async
    Leider kommt aber nichts an. Eine Fehlermeldung erhalte ich leider nicht, auch nicht im Contao-Logfile. Auch Testmails an mail-tester.com kommen mit größeren Anhängen nicht durch.

    Hat jemand eine Idee, wo die Mails hängen geblieben sein könnten?

    Danke und
    beste Grüße
    Dennis

  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

    In Contao 5.3 brauchst diese ganze Konfiguration nicht mehr, da sind die E-Mails von Haus aus asynchron (vorausgesetzt, du hast einen echten Cronjob für contao:cron eingerichtet).
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    Hallo Spooky,

    danke für die Rückmeldung. Ich habe Contao jetzt auf einen serverseitigen Cronjob umgestellt.

    Code:
    # config/config.yaml
    
    contao:
      localconfig:
        disableCron: true
    Code:
    # Minütlicher cronjob
    
    php vendor/bin/contao-console contao:cron
    Leider gehen auch hier Mails mit größeren Dateianhängen verloren. Zum Testen habe ich parallel einen SMTP-Server aufgesetzt, auf dem ich genau sehen kann, wann Daten ankommen. Dabei fiel auf, dass Mails mit dieser Konfiguration unverzüglich verschickt werden. Wenn der Versand asynchron stattfindet, dann offenbar nicht über den Crobjob.

    Die Dateien scheinen beim Versand des Formulars zumindest korrekt geladen zu werden. Selbst, wenn ich 50MB an Dateianhängen hochlade, werden diese in Contao Leads angezeigt und liegen auch korrekt auf dem Server. Beim Mailversand über das Notification Center wird der SMTP-Server jedoch nicht einmal konkaktiert, wenn die Anhänge ungefähr 10MB überschreiten. Hier scheint sich Contao irgendwo zu verschlucken. Leider erhalte ich keine Fehlermeldung in den Logs sondern werde einfach auf die Bestätigungsseite des Formulars weiter geleitet.

  4. #4
    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 chatjack Beitrag anzeigen
    Leider gehen auch hier Mails mit größeren Dateianhängen verloren.
    Jetzt müssten sie in der Failure Queue sein. bin/console messenger:failed:show
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    Danke für den Hinweis. Hier findet sich tatsächlich eine Mail, die nicht zugestellt werden konnte, was aber auf einen Fehler meinerseits zurück zu führen ist.

    Inzwischen tippe ich aber immer mehr auf ein Problem mit dem Notification Center [2.2.6]. Hier lässt sich auf dem Testsystem ein Fehler sehr gut reproduzieren.

    Zur Kontrolle: Über folgenden Code lässt sich problemlos eine Mail mit Anhängen über 40MB verschicken.

    PHP-Code:
    <?php

    namespace App\Command;

    use 
    Symfony\Component\Console\Attribute\AsCommand;
    use 
    Symfony\Component\Console\Command\Command;
    use 
    Symfony\Component\Console\Input\InputInterface;
    use 
    Symfony\Component\Console\Output\OutputInterface;
    use 
    Symfony\Component\Console\Style\SymfonyStyle;
    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\System;
    use 
    Contao\Email;

    #[AsCommand(
        
    name'bm:mailtest',
        
    description'Test emails with large attachements.',
    )]
    class 
    MailtestCommand extends Command
    {
        private 
    string $projectDir;
        
        public function 
    __construct(
            private 
    readonly ContaoFramework $framework
        
    ) {
            
    $this->framework->initialize();
            
    $this->projectDir System::getContainer()->getParameter('kernel.project_dir');

            
    parent::__construct();
        }

        protected function 
    execute(InputInterface $inputOutputInterface $output): int
        
    {
            
    $emailAddress '**********';

            
    $email = new Email();
            
    $email->subject 'Testmail';
            
    $email->text 'This is a mail with large attachements.';
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207123602.jpg');
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207123809.jpg');
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207125846.jpg');
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207133648.jpg');
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207133707.jpg');
            
    $email->attachFile($this->projectDir '/files/uploads/IMG20250207134908.jpg');
            
    $email->sendTo($emailAddress);

            
    $io = new SymfonyStyle($input$output);
            
    $io->success('Email sent to: ' $emailAddress);

            return 
    Command::SUCCESS;
        }
    }
    Nun nehme ich die selben Dateien, und hänge sie über "Anhänge" in die Nachricht im Notification Center.

    Screenshot 2025-02-18 165829.jpg

    Wenn ich nun das Formular abschicke, erhalte ich im LOG folgende Fehlermeldung:

    The parcel could not be delivered via the "mailer" gateway because of an internal issue: There is no active transaction..
    Hänge ich nur ein Bild in den Anhang, sodass die Mail die 10MB nicht überschreitet, funktioniert es auch über das Notification Center.
    Geändert von chatjack (18.02.2025 um 16:07 Uhr)

  6. #6
    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 chatjack Beitrag anzeigen
    Wenn ich nun das Formular abschicke, erhalte ich im LOG folgende Fehlermeldung:
    Und dieser Versuch ist nun in der failure Queue?
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    Nein, der Fehler landet nicht in der Failure Queue sondern scheint schon vorher zu passieren. Ich erstelle gerade ein Issue auf Github.

  8. #8
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    https://github.com/terminal42/contao...ter/issues/398

    Offenbar reichen die 256MB zugewiesenen RAM nicht aus, um 36MB als Anhang über das Notification Center zu verschicken. Der Fehler wurde durch einen try/catch-Block unterdrückt. Interessanterweise reichen die 256MB für den Versand über die E-Mail-Klasse aus.

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

    Standard

    Der memory error ist ein anderer Fehler.
    » sponsor me via GitHub or Revolut

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

    Standard

    Füge ein throw $e; vor dieser Zeile ein, aktiviere den Debug-Modus und versuche es dann noch einmal. Dann poste den Stack Trace davon.
    » sponsor me via GitHub or Revolut

  11. #11
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    Der Vollständigkeit halber auch noch Mal hier.

    Die Transports für den Messenger sind in Contao offenbar defaultmäßig so konfiguriert, dass die Mails in der Datenbank zwischengespeichert werden, was bei normalen Mails auch kein Problem ist.

    Code:
    framework:
      messenger:
        transports:
          sync: sync://
          contao_failure: doctrine://default?table_name=tl_message_queue&queue_name=failure&auto_setup=false
          contao_prio_high: doctrine://default?table_name=tl_message_queue&queue_name=prio_high&auto_setup=false
          contao_prio_normal: doctrine://default?table_name=tl_message_queue&queue_name=prio_normal&auto_setup=false
          contao_prio_low: doctrine://default?table_name=tl_message_queue&queue_name=prio_low&auto_setup=false
    Anscheinend zählen dazu auch Dateianhänge. Bei Mails mit über 10MB Anhang war der Versuch, alles in Base64 zu kodieren und in die Datenbank zu schreiben zu viel für meinen kleinen Server.

    Zum Testen wurden die Transports jetzt auf InMemory umgestellt.

    Code:
    framework:
      messenger:
        transports:
          contao_prio_high: 'in-memory://'
          contao_prio_normal: 'in-memory://'
          contao_prio_low: 'in-memory://'
    Das hat sogar mit Anhängen von 36MB problemlos funktioniert, als das memory_limit des Servers wieder auf 128MB gesenkt wurde.

    Wenn ich das richtig sehe, gibt es seitens Symfony aktuell keine eingebaute Möglichkeit, Mails im Dateisystem zwischen zu speichern, weshalb ich aktuell mit dem Gedanken spiele, das über sync:// zu machen und die zusätzliche Wartezeit in Kauf zu nehmen. Für den Fall, dass beim Versand etwas schief läuft, werden die Daten zusätzlich über Contao Leads gespeichert.
    Geändert von chatjack (18.02.2025 um 20:09 Uhr)

  12. #12
    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 chatjack Beitrag anzeigen
    Die Transports für den Messenger sind in Contao offenbar defaultmäßig so konfiguriert, dass die Mails in der Datenbank zwischengespeichert werden, was bei normalen Mails auch kein Problem ist.
    Nicht ausnahmslos - außer es hat sich hier etwas in Symfony 6+ geändert. In 4.13 mit Mails aus Isotope sind die Attachments separat.
    » sponsor me via GitHub or Revolut

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

    Standard

    Der Fehler wäre ja außerdem dann auch über deinen "new Email();" Test aufgetreten.
    » sponsor me via GitHub or Revolut

  14. #14
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    181

    Standard

    Ah ok, zumindest wurde im Falle von new Email() nichts in der Datenbank zwischen gespeicht. Sonst wäre die mir bei meinen Tests definitiv um die Ohren geflogen.

    Ich konnte das Notification jetzt mit wenigen Anpassungen dazu bringen, auf Temp-Dateien zu referenzieren, die bereits über die BulkyItemStorage Klasse beim Abschicken des Formulars erzeugt werden.

    Du findest einen PullRequest auf GitHub.

    https://github.com/terminal42/contao...enter/pull/399

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

    Standard

    Ja, die Legacy Email Klasse nutzt attachFromFile
    » 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
  •