Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pętla w phpmailer
Forum PHP.pl > Forum > Przedszkole
ufo1990
Mam problem z PHPMailer ponieważ chcę wysłać wiadomości do wszystkich użytkowników z bazy danych i to działa jednak pętla nie działa do "$mail->Subject" oraz "$mail->Body". Ktoś coś doradzi, pomoże ?

  1. require_once "connect.php";
  2. $connect = @new mysqli($host, $db_user, $db_password, $db_name);
  3. $result = $connect->query("Select Group_concat(name SEPARATOR ',') as names, Group_concat(email SEPARATOR ',') as emails from persons");
  4. if($result->num_rows > 0)
  5. {
  6. while($row = $result->fetch_assoc())
  7. {
  8. $name_explode = explode(",",$row['names']);
  9. $email_explode = explode(",",$row['emails']);
  10.  
  11. require "PHPMailer/PHPMailerAutoload.php";
  12.  
  13. $mail = new PHPMailer();
  14. $mail->CharSet = "UTF-8";
  15. $mail->IsSMTP();
  16. $mail->SMTPAuth = true;
  17.  
  18. $mail->SMTPSecure = 'ssl';
  19. $mail->Host = '**********';
  20. $mail->Port = 465;
  21. $mail->Username = '**********';
  22. $mail->Password = '**********';
  23.  
  24. $mail->IsHTML(true);
  25. $mail->From='**********';
  26. $mail->FromName='**********';
  27.  
  28. $mail->AddReplyTo('**********');
  29.  
  30. for ($i=0; $i< count($name_explode); $i++)
  31. {
  32. $mail->Subject = $name_explode[$i];
  33. $mail->Body = "Witaj$name_explode[$i]";
  34. $mail->AddAddress($email_explode[$i], $name_explode[$i]);
  35. }
  36. if(!$mail->Send())
  37. {
  38. echo "Wiadomość nie wysłana: " . $mail->ErrorInfo;
  39. }
  40. else
  41. {
  42. echo "Wiadomość wysłana!";
  43. }
  44. $mail->clearAllRecipients();
  45. }
  46. }
  47. $connect->close();
trueblue
Spróbuj SwiftMailer: https://swiftmailer.symfony.com/docs/plugin...ecorator-plugin
Tomplus
Po pierwsze.
Wystaw obiekt PHPMailer poza pętle. Może nie wysyłasz emaili bo masz za dużo połączeń z pocztą w tym samym czasie.

ufo1990
Cytat(Tomplus @ 18.05.2021, 23:28:05 ) *
Po pierwsze.
Wystaw obiekt PHPMailer poza pętle. Może nie wysyłasz emaili bo masz za dużo połączeń z pocztą w tym samym czasie.


Maile normalnie się wysyłają i pętla dla adresów działa, jednak każdy e-mail zawiera tą samą informacje.
gino
Wywal też poza pętlę
Kod
require "PHPMailer/PHPMailerAutoload.php";


Jedno zaciągnięcie biblioteki wystarczy.

edit: wyświetl sobie w phpmyadmin co tak naprawdę zwraca Ci zapytanie sql.
ufo1990
Cytat(gino @ 19.05.2021, 07:17:50 ) *
Wywal też poza pętlę
Kod
require "PHPMailer/PHPMailerAutoload.php";


Jedno zaciągnięcie biblioteki wystarczy.

edit: wyświetl sobie w phpmyadmin co tak naprawdę zwraca Ci zapytanie sql.

wywaliłem po za pętle PHPMailer. Zapytanie SQL zwraca w moim przypadku dwa rekordy z adresem e-mail oraz imieniem i nazwiskiem. Tak jak pisałem powyżej pętla nie działa na dla "$mail->Subject" oraz "$mail->Body"natomiast dorzucając imię i nazwisko do "AddAddress" pętla działa i wysyła również imię i nazwisko.
  1. $mail->AddAddress($email_explode[$i], $name_explode[$i]);
LowiczakPL
tak poza pętlą powinien być mailer

  1. require_once "connect.php";
  2. require "PHPMailer/PHPMailerAutoload.php";
  3.  
  4. $mail = new PHPMailer();
  5. $mail->CharSet = "UTF-8";
  6. $mail->IsSMTP();
  7. $mail->SMTPAuth = true;
  8. $mail->SMTPSecure = 'ssl';
  9. $mail->IsHTML(true);
  10. $mail->Host = '**********';
  11. $mail->Port = 465;
  12. $mail->Username = '**********';
  13. $mail->Password = '**********';
  14.  
  15. $connect = @new mysqli($host, $db_user, $db_password, $db_name);
  16. $result = $connect->query("Select Group_concat(name SEPARATOR ',') as names, Group_concat(email SEPARATOR ',') as emails from persons");
  17. if($result->num_rows > 0)
  18. {
  19. while($row = $result->fetch_assoc())
  20. {
  21. $name_explode = explode(",",$row['names']);
  22. $email_explode = explode(",",$row['emails']);
  23.  
  24.  
  25. $mail->From='**********';
  26. $mail->FromName='**********';
  27. $mail->AddReplyTo('**********');
  28.  
  29. for ($i=0; $i< count($name_explode); $i++)
  30. {
  31. $mail->Subject = $name_explode[$i];
  32. $mail->Body = "Witaj $name_explode[$i]";
  33. $mail->AddAddress($email_explode[$i], $name_explode[$i]);
  34. }
  35. if(!$mail->Send())
  36. {
  37. echo "Wiadomość nie wysłana: " . $mail->ErrorInfo;
  38. }
  39. else
  40. {
  41. echo "Wiadomość wysłana!";
  42. }
  43. $mail->clearAllRecipients();
  44. }
  45. }
  46. $connect->close();
