Foros del Web » Programando para Internet » PHP »

Envio de mail con phpmailer

Estas en el tema de Envio de mail con phpmailer en el foro de PHP en Foros del Web. Hola a todos: Tengo una duda, estoy implementando la clase phpmailer para el envío de correos hacia varios destinatarios. Mi consulta es la siguiente, resulta ...
  #1 (permalink)  
Antiguo 10/05/2005, 16:49
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Envio de mail con phpmailer

Hola a todos:

Tengo una duda, estoy implementando la clase phpmailer para el envío de correos hacia varios destinatarios. Mi consulta es la siguiente, resulta que todo funciona de maravillas, el problema es que a veces una misma casilla de correo recibe dos veces envezde una, el mismo correo luego de ser enviado, también me pasaba con la función mail() de php y aún con phpmailer me ocurre lo mismo. Alguien tiene idea que puede estar ocurriendo?. ¿x ke llega 2 veces cuando deberia ser una?

Gracias
  #2 (permalink)  
Antiguo 10/05/2005, 16:55
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 22 años, 3 meses
Puntos: 15
Bueno debes tomar en cuenta que phpmailer te permite enviar varios destinos brindandole unos valores a un array que el trae.

Pero tengo la sospecha de que extraes los email de una base de datos y mientras esta el bucle para recojer los email alli dentro haces el envio con php mailer.

Si este es el caso deberas fijarte que por default el phpmailer trae definido el array de cuenta 2 veces y metiendolo en este bucle lo multiplica.

Si verificas y esta el array direcciones con 2 valores dejale solo uno.

Otro detalle es que quizas el registro del email este repetido en la base de datos
mas de una vez.
  #3 (permalink)  
Antiguo 10/05/2005, 17:43
Saldu
Invitado
 
Mensajes: n/a
Puntos:
Hola gente,soy nuevo en esto,y quiero saber algo...el phpmailer,es un programa q permite enviar auto-emails? es decir,permite enviar auto-email cada vez q un usuario se registra,o llena un formulario?
Me explican como es bien su uso,y de donde me lo puedo bajar? gracias

Saldu
  #4 (permalink)  
Antiguo 10/05/2005, 20:39
Avatar de DvD AdN  
Fecha de Ingreso: mayo-2005
Ubicación: Frente al monitor
Mensajes: 610
Antigüedad: 19 años, 6 meses
Puntos: 0
El phpmailer no es un programa es una función de PHP para enviar e-mails.}

Saludos
__________________
Keep f***ing learning
Ask for f***ing help.
Use f***ing spell check.
Think about all the f***ing possibilities.
  #5 (permalink)  
Antiguo 11/05/2005, 07:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Iniciado por Saldu
Hola gente,soy nuevo en esto,y quiero saber algo...el phpmailer,es un programa q permite enviar auto-emails? es decir,permite enviar auto-email cada vez q un usuario se registra,o llena un formulario?
Me explican como es bien su uso,y de donde me lo puedo bajar? gracias

Saldu
Estas confundido ..

PHP Mailer no es más que un sustituto "avanzado" a la función mativa de PHP para enviar e-mails: mail() .. En su base es una "classe" (objeto) que en palabras "llanas" no es más que un montón de código PHP puro (se trabaja igual que cualquier otro código tuyo .. salvo que se usa como sus ejemplos describe).

Ahora .. el "uso" que tu le quieras dar eso ya depende de ti, de tus necesidades y de tu aplicación concreta.

Puedes ver su web oficial (documentación, ejemplos y bajarla) de:
http://phpmailer.sourceforge.net

