Kolejka Laravel wysyła po kilka wiadomości na ten sam adres

0

Cześć,
mam kolejkę laravel odpowiedzialną za wysłanie newslettera. Wszystko jest w zasadzie ok poza tym że wysyła po kilka wiadomości na ten sam adres i w ten sposób z 1200 odbiorców wysyłanych jest około 3000 wiadomości czasem po 4 czasem po 3 czasem po 2 na jeden adres.
O co może z tym chodzić, jak naprawić?

3

"Poka" kod, bo tak to raczej nikt nie zgadnie. Nie masz w tej kolejce jakichś błędów?

2

Pewnie coś nie działa i jest jakiś błąd i dlatego coś się źle wysyła.
(odpowiedź na poziomie zadanego pytania - zero konkretów, zero kodu to i zero sensownych rzeczy w odpowiedzi :D )

0

kod wysyłania newsletter, kod supervisor, kod kolejki? Co dokładnie :D
Samych błędów nie znalazłem nawet napisałem sobie coś na zasadzie logów, w sensie po wysłaniu każdej wiadomości na email zapisuje do bazy rekord a później przed wysłaniem sprawdzam czy jest zapisany, jeśli tak omijam

Myk z zapisaniem adresu i sprawdzeniem działał aż do wczoraj, wczoraj wysłało wiadomości pomimo sprawdzenia, tak jakby adres nie zdążył zapisać się w bazie - dlatego nie wiem o co chodzi. Jak sprawdzam zapisane adresy na które zostało wysłane jest po kilka tych samych adresów. W sensie w tablicy $logEmails

$logs = NewsletterLog::where('newsletter_group_id', $newsletterGroup->id)->get();
            $logEmails = [];
            foreach ($logs as $log) {
                $logEmails[] = $log->email;
            }

            $recipients = []; // adresy email odbiorców

           
                foreach ($recipients as $email) {
                    if (!in_array($email, $logEmails)) {
                       
//                        Mail::to($email)
//                            ->send();

                        NewsletterLog::create([
                            'email' => $email,
                            'newsletter_group_id' => $newsletterGroup->id,
                            'lang' => 'pl'
                        ]);
                    }
                }
0

A jesteś pewien, że błąd leży po stronie bazy i ponownego przekazania/zlecenia wiadomości do wysyłki, a nie np. po stronie serwera pocztowego? Czy serwer mailowy stoi na tej samej maszynie, czy jest zewnętrzny? Sam nim zarządzasz, czy korzystasz z gotowej usługi dostarczanej przez jakiegoś dostawcę?

0

Cały projekt stoi na VPS z administracją od dostawcy. Skonfigurowana jest skrzynka pocztowa do wysyłki wiadomości.
Podstawowym problemem którego nie rozumiem jest ta lista ponieważ adres do bazy zapisuje się tylko wtedy jeśli jeszcze go tam nie ma (dla danej grupy) po wysłaniu wiadomości.a teraz zapisane jest po kilka adresów. W samej liście odbiorców też nie ma adresów które się powtarzają mimo to wcześniej były problemy z podwójnym wysyłaniem wiadomości dlatego zapisywanie i sprawdzanie adresu było najprostszym rozwiązaniem

1

A masz np. zmigrowaną tabelę failed_jobs ? Nic tam nie ląduje? Bo może np. coś ląduje Ci z jakiegoś względu do tej bazy i potem jak masz retry faild jobs to wykonuje się ponownie.
W tym kodzie masz zakomentowane wysyłanie i nie wiadomo czy sprawdzasz np. co się dzieje z tym mailem i może warto sprawdzać.

if(count(Mail::failures()) > 0){
    $errors = 'Failed to send';
}

Bo raczej nie tworzysz jednego maila z wszystkimi jako BCC ?

0

Sprawdź pole cc w otrzymywanym przez klienta mailu - nie jest czasem tak, że jest wysyłany mail do kogoś oraz kopie do innych, a następnie kiedy do tych innych jest wysyłany ten email, to tam są znowu kopie do całej listy?

1

Odpowiem ci jako spec od speców wszystkich speców laravela. Robisz to źle!
Oto jak powinien wyglądać algorytm:

  1. Piszesz sobie coś nowego do newsletter żeby wysłać do klientów. Czyli np "Edytka spiewa hymn!"
  2. Po wciśnięciu WYSLIJ odpalasz funkcje która pobiera wszystkie aktywne emaile do których ma trafić email
  3. Kolejka reszte robi za ciebie

Funkcja jaka powinna być w kroku 2 to:

$newslatterRecipeints = Newsletter::where('newsletter_group_id', $newsletterGroup->id)->get();
foreach ($newslatterRecipeints as $recipient) {
    Mail::to($recipient->email)->queue(new NewsletterMail());
}
0

@chomikowski: okej, tylko kiedy kolejka jest w pętli po kliknięciu wyślij trzeba zaczekać kilka minut

0

Kolejka nie wystepuje w pętli. Do okolejki dodajesz kolejne pozycje jako FIFO, petla jest tylko wtedy gdy dodajesz elementy do kolejki. Wiec najlepiej dodaj do kolejki ze ma sie wysylac co 5 sekundy i kolejne zadanie (mail) ma sie wyslac jak poprzednie skonczy sie wysylac. czyli 2000 maili * 5 sekund to w niecale 3 godziny wyslesz wszystko . chyba ze uzyjesz pool mail server to wtedy mozesz pocisnac np 5 maili jednoczesnie czyli 2000 * 5 sekund / 5 to masz pol godziny i zalatwione.

Daj kod petli ktora dodaje ci zadania do kolejki. i daj kod jakim uruchamiasz kolejke

1 użytkowników online, w tym zalogowanych: 0, gości: 1