Foros del Web » Programando para Internet » PHP »

Envío masivo de emails

Estas en el tema de Envío masivo de emails en el foro de PHP en Foros del Web. Hola, bueno, he hecho un sistema para enviar emails masivo a todos mis usuarios, para no tener que mandar uno a uno, pero la verdad, ...
  #1 (permalink)  
Antiguo 07/07/2004, 08:30
 
Fecha de Ingreso: octubre-2003
Ubicación: FMSite
Mensajes: 336
Antigüedad: 14 años, 1 mes
Puntos: 2
Envío masivo de emails

Hola,

bueno, he hecho un sistema para enviar emails masivo a todos mis usuarios, para no tener que mandar uno a uno, pero la verdad, no sé si funciona, me parece que no...

éste es el código:
Código PHP:
<? switch($pg){
default: 
?>
<form name="form1" method="post" action="<? echo 'admin.masivo.php?pg=envi'?>">
  <table width="100%" border="0">
    <tr bgcolor="#CBAA3A"> 
      <td colspan="2"><strong><font size="2" face="Arial, Helvetica, sans-serif">Env&iacute;o 
        Masivo de Emails</font></strong></td>
    </tr>
    <tr> 
      <td width="10%"><strong><font size="2">Asunto:</font></strong></td>
      <td width="90%"> <input name="asunto" type="text" id="asunto"> </td>
    </tr>
    <tr> 
      <td valign="top"><strong><font size="2">Mensaje:</font></strong></td>
      <td><textarea name="mensaje" cols="80" rows="10" id="mensaje"></textarea></td>
    </tr>
    <tr>
      <td valign="top">&nbsp;</td>
      <td><input type="submit" name="Submit" value="Enviar"></td>
    </tr>
  </table>
</form>
<?
break;
case 
envi:
include(
'../conex.php');
$asunto $_POST['asunto'];
$mensaje $_POST['mensaje'];
$sql "SELECT email FROM users";
$consulta mysql_db_query($dbname,$sql) or die (mysql_error()); 
while(
$row mysql_fetch_array($consulta)) { 
$email $row['email'].", ";
}
mail ($email $asunto 
$mensaje."

----------
Black_River
WebMaster
www.cmblackriver.net"
"From: [email][email protected][/email]");
echo 
"Enviando....";
?>
<script language="JavaScript" type="text/javascript">
    function cambia(){
    window.location.href = 'admin.php';
}
    setTimeout("cambia()",5);</script>
<? 
break; } ?>
todo ese es el código, no hay más.

A ver qué podeis sacar, algún error o algo
__________________
http://www.fmsite.net/
  #2 (permalink)  
Antiguo 07/07/2004, 09:36
 
Fecha de Ingreso: octubre-2003
Mensajes: 152
Antigüedad: 14 años, 1 mes
Puntos: 2
porque no averiguas un poco de phpmailer
  #3 (permalink)  
Antiguo 07/07/2004, 11:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. por qué dices que "no sabes si funciona" .. acaso no lo has probado? ..

