Mandar emails con php
Hace poco la empresa con la que tengo contratado el hosting avisó de que iba a deshabilitar el uso de la función mail() así que me tocó buscarme la vida para modificar todos los scripts que la utilizaban.
Aquí fue donde me encontré con PHPmailer una clase para implementar scripts de envíos de email mucho mas efectivos que mail()
Una de las grandes ventajas es que si usas un servidor SMTP tuyo y no haces SPAM rara vez tus mensajes irán a la papelera sino que serán entregados sin ningún problema.
La manera de usarla es muy sencilla, primero deberemos descargarnos las clases, class.phpmailer.php y class.smtp.php, una vez colocadas en nuestro directorio podemos crearnos el script que las usará.
Necesitaremos disponer de una cuenta de correo y el servidor SMTP asociado para poder hacerlo funcionar.
El ejemplo lo saqué hace tiempo de una web, done explicaban el procedimiento, dado que fue hace tiempo y no apunté la referencia no puedo nombrar al autor original.
Por ejemplo: mandarMail.php
Para copiar el código pinchad primero sobre PLAIN TEXT (no me gusta nada esta manera de mostrar el código, espero encontrar otro plugin)
<?php
require "class.phpmailer.php";
//Definimos las propiedades y llamamos a los métodos
//correspondientes del objeto mail
//Con PluginDir le indicamos a la clase phpmailer donde se
//encuentra la clase smtp que como he comentado al principio de
//este ejemplo va a estar en el subdirectorio includes
$mail = new phpmailer();
$mail->PluginDir = ""; //si las clases de PHPmailer estuvieran en otro directorio habria que indicarlo
//Con la propiedad Mailer le indicamos que vamos a usar un servidor smtp
$mail->Mailer = "smtp";
//Asignamos a Host el nombre de nuestro servidor smtp
$mail->Host = "mail.midominio.es"; //Necesitaremos nuestro servidor smtp
//Le indicamos que el servidor smtp requiere autenticación
$mail->SMTPAuth = true;
//Le decimos cual es nuestro nombre de usuario y password
$mail->Username = "mail@midominio.es";
$mail->Password = "pass";
//Indicamos cual es nuestra dirección de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mail->From = "nocontestar@estoesunaprueba.com";
$mail->FromName = "Nombreremitente";
$mail->Timeout=30; //Cuanto esperaremos
//Indicamos cual es la dirección de destino del correo
$mail->AddAddress("direccion@destino.es");
//Asignamos asunto y cuerpo del mensaje
//El cuerpo del mensaje lo ponemos en formato html, haciendo
//que se vea en negrita
$mail->Subject = "Asunto";
$mail->Body = "Texto";
//Definimos AltBody por si el destinatario del correo no admite email con formato html
$mail->AltBody = "Texto secundario";
//se envia el mensaje, si no ha habido problemas
//la variable $exito tendra el valor true
$exito = $mail->Send();
//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas como mucho
//para intentar enviar el mensaje, cada intento se hara 5 segundos despues
//del anterior, para ello se usa la funcion sleep
$intentos=1;
while ((!$exito) && ($intentos < 5)) {
sleep(5);
//echo $mail->ErrorInfo;
$exito = $mail->Send();
$intentos=$intentos+1;
}
if(!$exito)
{ echo "Problemas al enviar el correo"; }
else
{ echo "Tu mensaje ha sido entregado sin ningún problema"; }
?>
Comparte este artículo
Trackbacks / Pingbacks
15 Comentarios
Deja un comentario
Hola, tu código no me dió resultado.. Pero en el archivo de test1.php en la carpeta example funciona bien…
Ahora ¿Como mandar a un grupo de correos si que diga CON COPIA?.. osea, uno por uno, pero automatizado?…
Lo bueno, esque al usar el smtp no aparece como SPAM.
Buen aporte. Gracias
Escrito el 11/12/07 a las 00:08:45 (#1) (responder)
Que raro que no funcionase, ¿que error te da? para opciones de ese tipo lee las instrucciones de la clase php mailer desde ahí te explicarán como aprovechar al máximo esa clase.
Escrito el 11/12/07 a las 09:39:52 (#2) (responder)
soy nueva en el desarrollo de paginas web quiero utilizar phpmailer pero tengo este error cuando ejecuto la opcion de contactenos que cree para el envio de correo.
Erro:
Warning: include(includes/class.phpmailer.php) [function.include]: failed to open stream: No such file or directory in /var/www/web33/web/includes/enviarcorreo1.php on line 8
Warning: include() [function.include]: Failed opening ‘includes/class.phpmailer.php’ for inclusion (include_path=’.:/usr/share/php:/usr/share/pear’) in /var/www/web33/web/includes/enviarcorreo1.php on line 8
Fatal error: Class ‘phpmailer’ not found in /var/www/web33/web/includes/enviarcorreo1.php on line 12
Escrito el 14/12/07 a las 00:16:09 (#3) (responder)
Verifica las rutas y de todas maneras prueba a poner “includes/class.phpmailer” entre comillas dentro del include.
Seguramente ese fallo se deba a un problema con las rutas, para asegurarte, colocalo en el mismo directorio y utiliza la instrucción: require “class.phpmailer.php”, si funcionase, pues: require “includes/class.phpmailer.php” y todo debería ir bien.
Escrito el 14/12/07 a las 08:19:33 (#4) (responder)
sabes hice una tarjeta virtual de navidad pero esta llega como spaw.. este es el cod..
<?
$cabeceras = “From: $mail\r\nContent-type: text/html; charset=UTF-8\r\n”;
$codigo = ‘
Vader is a Hater - Star Wars Fan Art
‘.$noticia2.’
‘;
if(mail( $mail , “Tarjeta de Navidad”, $codigo, $cabeceras)){
print “”;
}
else
{
return $fallo;
}
?>
sorry pero me podrias explicar mejor que debo hacer.. no entendi mucho…gracias
Escrito el 29/11/08 a las 22:42:06 (#5) (responder)
@jorgete: No usas la clase phpmailer ¿verdad? posiblemente no tu email no esté del todo bien formado y provoque que se detecte como spam, sigue el ejemplo de arriba y no tendrás problemas.
Escrito el 30/11/08 a las 14:51:43 (#6) (responder)
Hola Emilio.. gracias por tu tiempo y ayuda.
no, no uso phpmailer, vi la idea de arriba pero me da la impresion que es solo para texto…(igual soy muy novato en programación) mi tema es que yo tengo que enviar un diseño hecho en HTML con cajas y lleva fotos vinculadas desde mi sitio…
aqui esta es la idea.
http://www.genteactiva.cl/boletin.php
el codigo para enviar el diseño ocupe este que encontre por ahi.
http://www.genteactiva.cl/codigoboletin.php
ahora la solucion que das sirve para hotmail?? he leido por varios lados que hotmail es muy complicado.
Muchas gracias… por darme una mano.
Escrito el 30/11/08 a las 20:43:32 (#7) (responder)
@jorgete: No hay problema para mandar emails con html, simplemente tendrás que utilizar la instrucción, $mail->IsHTML(true);
De todas maneras te recomiendo que eches un ojo al tutorial de phpmailer seguro que te ayuda con las dudillas (http://phpmailer.codeworxtech.com/index.php?pg=tutorial)
Con esta clase yo no he tenido ningún problema para mandar a hotmail, antes, cuando no la usaba si que eran propensos a tratar como spam los servidores de correo “que no conocían” pero si formas bien el correo, no tendrás problema.
Escrito el 30/11/08 a las 21:21:55 (#8) (responder)
ya mi amigo tratare y te aviso … gracias.
Escrito el 01/12/08 a las 01:10:54 (#9) (responder)
bo me resulto.. me sale
Warning: fsockopen() [function.fsockopen]: unable to connect to smtp.terra.cl:25 (Connection refused) in /home/gente10/public_html/class.smtp.php on line 122
otra cosa tienes un error en el cod.
$mail->AddAddress(direccion@destino.es);
deberia ser asi
$mail->AddAddress(”direccion@destino.es”);
Escrito el 01/12/08 a las 02:23:29 (#10) (responder)
Cierto es, ahora corrijo ese fallo.
El error que te está dando es porque no encuentra el servidor smtp que le estás indicando, o bien no está ahí ono es posible accederlo remotamente.
Escrito el 01/12/08 a las 10:36:08 (#11) (responder)
emilio de no ser posible entrar remotamente que otra solucion puede existir?? conoces algun correo gratuito que me pueda servir para esto?
Escrito el 02/12/08 a las 16:59:26 (#12) (responder)
@jorgete: Desconozco si existen servidores gratuitos, de todas formas si tienes un dominio y un hosting tienes que tener un servidor smtp ¿no?
Escrito el 02/12/08 a las 17:22:35 (#13) (responder)
bueno si lo tengo pero me arroja ese error… del que te comente., no se como solucionarlo. que fome.
Escrito el 02/12/08 a las 17:33:30 (#14) (responder)
@jorgete: ¿Estás completamente seguro que los datos de servidor smtp y puerto son correctos?
De todas maneras, si la función mail() te funciona prueba a agregar estos headers, a mi me funciona y no me llega como spam
$headers = “MIME-Version: 1.0\r\n”;
$headers .= “Content-type: text/plain; charset=utf-8\r\n”;
$headers .= “Content-Transfer-Encoding: 8bit\r\n”;
$headers .= “From: $from\r\n”;
$headers .= “Content-type: text/html\n”;
mail($to, $subject, $message, $headers);
Es la forma que tengo para mandar emails en mi último plugin para wordpress:
http://cvs.aesinformatica.com/download/email-reply-comments
Escrito el 03/12/08 a las 02:33:06 (#15) (responder)