Enviar email multiple con PHP

En algunas ocasiones nos topamos con la necesidad de enviar email a una lista de correo, esto lo podemos hacer utilizando la librería PHPMailer el cual nos permite enviar emails con algunas opciones avanzadas para este tipo de labores.

Extraer datos de los destinatarios
Sea que tenemos una lista de clientes registrados en una base de datos tienda en la tabla clientes y deseamos enviarle un comunicado a cada uno de ellos de forma personalizada. Lo primero que tenemos que hacer es realizar la consulta a la base de datos y extraer los datos de estos clientes.

mysql_connect("localhost", "usuario", "password"); 
mysql_select_db("tienda"); 
$result = mysql_query("SELECT nombres, email FROM clientes"); 
while ($row = mysql_fetch_array($result)) {
   // echo $row["nombres"];
}

Integrando con PHPMailer
El siguiente paso es hacer el envío de los correos, para ello primero incluimos la clase class.phpmailer.php, definimos los datos del remitente y creamos el mensaje personalizado en html y texto a enviar a la lista.

require("class.phpmailer.php");

$mail = new PHPMailer();
$mail->Host = "smtp1.example.com";
$mail->From = "list@domain.com";
$mail->FromName = "List manager";
$mail->Subject = "Subject del correo";

mysql_connect("localhost", "usuario", "password"); 
mysql_select_db("tienda"); 
$result = mysql_query("SELECT nombres, email FROM clientes"); 
while ($row = mysql_fetch_array($result)) {
	// HTML body 
	$body = "Hola ".$row["nombres"].", "; 
	$body.= "

Les comunicamos el nuevo servicio...

"; $body.= "List manager"; // Text body $text = "Hola ".$row["nombres"].", \n\n"; $text.= "Les comunicamos el nuevo servicio...\n\n"; $text.= "List manager"; // Configurar Email $mail->Body = $body; $mail->AltBody = $text; $mail->AddAddress($row["email"], $row["nombres"]); // Enviar el email if(!$mail->Send()) { echo "Error al enviar a: " . $row["email"] . "
"; } $mail->ClearAddresses(); }

Nótese que incluimos la dirección del destinatario con el método AddAddress en donde le pasamos el email y el nombre de la persona a la que deseamos enviar el email y finalmente utilizamos ClearAddresses el cual elimina las email a los cuales se ha enviado anteriormente el mensaje, de esta forma le llegará a cada usuario una mensaje único si necesidad de mostrar a quienes mas se esta enviando el mensaje.

Observaciones
En el caso que se quiera enviar a listas muy grandes, se deben cambiar algunos parámetros de configuración de PHP por ejemplo el tiempo de ejecución para que no se detenga el envío si el tiempo de proceso excede el tiempo de configuración. Una solución es hacer el envío en bloques de 500 o en bloques de 1000 por vez por ejemplo con lo cual no se superará el tiempo limite.

Finalmente les dejo los archivos fuente para que lo descarguen y realicen sus propias pruebas.

Comentarios Total 46 comentarios

TomasDEV
Publicado: 23/06/2008 12:48 pm

Preguntilla… ademas de la config del tiempo de load, puedo hacer:

[php]
require(«class.phpmailer.php»);

$mail = new PHPMailer();
$mail->Host = «smtp1.example.com»;
$mail->From = «list@domain.com»;
$mail->FromName = «List manager»;
$mail->Subject = «Subject del correo»;

$body = «lo que sea»;

// bd …
while($bd){
$mail->AddAddress(«$bd», «$bd»);
}

$mail->Send();

[/php]

o dices que no funcionara? me refiero si esta libreria tiene un limite de maximos de destinatarios.

unijimpe
Publicado: 23/06/2008 10:24 pm

Es muy probable que haya un limite de direcciones de correo a la cual se pueda enviar el correo a la vez por lo cual es recomendables hacer el envío uno por uno a cada usuario.

Mahatma
Publicado: 25/06/2008 11:33 pm

De lujo mi hermano, realmente andaba buscando algo así. Soy un gran admirador de tu trabajo. Todo lo que he encontrado aquí me ha servido muchísimo. Muchas gracias.

TomasDEV
Publicado: 01/07/2008 5:02 pm

y … idea de ese numero de maximo usuarios a la vez?

para 15.000 usuarios creo que tardara pero luego implantare el sistema y te cuento.

deivisjoro
Publicado: 11/07/2008 1:43 pm

Gracias por la información, pero tengo un problema, estoy trabajando con un servidor local y me da un error:

require(«class.phpmailer.php»);
$mail = new PHPMailer();
$mail->Host = «www.aves.edu.co»;
$mail->From = «dsalas@aves.edu.co»;
$mail->FromName = «Servidor web»;
$mail->Subject = «Socio nuevo»;
$mail->AddAddress(«deivisjoro@hotmail.com», «Altas»);
$body = «Nuevo socio\r\n»;
$body .= «Nombre: $nombre\r\n»;
$body .= «Edad: $edad\r\n»;
$mail->Body = $body;
if(!$mail->Send())
echo $mail->ErrorInfo;

Could not instantiate mail function.

alex
Publicado: 14/07/2008 12:59 pm

buen tutotial
algun codigo para evitar el spam o una explicacion ya que en tu formulario no aplicas ninguna opcion para evitar el spam

Lester
Publicado: 24/07/2008 3:21 pm

deivisjoro… tu hosting o php tiene function ()mail?
porque si mal no estoy, este script usa esta funcion para poder mandar el mail…
Saludos :)…

