Introducción a PHPMailer

Dado que muchos lo estáis pidiendo me he animado a escribir una pequeña introducción a PHPMailer. Lo primero es descargarnos el archivo con la última versión y descomprimirlo en el directorio de nuestro proyecto, por ejemplo en el directorio phpmailer. Para poder usar PHPMailer basta añadir:

include("phpmailer/class.phpmailer.php");

con la ruta adecuada a PHPMailer.

En este ejemplo, modificación del que aparece en la “web oficial”, se puede ver lo fácil que es usar PHPMailer:

SetLanguage('es','phpmailer/language/'))
{
	echo '

No se ha podido cargar el fichero de idioma adecuado.

'; } // Introducimos la información del remitente del mensaje $mail->From = "remitente@email.com"; $mail->FromName = "Remitente"; $mail->AddReplyTo("info@site.com","Information"); // y los destinatarios del mensaje. Podemos especificar más de un destinatario $mail->AddAddress("paco@correo.com","Paco Martínez Soria"); $mail->AddAddress("klaatu@correo.com"); // Como se puede ver aquí el nombre del destinatario es opcional $mail->AddCC("otrodestinatario@correo.com"); // También podemos enviar con copia de carbón $mail->AddBCC("destiantaariooculto@correo.com"); // y copia de carbón oculta // Establecemos los parámetros del mensaje: ancho y formato. $mail->WordWrap = 50; // ancho del mensaje $mail->IsHTML(true); // enviar como HTML // Añadimos el mensaje: asunto, cuerpo del mensaje en HTML y en formato // solo texto $mail->Subject = "Asunto del mensaje"; $mail->Body = "Este es el mensaje en formato HTML"; $mail->AltBody = "Y este es el mensaje de solo texto"; // Para los queno pueden recibir en formato HTML // Añadimos los adjuntos al mensaje $mail->AddAttachment("/var/tmp/file.tar.gz"); // podemos añadir un adjunto directamente $mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // O podemos indicar un nuevo nombre para el adjunto. if(!$mail->Send()) { echo "El mensaje no se ha podido enviar

"; echo "Error: " . $mail->ErrorInfo; exit; } echo "El mensaje se ha enviado correctamente"; ?>

Este ejemplo no funcionaría si el servidor que usarmos es SMTP. En ese caso tendríamos que añadir estas líneas al principio:


$mail->IsSMTP();                                   // enviar vía SMTP
$mail->Host     = "smtp1.site.com;smtp2.site.com"; // Servidores SMTP
$mail->SMTPAuth = true;     // activar la identificacín SMTP
$mail->Username = "jswan";  // usuario SMTP
$mail->Password = "secret"; // clave SMTP

Otras funciones interesantes:

– ClearAddresses () – Borra todos los destinatarios del campo ‘TO’, es decir, todos los destinatarios que se han añadido con la función AddAddress.

– ClearAllRecipients () – Borra todos los destinatarios TO, CC y BCC.

– ClearAttachments () – Borra los adjuntos.

Existe información más completa, en inglés, con todas las funciones disponibles en:

http://phpmailer.sourceforge.net/docs/

12 thoughts on “Introducción a PHPMailer

  1. ¿Es posible que usando SMTP utilice una cuenta para mandar el correo pero que el remitente (From) sea distinto al de la cuenta usada?
    Me explico:
    Dado el código:
    $mail->IsSMTP(); // enviar vía SMTP
    $mail->Host = “smtp1.site.com;smtp2.site.com”; // Servidores SMTP
    $mail->SMTPAuth = true; // activar la identificacín SMTP
    $mail->Username = “jswan”; // usuario SMTP
    $mail->Password = “secret”; // clave SMTP

    … poder usar $mail->From = otrousuario@otrosite.com;

    Es decir, que el correo no llegue de parte de jswan @ site . com sino de otrousuario@otrositio.com

    Si fuera posible ¿es con el método From? Porque lo he probado sin éxito.

    Espero haberme explicado.

    Más información:
    – Usando un servidor compartido Ubuntu Linux
    – No tengo idea de cómo funciona un servidor de correos
    – Lo que quiero que pase es usar una cuenta de mi dominio para la validación por SMTP, pero usar otra cuenta para que aparezca como remitente.

    Gracias!

  2. Pues creo que sí que es posible. Si no me equivoco yo lo he hecho alguna vez. ¿Cómo sabes que no funciona? ¿porque no llega el mensaje? No estoy seguro pero si no se envía podría deberse a la configuración del servidor (no permite enviar con remitentes de otro dominio) o podría deberse a que el mensaje es identificado como spam.

    ¿Funciona bien si envías los emails con un “from” que sea del mismo dominio?

  3. Hola, necesito tener un formulario de contacto en mi sitio web con 4 o 5 campos pero no tengo servidor de correo y no he entendido mucho esto del phpmailer aunque parece servir bastante, me pueden echar una manito, muchas gracias.

  4. Hola,
    a mí no me funciona cuando paso una dirección de otro dominio, ejemplo:

    $mail->IsSMTP();
    $mail->Host = “mail.midominio.com”;
    $mail->AddAddress(“correo@midominio.com”);
    $mail->AddAddress(“correo2@midominio.com”);
    $mail->AddAddress(“correo@otrodominio.com”);

    no requiere autentificación, ni siquiera me envía los correos a las direcciones de mi dominio, simplemente comentando la línea del correo del otro dominio funciona perfectamente.

    Imagino que será cosa del servidor, les llamaré a ver si me dan una solución y os lo comento…pero me lleva bastante loco que por poner otro dominio deje de funcionar.

    Si alguien sabe algo sobre el tema le agradecería toda la ayuda.

    Gracias, un saludo.

  5. Hola. He estado intentando enviar correos con phpmailer y la verdd es que por mas intentos que hago no logro que me salga bien. por favor sí me pueden ayudar se los agradeceria mucho

  6. A mi me tira el siguiente error
    Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www\Dreamweaver\servidor\phpmailer\class.smtp.php on line 1024

    Pa mi que tengo todo bien…¿Porque sera?.. :)…..Gracias

  7. Excelente post, por ahi me dio una lata con los metodos, pero era porque no habia declarado la clase. Solo agregué la siguiente linea:

    $mail = new phpmailer();

    Por si a alguien le ocurre lo mismo. Exactamente lo que dice Alex.

    Saludos y muchas gracias.

  8. Si requieren el uso de caracteres especiales (acentos, por ejemplo) agregar lo siguiente al código:

    $mail->CharSet = “UTF-8”;
    $mail->Encoding = ‘quoted-printable’;

    De esta manera se pueden obtener acentos tanto en el asunto del mensaje como en el cuerpo ($body).

  9. Hola, me ha dado lata este caso:

    Por ejemplo 3 correos de prueba y el mensaje para cada correo es personalizado, por lo tanto toca ingresarlo a un bucle.

    Para enviar cada correo toca con $mail->Send() y limpiar el correo anterior con $mail->ClearAddresses()

    Allí todo OK. Pero al comprobar en los tres correos, el Primero en la lista recibe los 3 correos con los 3 mensajes, el segundo 2 correos con 2 mensajes y el ultimo 1 correo con su mensaje personalizado.

    Alguna idea?

    Gracias

  10. Mis queridos hermanos, finalmente ya encontré la solución para que no pierdan el tiempo.

    Solo agreguen la siguiente línea a su configuración PHPMailer:
    $mail->IsMail(true);

    Y ya el problema queda solucionado.

    Un abrazo.

  11. Hola, ayuda porfa.
    A mi me funciona todo bien cuando ejecuto el codigo dentro de mi red interna y el servidor de correo que use tambien esta dentro de mi red interna.
    Pero cuando ejecuto el mismo codigo desde una red externa me sale el error:
    Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www\phpmailer\class.smtp.php on line 377

    Estare muy agredecido con sus respuestas que estare haceindo mal.

    Gracias

Deja un comentario