Lo puedes probar de muchas formas, Partiendo por ver si obtieens los registros de tu BD como corresponde (y los que esperas) .. hacer "echo" a tus variables implicadas y de ahí obtener mensajes de error de mail() si los hay (mail() se puede usar como condicional if (mail(....)) .. devolverá un "true" si consiguió entregar el e-mail al MTA que uses (servidor de e-mail: SMTP, IMAP o similar) y un "false" si falla.

De ahí .. a que el e-mail llegue o no a la cuenta indicada ya es otro tema que tendrás que ir viendo por los LOGs de ese servidor SMTP que use PHP (o el MTA que uses) .. y por supuesto de probar con alagunas cuentas (+1 ya sería "masivo" xD).

Un saludo,
  #4 (permalink)  
Antiguo 22/07/2004, 22:20
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 14 años, 2 meses
Puntos: 1
Eso no te va a ir:
Lo que harás será mandar el mail al último o el primero (no sé) correo que encuentre la consulta, en todo caso, un solo registro.
Tú con el bucle recorres los registros y guardas cada uno en la variable $email, pero esta si no es un array no puede contener más que un registro.

De todas formas: ¿No es más fácil para la comprobación chequear la variable $email??????, para qué complicarse cuando solo quieres saber si te envia emails masivos no?.

Otra cosa, si incluyes la funcion mail() en el bucle, si que te enviará el mail a cada uno de los usuarios (que decidas claro) pero seguirá siendo engorroso ya que llamarías a la función mail() un huevo de veces, tantas como registros tengas en la DB, por no hablar del consumo de recursos.

Bueno, yo también estoy interesado en aprender como hacerlo, aún no domino muy bien los arrays y... hasta aquí he llegado por hoy:
Código PHP:
// Destinatarios
 
if ($_POST[destn] == 'todos')
{
 
$query_todos mysql_query("SELECT * FROM usuarios") or die("Error: ".mysql_error());
$result_todos mysql_num_rows($query_todos);
  for (
$i=0$i<=$result_todos$i++)
  {
  
$row_todos mysql_fetch_assoc($query_todos);
  (
$i+1);
  
$array_correo[$i] = $row_todos[correo];
  }
}
else
{ ... 
Hasta aquí consigo tener mis correos en un array con tantos índices como registros, pero como los paso a la función mail()???.
He pensado en algo del foreach pero tampoco sé mucho como usarlo y menos aquí.

Porque... no se puede usar un bucle for de nuevo dentro de la función mail() no? gg , no llego a mucho más.

Un saludo y una ayudilla please.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 23/07/2004 a las 04:51 Razón: Más cosas
  #5 (permalink)  
Antiguo 23/07/2004, 07:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La función mail() de PHP acepta como destinatarios un grupo de e-mails separados por comas .. así que tu array que ya contiene los e-mails podrías aplicar: implode() usando como separador la coma para llevarlo a tu mail() ..

Pero .. por qué no usas mail() en el bucle que actualmente generas ese array . .es decir . .enviar un e-mail a cada pasada de tu bucle .. Te ahorrarías leer denuevo el array (con otro bucle) para usar mail() cuando ya lo haces una vez anteriormente, de paso te serviría para controlar de forma independiente el envio de cada uno de esos e-mail y generar registros/logs si lo amerita.

Un saludo,
  #6 (permalink)  
Antiguo 24/07/2004, 05:20
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 14 años, 2 meses
Puntos: 1
Umm, vamos a ver, perdón eh pero Cluster, ¿has leido mi mensaje anterior gg ??:
Dije:
Cita:
Otra cosa, si incluyes la funcion mail() en el bucle, si que te enviará el mail a cada uno de los usuarios (que decidas claro) pero seguirá siendo engorroso ya que llamarías a la función mail() un huevo de veces, tantas como registros tengas en la DB, por no hablar del consumo de recursos.
Imagina que escogo todos los usuarios y tengo umm 1.000 usuarios, crees que es lógico llamar a la función mail() 1.000 veces????, o enviar 1.000 correos??? .

Lo lógico, y creo que la solución es esta:
meter los elementos del array en la función mail() y, Cluster, ahí está el problema, porque evidentemente sé que la función mail() de PHP acepta como destinatarios un grupo de e-mails separados por comas, de hecho... gg es lo que dije que quería hacer.
Muchas gracias en este sentido ya que no caí en implode()... que torrrrrpeeeee

Bueno, muchas gracias por la ayuda.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 24/07/2004 a las 05:34
  #7 (permalink)  
Antiguo 24/07/2004, 10:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Imagina que escogo todos los usuarios y tengo umm 1.000 usuarios, crees que es lógico llamar a la función mail() 1.000 veces????, o enviar 1.000 correos???
Pero .. tu conces realmente como funciona mail() ?

te comento que mail() NO devuelve el proceso a tu script (continua la ejecución del mismo y por ende tiene al cliente en espera de respuesta) hasta que envie esos 1000000 mails que compongas en una cadena de e-mails separados por comas.

Es decir:
1) No vas a tener control de que e-mails falla el envio (por lo menos la parte que mail() reconoce que es "la entrega" del e-mail al MTA a usar). No sé tu aplicación en concreto .. pero a mi me suele importar tener ese control para generar log's de como fué el envio.

2) Si bien el envio va a demorar menos tiempo en el envio .. no te creas que vas a enviar esos 100000 mails a mail() y te va a devolver el control al instante mientras tu servidor SMTP o MTA concreto se trabaja el envio de los e-mails (Relay). Lo mejor para esto es que pruebes ambas técnicas y decidas tu mismo.

Consejo:
Usa envio directo de tus e-mails por SMTP (no con mail de PHP) para esto te puede ayudar la classe:

PHP Mailer (http://phpmailer.sourceforge.net)
El envio por SMTP (directo) te permitirá (y con esta classe más) "balancear" la carga de envio de N e-mails entre vários servidores SMTP .. siendo esta classe la que simultáneamente le envia parte de los e-mails que se han de enviar a cada SMTP indicado ..

Un saludo,

Última edición por Cluster; 24/07/2004 a las 10:23
  #8 (permalink)  
Antiguo 24/07/2004, 22:19
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 14 años, 2 meses
Puntos: 1
Uy, uy, tranquilo colega.
Claro que sé que tendrá al cliente en espera, ya leí por ahí alguién que tenía este problema, pero como muy bien dices es cuestión de comprobar que es mejor para la aplicación en concreto.
Ahora que lo dices pues sí, 1.000 correos en la función mail pos lo más lógico es que alguno falle y no se consiga el propósito, pero yo me pregunto, acaso no sería tan engorroso como la llamada X veces a la función en un bucle??.
Control del proceso sí, pero a qué costo?. Bueno, como decías es estimar cual de las dos opciones es más recomendable en este caso.

He leido y visto por ahí lo de la clase PHP-mailer, pero por ahora prefiero no complicar demasiado más mi aplicación, menos sin tener demasiado conocimiento de las clases porque paso de usarla sin entenderla del todo.

En fin, por ahora prefiero usar mail con varios destinatarios, cuando mi DB crezca es muy seguro que use el bucle, pero...
buff, vuelvo a preguntarme si no será mucha caña llamar a esa función por ejemplo 1.000 veces???.

Bueno muchas gracias por todo y please, tranquilo eh?, yo te cité porque repetias lo del incluirla en el bucle que ya lo comenté en el primer post, por nada más, no pretendí ofenderte.

Un saludo.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #9 (permalink)  
Antiguo 25/07/2004, 11:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
(no me ofendistes .. para esto esta el foro .. para discutir (cada cual con sus argumentos) soluciones a un problema).

Cita:
He leido y visto por ahí lo de la clase PHP-mailer, pero por ahora prefiero no complicar demasiado más mi aplicación, menos sin tener demasiado conocimiento de las clases porque paso de usarla sin entenderla del todo.
Es tan simple de usar como probar sus ejemplos .. Conforme requiera tu aplicación de otras funcionalidades como por ejemplo: envio de archivos adjuntos, de generar un e-mal en HTML con imagenes incrustradas (no referenciadas), etc .. ya usaras los métodos adecuados (que en su tutorial describe bien su uso).

Por mi parte ya no uso "mail()" de PHP uso esta classe (hasta la fecha la más completa que he visto sobre el tema: por eso la suelo recomendar) .. Si lees la documentación de esta classe .. hasta puede usar mail() de PHP (usando la configuración de PHP para enviar el e-mail con el MTA que use PHP) o STMP o sendmail directo .. así que es bastante versatil gestionar todo tipo de e-mail con esta classe.

Cita:
buff, vuelvo a preguntarme si no será mucha caña llamar a esa función por ejemplo 1.000 veces???.
El nº de veces que llames a esa función será lo de menos .. lo más que te puede suceder es que sobrepases el tiempo de ejecución -por defecto- de PHP para ejecutar un script .. así que tendrás que aumentar dicho tiempo de ejecución vía set_time_limit()

Por otro lado ..retomando el tema de "dejar colgado al cliente en espera de que termine el proceso" .. tienes la función de PHP:

register_shutdown_function()

más info:
http://www.php.net/manual/en/feature...n-handling.php

Que te permite "lanzar" la ejecución de una función y que PHP siga el proceso hasta que termine pese que el cliente pueda cerrar su "navegador" ignorandolo.


Un saludo,
  #10 (permalink)  
Antiguo 26/07/2004, 13:07
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 14 años, 2 meses
Puntos: 1
Sisi, en llamar a la funcio x veces me refería a eso, no ha llamarla propiamente claro. Sobre PHP Mailer bueno, he estado viendola un poco y habrá que probarla a ver que pasa, mi aplicación no requiere nada en especial en el envio de mails pero sí requerirá el envio de "muchos" mails y también que es altamente recomendada.
Por otro lado no conocía lo de register_shutdown_function(), muy interesante, me gustaría encontrar otras funciones de este tipo como por ejemplo la gestión de errores php sin tener que modificar archivos PHP en el server ya que no es propio.

Un saludo y de nuevo gracias.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #11 (permalink)  
Antiguo 26/07/2004, 15:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
otras funciones de este tipo como por ejemplo la gestión de errores php sin tener que modificar archivos PHP en el server ya que no es propio.
error_reporting() de ahí .. en adelante .. pues en PHP pudes "reescribir" completamente las rutinas de control de errores de PHP propiamente para que tu aplicación tenga el control absoluto de los errores que se proboquen.

Todo lo tienes en:
www.php.net (hecha un vistazo al indice y los temas que te interesen o desconozcas .. entra a verlo).

Un saludo,
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 10:28.