ufo1990
Cytat(LowiczakPL @ 19.05.2021, 08:13:27 ) *
tak poza pętlą powinien być mailer

  1. require_once "connect.php";
  2. require "PHPMailer/PHPMailerAutoload.php";
  3.  
  4. $mail = new PHPMailer();
  5. $mail->CharSet = "UTF-8";
  6. $mail->IsSMTP();
  7. $mail->SMTPAuth = true;
  8. $mail->SMTPSecure = 'ssl';
  9. $mail->IsHTML(true);
  10. $mail->Host = '**********';
  11. $mail->Port = 465;
  12. $mail->Username = '**********';
  13. $mail->Password = '**********';
  14.  
  15. $connect = @new mysqli($host, $db_user, $db_password, $db_name);
  16. $result = $connect->query("Select Group_concat(name SEPARATOR ',') as names, Group_concat(email SEPARATOR ',') as emails from persons");
  17. if($result->num_rows > 0)
  18. {
  19. while($row = $result->fetch_assoc())
  20. {
  21. $name_explode = explode(",",$row['names']);
  22. $email_explode = explode(",",$row['emails']);
  23.  
  24.  
  25. $mail->From='**********';
  26. $mail->FromName='**********';
  27. $mail->AddReplyTo('**********');
  28.  
  29. for ($i=0; $i< count($name_explode); $i++)
  30. {
  31. $mail->Subject = $name_explode[$i];
  32. $mail->Body = "Witaj $name_explode[$i]";
  33. $mail->AddAddress($email_explode[$i], $name_explode[$i]);
  34. }
  35. if(!$mail->Send())
  36. {
  37. echo "Wiadomość nie wysłana: " . $mail->ErrorInfo;
  38. }
  39. else
  40. {
  41. echo "Wiadomość wysłana!";
  42. }
  43. $mail->clearAllRecipients();
  44. }
  45. }
  46. $connect->close();

Tak wiem, ustawiłem PHPMailer po za pętla ale nie oto chodzi że PHPMailer nie działa tylko nie działa pętla dla
  1. $mail->Subject = $name_explode[$i];
  2. $mail->Body = "Witaj $name_explode[$i]";
gino
Zapytanie powinno zwrócić jeden rekord z dwoma polami a nie 2 rekordy, po co więc pętla while? Całość wysyłania powinna się odbyć w pętli for, a w zasadzie to w pętli foreach bo te zmienne $name_explode i $email_explode to tablice.
ufo1990
Cytat(gino @ 19.05.2021, 08:56:37 ) *
Zapytanie powinno zwrócić jeden rekord z dwoma polami a nie 2 rekordy, po co więc pętla while? Całość wysyłania powinna się odbyć w pętli for, a w zasadzie to w pętli foreach bo te zmienne $name_explode i $email_explode to tablice.

Zgadza się mój błąd przecież
  1. SELECT Group_concat(name SEPARATOR ',') AS names, Group_concat(email SEPARATOR ',') AS emails FROM persons
zwróci jednej rekord z dwoma polami po przecinku. Próbowałem z foreach ale nadal nie w treści e-maila jest wysyłana tylko treść z pierwszego pola.
gino
Wywal pętle while, w pętlę for wrzuć
Kod
   if(!$mail->Send())
        {
            echo "Wiadomość nie wysłana: " . $mail->ErrorInfo;
        }
    else
        {
            echo "Wiadomość wysłana!";
        }
            $mail->clearAllRecipients();


edit tylko wcześniej zrób mysql_fetch_array na tym jednym rekordzie.
ufo1990
Cytat(gino @ 19.05.2021, 09:18:27 ) *
Wywal pętle while, w pętlę for wrzuć
Kod
   if(!$mail->Send())
        {
            echo "Wiadomość nie wysłana: " . $mail->ErrorInfo;
        }
    else
        {
            echo "Wiadomość wysłana!";
        }
            $mail->clearAllRecipients();


edit tylko wcześniej zrób mysql_fetch_array na tym jednym rekordzie.


Dziękuje za pomoc, faktycznie działa smile.gif
gino
Wywal też te echa, zrób jak należy, wrzuć wysyłanie w try...catch, po co za każdym razem ma wypisywać że wysłany, jak będizesz miał 100 klientów to 100xecho ?
Zobacz jak to robi autor:
phpmailer
ufo1990
Cytat(gino @ 19.05.2021, 10:21:34 ) *
Wywal też te echa, zrób jak należy, wrzuć wysyłanie w try...catch, po co za każdym razem ma wypisywać że wysłany, jak będizesz miał 100 klientów to 100xecho ?
Zobacz jak to robi autor:
phpmailer


jasne kod został uporządkowany i żadnych echo nie ma. Tak naprawę to kod będzie wykorzystywany do crona.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.