Wielokrotne wysyłanie maili zamiast pojedynczego przez PHPMailer

0

Witam, mam problem z wielokrotnym wysyłaniem e-maili. Otóż poniższy kod ma za zadanie wysyłać jednego maila ze kilkoma zleceniami. Jednak wysyła od tyle maili ile jest zleceń, np. mam 6 zleceń to wysyła 6 maili z 6 zleceniami w środku a mi zależy na 1 mailu z 6 zleceniami. Wiem, że tak się dzieje dlatego, że mam to w pętli foreach ale jak zrobię inaczej to wysyła 1 maila ale z 1 zleceniem. Ma ktoś pomysł jak to rozwiązać?

 
require_once('libs/class.phpmailer.php');
				$mail = new PHPMailer();
				$mail->IsSMTP(); // telling the class to use SMTP
				$mail->SMTPAuth = true;                  // enable SMTP authentication
				$mail->Host = KONTO_SMTP; // sets the SMTP server
				//$mail->Port       = 465;                    // set the SMTP port for the GMAIL server
				$mail->Username = KONTO_REJESTRACJA_EMAIL; // SMTP account username
				$mail->Password = KONTO_REJESTRACJA_HASLO;        // SMTP account password
				$mail->SetFrom(KONTO_REJESTRACJA_EMAIL, KONTO_REJESTRACJA_EMAIL);
				$mail->AddReplyTo(KONTO_REJESTRACJA_EMAIL, KONTO_REJESTRACJA_EMAIL);
				$mail->Subject = "Test";
		
		
				$result = $db->query("SELECT * FROM zlecenia WHERE newsletter = '0' AND status = 'confirmed'");
				
				foreach($result as $r){
					$q3 = "SELECT * FROM wojewodztwa WHERE id_wojewodztwa=?";
              $w3 = $db->prepare($q3);
              $w3->execute(array($r['id_wojewodztwa']));
                 if ($w3->rowCount() > 0) {
                     while ($r3 = $w3->fetch(PDO::FETCH_ASSOC)) {
                     	$id_wojewodztwa = $r3['id_wojewodztwa'];
						$wojewodztwo = $r3['wojewodztwa_nazwa'];
                    }
               }
					for ($i = 0; $i < 3; $i++) {
					
						if($i==0) {
							$q4 = "select uk.*, u.email, u.is_email_zlecenie, u.login from users_kat uk 
							left outer join users_test u on u.id_users = uk.id_users
							where id_kat3=".$r['id_kat3']." group by uk.id_users";
						} elseif($i==1) {
							$q4 = "select uk.*, u.email, u.is_email_zlecenie, u.login from users_kat uk 
							left outer join users_test u on u.id_users = uk.id_users
							where id_kat2=".$r['id_kat2']." and id_kat3=0 group by uk.id_users";
						} elseif($i==2) {
							$q4 = "select uk.*, u.email, u.is_email_zlecenie, u.login from users_kat uk 
							left outer join users_test u on u.id_users = uk.id_users
							where id_kat1=".$r['id_kat1']." and id_kat2=0 and id_kat3=0 group by uk.id_users";
						}
					
					$tests = $db->prepare("SELECT * FROM zlecenia WHERE newsletter = '0' AND status = 'confirmed' AND id_wojewodztwa=$id_wojewodztwa AND id_kat3=".$r['id_kat3']." OR (id_kat2=".$r['id_kat2']." and id_kat3=0) OR (id_kat1=".$r['id_kat1']." and id_kat2=0 and id_kat3=0)");
					
				
				$w4 = $db->prepare($q4);
				$w4->execute();
				while ($r4 = $w4->fetch(PDO::FETCH_ASSOC)) {
					
					$body = '<div style=" width:100%; text-align:center;  font-size:12px; line-height:20px; "><div style="width:500px; text-align:left;"><br /><br /><img src="'.$logo.'"  border="0"><div style="margin:40px 0; padding:35px 20px 50px 20px; border-top: 2px solid #000000; border-bottom: 2px solid #000000;  background-color:#fff;">
								<strong>Witaj '.$r4['login'].',</strong><br/><br/>
								Zlecenie skierowane do usługodawców z województwa:  '.$wojewodztwo;
					
					
					$tests->execute();
					while ($test = $tests->fetch(PDO::FETCH_ASSOC)) {
						$body .= '<br><br><strong>'.$test['nazwa_zlecenia'].'</strong><br/><br/>'.$test['opis_zlecenia'].'<br /><br/><a href="http://www.tufachowiec.pl/zlecenie/'.txt2url($test['nazwa_zlecenia']).','.$test['id_zlecenia'].'/" style="color:#0000ee;">Zobacz dane kontaktowe zleceniodawcy.</a>';
					}
					$mail->MsgHTML($body);
					$mail->AddAddress($r4['email'], $r4['email']);
					if ($mail->send()) {
						echo "Wysłano!";
						// UPDATE zlecenia SET newsletter=1 WHERE id_zlecenia=".$r['id_zlecenia']
					}
					$mail->clearAddresses();
				}}} 
0

