2010-09-16 35 views
8

cuando envío un correo electrónico recibo dos correos electrónicos pero debe enviar un correo electrónico a los respectivos correos electrónicos. ¿Problema de enrutamiento?bucle de 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

Primero, realice una depuración básica. Se refiere a un 'mail_vars [4]' que no existe en absoluto –

+0

¿De qué se trata '$ f ++;'? – RobertPitt

+0

Lo siento es $ mail_vars [2] –

Respuesta

4

Se necesita una:

$mail=new PHPMailer() 

en el comienzo de su for bucle -como lo es, la segunda vez a través de él simplemente se mete un poco con el primer correo electrónico (ya que uno nuevo no es creado).

Como señaló, el cuerpo también debe reiniciarse; de ​​hecho, con una var separada no es muy útil, es mejor suministrarlo directamente al MsgHTML. Dado que el contenido de su correo electrónico es trivial, es posible que también desee enviar una versión de texto sin formato (depende de su destinatario objetivo, supongo). Así que la secuencia de comandos actualizada:

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

$ cuerpo debe reiniciarse en la parte superior en el ciclo –

+0

Sí cierto - claramente lo tienes trabajando lo suficiente como para haberlo averiguado;) Realmente no lo haces Necesito la varilla '$ body' {edit} – Rudu

+0

Si está enviando una contraseña (o cualquier tipo de contenido personalizado), debe llamar a' $ mail-> AltBody = ''; 'antes de' $ mail-> MsgHTML() ', o la versión de texto de su correo electrónico contendrá el contenido del primer destinatario. – Hobo

33

Mirando a través de la fuente de PHP Mailer, tendrá que limpiar los campos. Al menos la dirección, tal vez más. Aquí está la sección del código de la clase PHPMailer que tiene las funciones claras. Es más que bienvenido mirarlos y probarlos, etc. Esta es obviamente una alternativa a la creación de una nueva instancia de un objeto nuevo, que puede causar o no una pérdida de memoria (dependiendo de la cantidad de llamadas que le haga).

Así que la implementación del código clearAddresses:

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

Quité el código real ya que sólo necesita la descripción y el nombre de la función.

///////////////////////////////////////////////// 
    // 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

Buen trabajo, Brad. Esta es la mejor forma de limpiar la dirección en lugar de volver a crear el objeto. Esta debería ser la respuesta aceptada ... pero solo un hombre votó a favor. – VKGS

2

si se mira a través del código php gestor de correo, no es esto útil ClearAllRecipients método() si desea borrar a, CC y CCO todos a la vez.

Cuestiones relacionadas