Otro detalle a tener encuenta.. PHP en sí ni por su función mail() (www.php.net/mail) ni usando una de estas "classe" de envio de e-mails vía SMTP directo/mail()/sendmail .. envia el e-mail a su destinatario final, tan sólo lo entrega al "cartero" (tu MTA: Mail Transfer Agent) para que este lo entregue a su destinatario. Comento esto por que ese "MTA" es aparte de PHP .. (por si hacen sus pruebas en "local" en sus PC's tendrán que usar un servidor SMTP própio instalado en ese PC, o el de un proveedor que proporcione ese servicio de cuentas de e-mail con acceso POP/SMTP (al menos SMTP/IMAP)


Un saludo,
  #6 (permalink)  
Antiguo 11/05/2005, 08:46
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Gracias a todos por las respuestas, pero volviendo al tema, les comento que continúo con ese problema y no se a que se debe, resulta que envio el correo y la lista recibe el correo 3 veces, la primera muestra todas las direcciones, el segundo muestra solo la dirección que lo lee y con el tercero ocurre lo mismo que con el anterior, aquí pongo el código que armé y es el ke estoy usando haber si a alguien se le ocurre que puede ser :

Código PHP:
require("includes/class.phpmailer.php");
$mail = new PHPMailer();
$mail->PluginDir "includes/";
$mail->Mailer   "smtp";
$mail->Host     "smtp.host.com.ar";
$mail->SMTPAuth true;
$mail->Username "[email protected]";
$mail->Password "el_pass";
$mail->From     $email_from_mail;
$mail->FromName $email_from_name;

$query  "SELECT email FROM nuke_newsletter where status = 2";
$result = @MYSQL_QUERY($query$dbi);

while (
$row sql_fetch_array ($result$dbi))
{
$email_betreff "$thema";

    
$mail->Subject $email_betreff;
    
$mail->Body    $emailbody;
    
$mail->AltBody $bodytext1;
    
$mail->AddAddress($row["email"]);
    
$mail->Send();
    if(!
$mail->Send())
    {
       echo 
"<br>Problemas enviando correo electrónico a: " $row["email"] . " ";
       echo 
"(" .$mail->ErrorInfo")<br>";    
    }
    else
    {    
       
$mensaje="<br>Boletín enviado a: " $row["email"] . "<br>";
            echo 
$mensaje;
    }
$mail->ClearAddresses();


Desde ya, graxias por sus opiniones
  #7 (permalink)  
Antiguo 11/05/2005, 13:16
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Bueno, con sql_fetch_array he solucionado lo del 3er mail, ahora envia todo bien, pero no hay caso con los mails duplicados, me envía 2 por correo será algo de la clase? ya he intentado todo pero sigue igual

  #8 (permalink)  
Antiguo 11/05/2005, 13:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cuando tu usas el método:
$mail->Send();

se envia el e-mail .. No puedes hacer esto:
$mail->Send();
if(!$mail->Send())

Así envias dos veces el e-mail y sólo en uno de ellos (el último envio) verificas si se envió o no (vía el IF() que usas)

elimina el primer $mail->Send() y listo ..

Un saludo,
  #9 (permalink)  
Antiguo 11/05/2005, 19:20
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Gracias Cluster, ah funcionado perfectamente, solo me queda una duda para terminar con este tema y es que cuando comienza el envio todo va bien pero llega un momento en que se queda la barra verde de estado del navegador a la mitad y pasados unos segundos da la pantalla de error que no se puede mostrar página.
Me imagino que será por el set_time_limit del servidor pero no se si será la solución colocarlo a 0 en mis scripts ya que el servidor donde tengo la web tiene el safe_mode en ON, lo que me queda es ver que otras alternativas tendría para que en 30 segundos no me de que no se puede mostrar página, en todo caso tal vez enviando cada, por ejemplo 50 correos, pero como puedo hacer esto?, enviar los primeros 50 en la base de datos, cerrar el script y luego continuar con los próximos 50 y asi suscesivammente (tengo mas de 700 en lista de correos para enviar)

Última edición por mixba; 11/05/2005 a las 20:29
  #10 (permalink)  
Antiguo 12/05/2005, 10:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Si usan en tu servidor "SAFE MODE" .. no vas a poder aumentar el tiempo máximo de ejecución de tus scripts tu mismo (ni con set_time_limit() y por un .htaccess por ejemplo) ..

El tema de crear ese "loop" cada 50 e-mails enviados .. podría ser redireccionando .. No es una medida muy "ortodoxa" pero tal vez funcione.

Tendrías que gestiar una variable de control (por el URL o sesiones) para irte guardandando donde (en que registro) te quedastes y así manejar una consulta con "LIMIT" de Mysql para obtener desde el registro que te quedastes +50 registros (LIMIT $contador,50)

Más o menos sería:

Código PHP:
<?
if (!isset($_GET['contador'])){
   
$contador=0;
} else {
   
$contador=$_GET['contador']
}

$sql="SELECT ..... .. LIMIT $contador,50";
While (.......){
}

header ("Location: $_SERVER['PHP_SELF']."?contador=".$contador+50);
?>
Un saludo,
  #11 (permalink)  
Antiguo 12/05/2005, 22:16
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Gracias Cluster!

Todo funciona muy bien, pero de todas maneras estoy trabado con algo que me está rompiendo la cabeza y es que no me redirecciona el header, a ver si me explico, si elimino la linea del header ("Location con //, entonces realiza las primeras 50 consultas correctamente, si coloco a "mano" el contenido de Location, lo que va entre ("Location: todo esto"); con el valor 100 de contador, me realiza la consulta correctamente y me devuelve los siguientes registros, ahora, cuando le saco las barras de comentario //, se me queda el navegador trabado y no hace mas nada. Esto esta dentro de una sentencia que a su vez esta dentro de otra y previamente hace otras consultas en el mismo script antes de llegar a este punto como asi también genera los diferentes templantes que previamente fueron seleccionados para su posterior envio, todo esto último queda anulado en la próxima redirección. Me pregunto si tendrá algo que ver el método de envio, este es un get, no debería ser post?, la cuestión es que asi como debería recoger los templantes y otras consultas, también lo debería hacer con distintas variables previas a esa sentencia, es que las únicas variables que recoge son las que están dentro de esta última sentencia en la que está el bucle. La línea header que estoy usando es la siguiente:

Código PHP:
header ("Location: " $_SERVER['PHP_SELF'] . "?op=boletin&action=send&nltr=$nltr&contador=" . ($contador 50)); 
Desde ya muchas gracias

Última edición por mixba; 12/05/2005 a las 23:52
  #12 (permalink)  
Antiguo 12/05/2005, 23:33
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Sospecho que efectivamente es que al ser get está ovbiando el resto de las variables fuera de este if() {bucle} encerrar todas las variables como globales...mmmm... no terminaría jamás.

Habrá aguna forma de hacer el envío al método post, o me quedará hacer un formulario, cuando llege a los 50, presionar enviar y asi hasta completar los 700 correos de la lista?...

...? no se me ocurre otra cosa.

Agradezco mucho las opiniones
  #13 (permalink)  
Antiguo 13/05/2005, 06:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Si, tienes razón .. la propuesta que te mencioné le faltaría una validación tipo:
Código PHP:
if (mysql_mum_rows($resultado)){
// ejecutas tu consulta SQL (while(.....)....) y el "location" para los siguientes 50 registros.
} else {
// redireccionas a tu página de "ya terminé el proceso".
header ("Location: termine.php");

(en tu caso veo que usas otro tipo de funciones: sql_fetch_array() .. supongo que alguna tendrás para ver si tu consulta arroja resultados (cuantos > 0) o no ...)

Un saludo,
  #14 (permalink)  
Antiguo 13/05/2005, 09:00
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Cluster:

Es verdad, pero esta validción

Código PHP:
if (mysql_num_rows($resultado) >= $contador){ 
sería para saber cuando llega al final de la consulta, es decir, al último registro y luego si me redirecciona a la página de finalización, eso esta muy bien y es algo que faltaba, pero de todas maneras el problema es otro y es que no me está pasando las variables fuera de esta sentencia

Código:
admin.php?op=boletin&action=send&nltr=$nltr&contador=
las setencias de las que te hablo son las que corresponden a action=send y nltr=$nltr, antes que estas dos hace otro tipo de validaciones y al ser get no está pasando las variables, es ke en el próximo "pase" por la función lo hace pero por la última sentencia omitiendo lo que esta en el resto del script, los códigos que me has indicado funcionan y realizan el proceso correctamente pero como ya he dicho antes lo que no me pasa es el contenido de las variables previas como el contenido del mensaje, el templante, etc.

Gracias y disculpen las molestias
  #15 (permalink)  
Antiguo 13/05/2005, 09:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
mm podrías poner el código completo que usas? ..

Bueno .. de todas formas si decies usar una "función" .. recuerda que a esta tendras que pasar tus variables .. ya sea por referencia o por declaración global .. Si a tu script en un primer inicio llegan esas variables por "POST" y así las recoges .. para la próxima recarga será por "GET" .. Para no tener que "saber" si la variable llega por POST o GET .. puedes usar: $_REQUEST['nombre_variable'] .. que como global que es . no tendras ni que pasar como "parámetro" o declararlas como globales en tu función. Todo esto que te comento es "ambito de variables" (o "scope").

Un saludo,
  #16 (permalink)  
Antiguo 13/05/2005, 19:55
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
El código del script es algo asi:

Código PHP:
if ($action == "") {

echo
"<form action=\"admin.php?op=newsletterneu\" method=\"post\">
<h4>Area solo texto</h4><textarea rows=\"10\" cols=\"75\" name=\"bodytext\">$bodytext</textarea><br><br>
<h4>Area HTML</h4><textarea rows=\"20\" cols=\"75\" name=\"inhalt\"></textarea><br><br>
Asunto: <br><input type=\"text\" name=\"thema\"><br>
Remitente: <br><input type=\"text\" name=\"sender\"><br><br>
<input type=\"hidden\" name=\"datum\" value=\"$aktuellesdatum\">
<input type=\"text\" name=\"T1\" size=\"1\" maxlength=\"2\">&nbsp;x Noticias<br>
<input type=\"down\" name=\"T2\" size=\"1\" maxlength=\"2\">&nbsp;x Descargas<br>
<input type=\"forum\" name=\"T3\" size=\"1\" maxlength=\"2\">&nbsp;x Tópicos del foro<br><br>
<IMG alt='' src='$nukeurl/modules/Newsletter/images/T1.gif' width=25 border=0 align='absmiddle'>&nbsp;
<input type=\"radio\" name=\"template\" value=\"1\" checked> Plantilla 1<br>
<IMG alt='' src='$nukeurl/modules/Newsletter/images/T2.gif' width=25 border=0 align='absmiddle'>&nbsp;
<input type=\"radio\" name=\"template\" value=\"2\"> Plantilla 2<br>
<IMG alt='' src='$nukeurl/modules/Newsletter/images/T3.gif' width=25 border=0 align='absmiddle'>&nbsp;
<input type=\"radio\" name=\"template\" value=\"3\"> Plantilla 3<br>
<IMG alt='' src='$nukeurl/modules/Newsletter/images/T4.gif' width=25 border=0 align='absmiddle'>&nbsp;
<input type=\"radio\" name=\"template\" value=\"4\"> Plantilla 4<br><br>"
;
}

............
consultas a base de datos

if ($action == "send") {

$from_name "Nombres";
$host_smtp "smtp.host.com";
$user_smtp "[email protected]";
$pass_smtp "elpass";
include (
"modules/Newsletter/templates/T$template.php");

......
otras sentencias hasta el 6

if ($nltr==6) {
global 
$user_prefix$sitename$dbi$nukeurl$adminmail;
$email_from_mail $adminmail;
$email_from_name $from_name;
$email_betreff "$thema";
require(
"includes/class.phpmailer.php");
$mail = new PHPMailer();
$mail->PluginDir "includes/";
$mail->Mailer   "smtp";
$mail->Host     $host_smtp;
$mail->SMTPAuth true;
$mail->Username $user_smtp;
$mail->Password $pass_smtp;
$mail->From     $email_from_mail;
$mail->FromName $email_from_name;

$resultado sql_query("SELECT email FROM nuke_newsletter where status = 0"$dbi);

if (
mysql_num_rows($resultado) >= $contad){

if (!isset(
$_GET['contad'])){ 
   
$contad=0;
} else {
   
$contad=$_GET['contad'];
}

$result sql_query("SELECT email FROM nuke_newsletter where status = 0 LIMIT $contad,50"$dbi); // or status = 2 or status = 4

while($row sql_fetch_array($result$dbi)) {

    
$mail->Subject $email_betreff;
    
$mail->Body    $emailbody;
    
$mail->AltBody $bodytext;
    
$mail->AddAddress($row["email"]);
    if(!
$mail->Send())
    {
       echo 
"<br>Problemas enviando correo electrónico a: " $row["email"] . "";
       echo 
"(" .$mail->ErrorInfo")<br>";    
    }
    else
    {    
       
$mensaje="<br>Boletín enviado a: " $row["email"] . "<br>";
            echo 
$mensaje;
    }
$mail->ClearAddresses();

}

header ("Location: " $_SERVER['PHP_SELF'] . "?op=newsletterneu&action=send&nltr=$nltr&contad=" . ($contad 50));

} else {

echo 
"<br><br>El boletín fué enviado a toda la Lista de Correo. Esto es lo que será visto:<br>";
echo 
"<br><b>Eviado por: </b>$sender <br>
<b>Acerca: </b>$email_betreff<br>"
;
echo 
$emailbody;
$msg_mail_arch $emailbody;
$fichi fopen("modules/Newsletter/archives/".date(Ymd).".html""a");
fwrite($fichi,$msg_mail_arch."<br>");
fclose($fichi);
}
} else {
echo 
"<br><hr><font color=red>El boletín no fué enviado a la Lista de Correo</font><br>";
}

Entonces me da estos errores al finalizar las secuencias:
Warning: main(modules/Newsletter/templates/T.php): failed to open stream: No such file or directory in c:\appserv\www\web\admin\modules\newsletterneu.php on line 299

El script completo es demasiado largo asi ke lo he resumido, en realidad trabaja con un formulario en post que me pasa todas las variables, el problema es al enviar cada 50 mails, alli ocurre que no pasa las variables como ves T.php por ejemplo, deberia ser T(número).php, como ocurre con las variables $sender, $bodytext, $emailbody, que son las que vienen desde el formulario y están fuera del if()

Última edición por mixba; 13/05/2005 a las 20:27
  #17 (permalink)  
Antiguo 14/05/2005, 15:33
Avatar de mixba  
Fecha de Ingreso: noviembre-2003
Ubicación: CPU (Interior)
Mensajes: 116
Antigüedad: 21 años
Puntos: 0
Solucionado!

Gracias!
  #18 (permalink)  
Antiguo 21/07/2005, 17:13
 
Fecha de Ingreso: febrero-2002
Mensajes: 442
Antigüedad: 22 años, 9 meses
Puntos: 2
Hola!... amigos phperos... mixba me interesaria saber como resolviste tu problema... porque estoy en la misma situacion!!!.. uuuaaaaaa!
Se que este post es medio viejito ya!... pero bue... tal vez pueda revivir!...
Gracias a todos... saludos!
__________________
tech-nico.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:00.