NAJPIERW w foreachu przygotuj sobie treść maila. Zrób sobie pustą zmienną $tresc = '', a potem do niej dopisuj foreachem `$tresc .= "zlecenie: blablabla";

Zanim zaczniesz cokolwiek wysyłać doprowadź kod do takiego stanu, żeby wyświetlić te 6 zleceń na ekranie używając prostego echo $tresc;

Dopiero potem napisz sobie fragment, żeby to wysłać.

0

Zrobiłem tak jak napisałeś i wysyła mi wszystkie zlecenia, które są w bazie danych a nie te które są przypisane do danego użytkownika.

0
pajek92 napisał(a):

Witam, mam problem z wielokrotnym wysyłaniem e-maili. Otóż poniższy kod ma za zadanie wysyłać jednego maila ze kilkoma zleceniami. Jednak wysyła od tyle maili ile jest zleceń, np. mam 6 zleceń to wysyła 6 maili z 6 zleceniami w środku a mi zależy na 1 mailu z 6 zleceniami. Wiem, że tak się dzieje dlatego, że mam to w pętli foreach ale jak zrobię inaczej to wysyła 1 maila ale z 1 zleceniem. Ma ktoś pomysł jak to rozwiązać?

Twoje, przynajmniej dwa, problemy biorą się z tego, że masz nieuporządkowany kod. W kodzie masz mieszankę wszystkiego,
algorytmów, danych i formatowania e-maila. Nikomu na formu nie bedzie chciało się czegoś takiego przeanalizować, a Ty,
jako autor tego kodu, też masz z tym problem. Koniecznie podziel kod na procedury. Gdzie jest procedura zrobZlecenie?
Nie ma. Gdzie jest procedura dołącz zlecenie? Nie ma. Nawet najlepszy programista w takim kodzie czasami się pomyli.

Spróbuj tak:

function pobierzDane( $nr ) {
$zlecenie = array();
$zlecenie['czas'] = czas_z_twoich_danych( $nr );
$zlecenie['temat'] = temat_z_twoich_danych( $nr );
$zlecenie['tresc'] = tresc_z_twoich_danych( $nr );
return $zlecenie;
}

function pobierzSzablonZlecenia() {
return "

##czas##
##temat##
##tresc##
"; }

function zbudujZlecenie( $dane, $szablon ) {
foreach( $dane as $key => $value ) {
$szablon = zastap( "###" . wyswietl_bezpiecznie($key) . "###" , $value );
}
return $szablon;
}

function daneDoEmaila() {
$dane = array();
$dane['e-mail'] = '[email protected]';
$dane['tytuł'] = 'tytuł';
$dane['itd'] = '[email protected]';
return $dane;
}

function zbudujEmail() {
//szesc pętli dla każdego zlecenia
}

i w koncu wyślij e-mail.

Pozdrawiam

0

Opakowanie tego w funkcje oprócz tego, że jest przejrzyście nic nie daje, dlatego mimo wszystko prosiłbym o sprawdzenie kodu powyżej.

0
pajek92 napisał(a):

Opakowanie tego w funkcje oprócz tego, że jest przejrzyście nic nie daje, dlatego mimo wszystko prosiłbym o sprawdzenie kodu powyżej.

Nie opakowanie, tylko podzielenie tego na funkcje. Daje to tylle, że od razu będzie widać gdzie jest błąd. Teraz po jednym spojrzeniu nie wiem gdzie jest błąd, pewnie
wysyłanie e-maila jest w pętlach, to wysyła wiele razy.

Pozdrawiam

0
dzek69 napisał(a):

NAJPIERW w foreachu przygotuj sobie treść maila. Zrób sobie pustą zmienną $tresc = '', a potem do niej dopisuj foreachem `$tresc .= "zlecenie: blablabla";

Zanim zaczniesz cokolwiek wysyłać doprowadź kod do takiego stanu, żeby wyświetlić te 6 zleceń na ekranie używając prostego echo $tresc;

Dopiero potem napisz sobie fragment, żeby to wysłać.

Ok, napisałem kod jeszcze raz z uwzględnieniem twojej porady. Mam dwie tabele "zlecenia" i "users_test" i obie mają kolumnę "id_wojewodztwa". Jak do poniższego kodu mam dodać, żeby wysyłało mi tylko do tych użytkowników, którzy mają odpowiedni id_wojewodztwa. Nie mogę całości wziąć w pętle foreach i iterować bo wysyła kilka razy maile do tej samej osoby. Jest inny sposób?

$body = "";
$zlecenia = $db->query("SELECT * FROM zlecenia WHERE newsletter = '0' AND status = 'confirmed'");
foreach($zlecenia as $row){
	$body .= "<strong>".$row['nazwa_zlecenia']."</strong><br/><p>".$row['opis_zlecenia']."</p>";
}

$email = $db->query("SELECT * FROM users_test");
foreach($email as $em){
					
	$mail->MsgHTML($body);
	$mail->AddAddress($em['email'], $em['email']);
				
	if ($mail->send()) {
		echo "Wysłano!";
	}
	$mail->clearAddresses();
}

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