SMTP v loop / foreach posílá e-mail uživatelům v kopii a vícenásobně (v závislosti na počtu iterací)

Dan Hundrt
Člen | 74
+
0
-

Zdravím,

rád bych se zeptal, zdali nevíte jak vyřešit následující problém.

Mám foreach, ve kterém posílám commandem e-mail:

foreach ($users as $user) {
     $output->writeln("<fg=green>Send e-mail for user: {$user['email']}</>");
     $this->emailService->sendEmailAfterRegistration($user);
     sleep(5);
}

V metodě sendEmailAfterRegistration() posílám samotný e-mail:

try {
    $mail = $this->message
        ->addTo($user['email'])
        ->setFrom($this->getMailFrom())
        ->setSubject($title)
        ->setHtmlBody($latte->renderToString('email.latte', $data), self::PATH . '/assets/');

    $mailer = new SmtpMailer($sender);
    $mailer->send($mail);
} catch (SmtpException $exception) {
    // ....
}

Problém je, pokud se posílá e-mail na více příjemců (rozdílných), první se pošle v pořádku, druhý e-mail se pošle na 2 příjemce zároveň z předešlé iterace (každý v kopii), třetí e-mail pošle na 3 příjemce (také v kopii) atd., poté se to násobí iteracemi.

Nevíte, kde by mohl být problém? Používám gmail SMTP server.

Jde o e-maily, které posíláme po registraci druhý den ráno, kde posíláme návod, instrukce atd. (další e-mail posíláme 2. a 3. den, proto v commandu).

Děkuji

Editoval Dan Hundrt (22. 2. 2023 12:26)

nightfish
Člen | 472
+
+7
-

@DanHundrt

$mail = $this->message
        ->addTo($user['email'])

Vypadá to, jako by sis mezi jednotlivými voláními sendEmailAfterRegistration() do $this->message neukládal new Message(). Takže se k jedné message v každém volání přidá další příjemce přes addTo.

Osobně bych to řešil přes $mail = new Message() (resp. $mail = $this->messageFactory->create()) a $this->message vůbec nepoužívat – protože si tím do emailService zanášíš stavovost, která způsobuje problémy.

Dan Hundrt
Člen | 74
+
0
-

Vypadá to, jako by sis mezi jednotlivými voláními sendEmailAfterRegistration() do $this->message neukládal new Message(). Takže se k jedné message v každém volání přidá další příjemce přes addTo.

Osobně bych to řešil přes $mail = new Message() (resp. $mail = $this->messageFactory->create()) a $this->message vůbec nepoužívat – protože si tím do emailService zanášíš stavovost, která způsobuje problémy.

Super, děkuji za komentář. Upravím kód :)