oscar
Publicado: 27/07/2008 4:58 pm

me han encantado tus tutoriales pero quisiera saber cuantas tablas o cuales son las que necesita el mail lista ya que me sale el siguiente Orror:
«Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\bases\CORREO\php-mail-list\maillist.php on line 13
»
a lo cual ya tenia la base y las supuestas tablas pero al parecer solo hace conexion con la base.
gracias de antemano

hellenam18
Publicado: 18/08/2008 10:46 am

hola mira sabes esta recontra intrsante tu pagina, el phpmailer lo descarge y todo pero dime tengo q configurar algo en el phpmailer o no?`porfa ayudame si ? y q partes de phpmailer tendria q cambiar si me ayudas seria de buena infornmacion para ti,, cuidate y gracias, espero tu pronta respuesta

Javier
Publicado: 18/08/2008 1:19 pm

Excellente Hermano, estaba en busca de una class que hiciese esto y en lo personal que estuviese bien documentada y ordena, me parece esta muy buena, y en lo personal, soy admirar de tu blog ya que soy programador y en este blog he llegado por casualidad en busquedas de google y casi siempre he encontrado buen material y mas que todo buena documentacion de lo que tratas de explicar que es lo principal

efrain
Publicado: 20/08/2008 11:38 am

estoy trabajando localmente y me sale error como podria cconfiguralo localmente

ismael
Publicado: 14/09/2008 4:13 am

Yo Ya lo estoy poniendo en practica aunque por el momento solo para dos usuario..
Les dejo el Codio Ami Me Funciona…

Efrain yo estoy trabajando Localmente….
Te Dejo el Codigo….

Tienes que Actuvar en Apache el modulo ssl. para que Funcione..
IsSMTP();
$mail->Host = ‘ssl://smtp.gmail.com’;
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = ‘tumailaqui@gmail.com’;
$mail->Password = ‘tupasswors aqui’;

//$mail->Host = «ssl://smtp.gmail.com»;

$mail->FromName = «List manager»;
$mail->Subject = «Subject del correo»;

mysql_connect(«localhost», «root», «»);
mysql_select_db(«web_de»);
$result = mysql_query(«SELECT nombre, correoe FROM user»);
while ($row = mysql_fetch_array($result)) {
// HTML body
$body = «Hola «.$row[«nombre»].», «;
$body.= «Les comunicamos el nuevo servicio… «;
$body.= «List manager«;
// Text body
$text = «Hola «.$row[«nombre»].», \n\n»;
$text.= «Les comunicamos el nuevo servicio…\n\n»;
$text.= «List manager»;
// Configurar Email
$mail->Body = $body;
$mail->AltBody = $text;
$mail->AddAddress($row[«correoe»], $row[«nombre»]);
// Enviar el email
if(!$mail->Send()) {
echo ‘Error: ‘ . $mail->ErrorInfo;
echo «Error al enviar a: » . $row[«correoe»] . «»;
}
else {
echo «Mail enviado!»;
}
$mail->ClearAddresses();
}
?>

Claudio
Publicado: 17/09/2008 5:41 pm

Buenas!! Yo estaba haciendo algo muy similar con esto… pero me surgio un problema… estoy usando como servidor a Gmail, por lo tanto, estoy mandando los mails con una cuenta mia de Gmail… pero tengo algunos dramas… primero… tarda bastante en enviar… mandando 4 o 5 mails por minuto… y al intentar mandar 1000 mails, despues de los 400 o 500 me tira el siguiente error:
Mailer Error: Language string failed to load: data_not_accepted

Alguien podria darme una mano?? Gracias

LUIS FERNANDO
Publicado: 26/09/2008 10:35 am

Interesante todo comentario, quisiera saber como hago,,en mi PC tengo windows XP, y mi host tiene LINUX, como hago para trabajar en mi PC para luego subirlo a mi host, que tipo de PHP utilizo,, GRACIAS

Jose
Publicado: 18/11/2008 1:49 am

Hola migos, estuve probando la clase pero me sale el siguiente error:
unable to connect to ssl://smtp.gmail.com:465 (Unable to find the socket transport «ssl» – did you forget to enable it when you configured PHP?)

estuve revisando la configuracion del apache active ciertas lineas donde decia ssl pero no me funciona alguien sabe la solución?

alejandro lomio
Publicado: 11/12/2008 8:52 pm

Hola samigos:
Muy bueno el foro y saludos para todos.

Yo quiero saber si en forma adjunta integrada, se puede enviar una página php, es decir: necesito hacer unos newsletter que se desprenden de una consulta y esa página de consulta deseo enviarla como cuerpo del email, se puede?????

unijimpe
Publicado: 12/12/2008 10:33 pm

Si claro que se puede, una posibilidad es que antes de hacer el envío consultes a tu base de datos y armes el HTML que deseas envíar, esto lo guardas en una variable la cual posteriormente lo asignas al parámetro $mail->body.

joseinacio
Publicado: 02/01/2009 10:46 am

hola y si quieor insertar una imagen adjunta como hago………….

marcos u.
Publicado: 21/01/2009 1:25 pm

Hola Claudio

porque no intentas hacerlo con un cronjob para que no se te sature el server.

Saludos Marcos U.

Alex C
Publicado: 22/01/2009 3:45 pm

Hola Amigos alguie podria ayudarme, tengo el siguiente problema, al enviar el email no tengo ningun problema con el Script todo esta perfecto el problema esta en mi BD tengo un minimimo de 500 email y cuando lo envio me llega la siguiente notificacion.
Tambien aclaro que cuando envio despues de tardarse unos segundos me sale diciendo que no se pudo encontrar la pagina, enviando solo a unos tantos y no a los 500.
la notificacion es esta:

[Domain topwebperu.net has exceeded the max emails per hour (100) allowed.
Message discarded.]

espero que me ayuden o por lo menos que me expliquen de ¿como aumento el email maximo qe es (100) por hora? a 500 por hora?

unijimpe
Publicado: 25/01/2009 12:06 pm

Alex, eso tienes que pedirselo a tu proveedor de Hosting por que eso lo han preconfigurado en el servidor.

Cristian Bernal
Publicado: 04/02/2009 4:14 pm

Hola unijimpe, felicidades por tu trabajo, realmente es muy interezante.
Aprovechando de tus conocimientos quiero hacerte la siguiente consulta.
Estoy desarrollando un sistema de reservaciones sencillo, la idea es que cuando termines de hacer una reservacion te permita mandarla por mail pero como un archivo pdf adjunto, el archivo pfd ya lo tengo creado, solo que no tengo idea como hacer para enviarlo como adjunto cuando lo creo de manera dinamica, sera necesario guardarlo en algun direcotorio y luego adjuntarlo, espero haberme explicado.
Enviar un correo con datos extraidos de una base de datos, el cuerpo compuesto de HTML y un adjunto en pdf generado automaticamente.

Un saludo y espero que puedas ayudarme.

daniel
Publicado: 24/02/2009 2:21 pm

los mail a hotmails me llegan como spam!!!

Benjamin
Publicado: 26/02/2009 10:49 am

Hola Unijimpe, excelente trabajo, felicitaciones por todo el contenido que tienes en tu blog, me gustaría que me ayudes para evitar que los mails lleguen como spam¡¡¡ es lo único que no he podido resolver al respecto

Alvaro Grillet
Publicado: 02/04/2009 5:59 am

Buenos dias Unijimpe,

He utilizado phpmailer por mucho tiempo siempre con exito, hace 2 dias me baje la nueva version para php4 que se pueden hacer embed de imagenes y otras cosas mas.

Pero con esta nueva version tengo un problema al enviar correos a cuentas qeu estan fuera de mi servidor (que aloja varios dominios) es decir si quiero enviar a una cuenta gmail me da este error: Mailer Error: No pude crear una instancia de la función Mail.

Estoy usando autenticacion con datos completamente validos. Tienes idea de que puede causar el error?

Gracias de antemano y un saludo

amigo
Publicado: 21/04/2009 12:13 pm

hola a todos tengo una duda estoy probando este script y funciona pero hay un problema no se cual se pero les dire que en mi consulta la tengo asi select nombre,email from clientes where email!=»; (esto es para q solo lo envie a los q tengan correo y agilizar el script) y cuando envia el correo lo envia a sus respectivas cuentas pero por ejemplo cuando envia al cliente 1 le envia bien su correo pero cuando envia al cliente 2 le envia bien su correo pero tamnbien le esta enviando el correo del cliente 1 al cliente 2 y eso no debe ser espero q me puedan ayudar gracias

Juan
Publicado: 07/05/2009 12:58 am

«amigo», ¿has probado a quitar la dirección del cliente 1 antes de añadir la del cliente 2? Recuerda los métodos ClearAddress y AddAddress de la clase.

joeblack
Publicado: 07/05/2009 6:32 am

bueno, es simple, enviar por bucle no es la mejor idea, los errores habrán siempre y diferentes ya sea por cada servidor, algunos son rápidos otros no, etc. etc., Porque es errado ese tipo de envio? Cuando envias un email por este método es simple, la clase se construye, se configura (abrir, soket, revisar, comprobar, extender, etc etc)y luego se envia, esto funciona bien, y no le esfuerza al servidor cuando es solo un envio, Ahora imagínate que este proceso este en un bucle de 100++, pues le digo que no hay servidor que les caiga bien esa orden y si lo hace, lo hará en un tiempo extendido, la solución que les puedo recomendar es; armen todo la configuración del envio y que solo la función eviaremail() o sendemail() se quede detro del bucle, ya sea while(), for() etc etc, o sea while(){ sendmail() }, o for(){ sendmail() }, Con esto por lo menos el armaje se hará una sola vez y la función de enviar se hará repetidamente, les aconsejo tambien que la cadena string del cuerpo o boddy del mensaje lo haga fuera del bucle en cuenstión y guardarlo en una variable. Creo que con esto algunos errores se pueden obviar o pasar por alto. Espero que les haya sido de ayuda.

kechu7
Publicado: 08/05/2009 5:40 pm

daniel… toda direccion que no tengas en tu lista de contactos de hotmail es tratada como spam…

jose… repito lo mismo que comente en otro articulo para lo del OpenSSL

muy buen tutorial… voy iniciando en este blog y me eh encontrado con entradas realmente muy buenas…

para el openSSL has esto

agrega estas librerias al directorio
windows\system32
son las libeay32.dll,ssleay32.dll,php_openssl.dll
http://rapidshare.com/files/230755114/librerias_openSSL.rar

despues instala esto
http://rapidshare.com/files/230756153/Win32OpenSSL-0_9_8j.exe

y tambien descomenta la linea
extension=php_openssl.dll
en tu php.ini

eso realize yo… y me funciona perfectamente…

uso el appserv… en un servidor local

y me conecto a la BD del hosting free para enviar el boletin…

juan
Publicado: 22/05/2009 3:31 pm

hola como seria la parte para hacer el envío en bloques de 500, porq no quisiera q mi servidor se cuelge por querer mandar los mails todos juntos… si me podrias explicar como hacer para mandar por bloques te lo agradeceria mucho…

saludos y mil gracias por esta info q esta muuy buenaaa…

Juanico
Publicado: 23/05/2009 7:55 pm

Buenas, este método requiere el uso de servido smtp?

cacho
Publicado: 30/06/2009 3:22 pm

De lujo me salvaste la vida de nuevo con: $mail->ClearAddresses();

Gracias
Saludos !

nansy
Publicado: 28/07/2009 10:38 am

hola no funciona este codigo podrian indicarme com hacer por faveor

chains
Publicado: 31/08/2009 9:50 am

Tengo q hacer un newsletter pero me he dado cuenta q mi servidor solo permite 50 envios a la vez como hago para q mis envios se hagan de 50 en 50 en una lista de 4000 contactos..

Gracias

Infotools
Publicado: 25/03/2010 6:31 pm

Tengo X direcciones de correo que se van enviando dentro de $email de una en una

pero si aplico este comando no funciona.

$mail-> AddAddress(‘($email)’); // asi sino funciona

$mail-> AddAddress(«xxxxxx@gmail.com»); // asi si funciona

Que tengo que hacer par que me reconozca kos email introducidos en $email

Gracias a todos

unijimpe
Publicado: 25/03/2010 10:09 pm

Infotools, para agregar las direcciones de emails de los usuarios puedes utilizar AddAddress, de la siguiente forma:

$mail-> AddAddress($email);

Ricardo
Publicado: 06/06/2010 12:47 pm

donde puedo descargar esto —> require(«class.phpmailer.php»);

unijimpe
Publicado: 06/06/2010 3:12 pm

Ricardo, puedes descargar la librería PHPMailer en la web oficial. http://phpmailer.worxware.com/

Ricardo
Publicado: 06/06/2010 4:25 pm

ME LLEGA AL NO DESEADO, QUE DEBO PONER EN $Host = «smtp1.example.com»????????????????/

maria gabriela
Publicado: 12/07/2010 7:40 pm

Hola estoy queriendo mandar el mail multiple y me sale el siguiente error:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in \\hmfsw\web\dtcwin014\artewebmg.com.ar\public_html\demo_masivo.php on line 17

porque puede ser?
gracias!!

roger
Publicado: 15/09/2010 10:33 am

hola visitando por la web me encontre con tu blig y esta interesante eso de l envio de emails desde php

pero como se podria hacer para que mediante ese codigo se envie a 10.000 emails ahora el tiempo de llegada donde se configura en la clase,las librerias
con ese codigo puedo enviar a 10,000 emails me hara una saturacion donde controlo los tiempos
si me podrian decir por favor:
Gracias

Diego-el secreto
Publicado: 09/11/2010 6:18 pm

Gracias por todo esto, lo probare…yo utilizo Icontact que cuesta muy caro mensualmente o tengo que re sacarle el jugo cada mes para que alcance para pagarlo…

Gracias nuevamente…

Fatima
Publicado: 25/04/2011 1:39 pm

estoy tratando de enviar un correo desde localhost. tengo wamp + apache + php intente con varios ejemplos y nada! ahora estoy con phpmailer pero me da el siguiente error Could not instantiate mail function. Error: Could not instantiate mail function. use el codigo de israel (arriba).

ya es el segundo ejemplo que uso con phpmailer y me da el mismo error active todo lo ssl que sale en apache.

los otros ejemplos me dice que no funciona mail en el puerto 25 blah….

juamcar
Publicado: 09/04/2012 10:54 am

una consulta estoy usando phpmailer me gustaría enviar correos cada 5 segundos en donde podría hacer ese cambio … usando phplist hay un opción …. en phpmailer se puede hacer eso ..?

Gabi
Publicado: 22/11/2013 5:18 am

Me gustaria saber lo que preguntaba Juan pués mi servidor ya no me deja enviar más de 2500
«como seria la parte para hacer el envío en bloques de 500..si me podrias explicar como hacer para mandar por bloques te lo agradeceria mucho…»
Gracias
gabi

Gutenberg
Publicado: 14/05/2015 10:37 am

7 años después debo decir… GRACIAS! =)

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)