2010-09-16 11 views
8

quando invio e-mail ottengo due e-mail, ma dovrebbe inviare e-mail alle e-mail rispettive. Problema di lopoping?looping phpmailer

$array_values = Array 
(
[0] => Array 
(
[0] => uname1 
[1] => fullname1 
[2] => email 1 


) 
[1] => Array 
(
[0] => uname2 
[1] => fullname2 
[2] => email 2 


) 
) 
$f=0; 
foreach($array_values as $mail_vars) 
{ 

//$mail->AddReplyTo($mail_vars[2],'RED'); 
$mail->AddAddress($mail_vars[2], 'sss'); 
$body .="<br>"; 
$body .= 'Username: '. $mail_vars[0]; 
$body .="<br>"; 
$body .= 'Password: '.$mail_vars[1]; 
$body .="<br>"; 
$mail->SetFrom('email', 'FULLNAME'); 
$mail->Subject = "NEW"; 
$mail->MsgHTML($body); 
//$mail->Send(); 

$f++; 
} 
+8

Prima di eseguire un debug di base. Ti riferisci a un 'mail_vars [4]' che non esiste affatto –

+0

Che cosa è '$ f ++;' a proposito? – RobertPitt

+0

Mi spiace sia $ mail_vars [2] –

risposta

4

Hai bisogno di una:

$mail=new PHPMailer() 

all'inizio del vostro ciclo for -come lo è, la seconda volta attraverso di essa scombina proprio dietro con la prima e-mail (in quanto uno nuovo non è creato).

Come hai sottolineato, anche il corpo deve essere ripristinato - in effetti l'utilizzo di una variabile separata come quella non è molto utile - meglio semplicemente fornire direttamente a MsgHTML. Dal momento che il contenuto della tua e-mail è banale potresti anche voler inviare una versione in testo normale dei dati (dipende dal tuo destinatario target, immagino). Quindi lo script aggiornato:

foreach($array_values as $mail_vars) 
{ 
    $mail=new PHPMailer(); 
    $mail->SetFrom('email', 'FULLNAME'); 
    $mail->AddAddress($mail_vars[2], 'sss'); 

    $mail->Subject = "NEW"; 

    $mail->MsgHTML("<br>\nUsername: ".$mail_vars[0]."<br>\nPassword: ".$mail_vars[1]."<br>"); 

    //$mail->Send(); 
    $f++; 
} 
+0

$ corpo deve essere resettato nella parte superiore del ciclo –

+0

Sì vero - chiaramente hai funzionato abbastanza da averlo capito;) Davvero non lo fai t bisogno del '$ body' var del tutto {edit} – Rudu

+0

Se stai inviando una password (o qualsiasi tipo di contenuto personalizzato), dovresti chiamare' $ mail-> AltBody = ''; 'prima di' $ mail-> MsgHTML() ', o la versione testuale della tua e-mail conterrà il contenuto del primo destinatario. – Hobo

33

Guardando attraverso la fonte di PHP Mailer, sarà necessario cancellare i campi. Almeno l'indirizzo, forse di più. Ecco la sezione del codice della classe PHPMailer che ha le funzioni chiare. Sei più che benvenuto a guardarli e provarli ecc. Questa è ovviamente un'alternativa alla re-istanziazione di un nuovo oggetto, che può o meno causare una perdita di memoria (dipende da quante chiamate tu fai).

Così l'attuazione del codice di clearAddresses:

$mail->Subject = "NEW"; 
    $mail->MsgHTML($body); 
    $mail->Send(); 
    $mail->ClearAddresses(); // should reset the To address and remove the first one from it. 

ho rimosso il codice attuale è sufficiente la descrizione e il nome della funzione.

///////////////////////////////////////////////// 
    // CLASS METHODS, MESSAGE RESET 
    ///////////////////////////////////////////////// 

    /** 
    * Clears all recipients assigned in the TO array. Returns void. 
    * @return void 
    */ 
    public function ClearAddresses() { 
    } 

    /** 
    * Clears all recipients assigned in the CC array. Returns void. 
    * @return void 
    */ 
    public function ClearCCs() { 
    } 

    /** 
    * Clears all recipients assigned in the BCC array. Returns void. 
    * @return void 
    */ 
    public function ClearBCCs() { 
    } 

    /** 
    * Clears all recipients assigned in the ReplyTo array. Returns void. 
    * @return void 
    */ 
    public function ClearReplyTos() { 
    } 

    /** 
    * Clears all recipients assigned in the TO, CC and BCC 
    * array. Returns void. 
    * @return void 
    */ 
    public function ClearAllRecipients() { 
    } 

    /** 
    * Clears all previously set filesystem, string, and binary 
    * attachments. Returns void. 
    * @return void 
    */ 
    public function ClearAttachments() { 
    } 

    /** 
    * Clears all custom headers. Returns void. 
    * @return void 
    */ 
    public function ClearCustomHeaders() { 
    } 
+0

Buon lavoro, Brad. Questo è il modo migliore per ripulire l'indirizzo piuttosto che ricreare l'oggetto. Questa dovrebbe essere la risposta accettata ... ma solo un ragazzo ha votato in su. – VKGS

2

se si guarda attraverso il codice php mailer, c'è questo utile ClearAllRecipients metodo() se si desidera cancellare a, cc, bcc e tutto in una volta.