Envíos de email con PHPMailer

En esta publicación vamos a ver como realizar envíos de emails, desde nuestro sitio web, con la librería PHPMailer. En primer lugar tenemos que descargar la librería https://github.com/PHPMailer/PHPMailer.

Ahora empezamos a programar, podemos hacerlo en un solo fichero php.

<?php

//incluyo los ficheros necesarios de la libreria
require('PHPMailer-master/class.phpmailer.php');
require('PHPMailer-master/class.smtp.php');

function mailMailer($destino,$asunto,$cuerpo,$nombre_destino){

$mail = new PHPMailer();

$mail->IsSMTP(); 
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

/*la dirección del servidor, p. ej.: smtp.servidor.com, se consulta en el panel de administración del hosting */
$mail->Host = "************";

// dirección remitente, p. ej.: no-responder@miempresa.com
$mail->From = "no-responder@miempresa.com";

// nombre remitente, p. ej.: Servicio de envío automático
$mail->FromName = "***********";

// asunto y cuerpo alternativo del mensaje
$mail->Subject = $asunto;

//$mail->AltBody = “Cuerpo alternativo 
//para cuando el visor no puede leer HTML en el cuerpo”; 

// si el cuerpo del mensaje es HTML
$mail->MsgHTML($cuerpo);

// podemos hacer varios AddAdress
$mail->AddAddress($destino,$nombre_destino);

// si el SMTP necesita autenticación
$mail->SMTPAuth = true;

// credenciales usuario
$mail->Username = "********";
$mail->Password = "*********"; 

if(!$mail->Send()) {
echo "Error enviando: " . $mail->ErrorInfo;
} else {
echo "¡¡Enviado!!";
}
}

$cuerpo="mensaje con PHPMailer";
$cabeceras = 'Content-type: text/html'."rn".'From: no-responder@miempresa.com' . "rn" .
    'Reply-To: no-responder@miempresa.com' . "rn";
	
// llamo a la funcion pasandole los parametros			
mailMailer("destinatario","Prueba PHPmailer recicla",$cuerpo,$cabeceras);

?>

 

12 thoughts on “Envíos de email con PHPMailer

  1. felix Reply

    No me funciona, estoy manejando el servidor de hostinger, y me truena al enviarlo… que pueda ser?

    Traté de hacerlo con la función mail de php pero si le adjunto headers no lo envia.

    • admin Post authorReply

      Hola Felix,

      ¿ es el servidor gratuito de Hostinger? Hostinger suele dar problemas en este tema en el servicio gratuito.

  2. GERRY RIOS 14681493-K Reply

    Buenas tardes, antes de todo agradesco por su tiempo en hacer estas publicaciones.
    A mi me sale un error, en mi hosting de paga donweb.com
    tengo este codigo:

    SMTPDebug = 3; // Enable verbose debug output

    $mail = new PHPMailer;

    $mail->SMTPDebug = 1; // Activar debug
    $mail->CharSet = “utf-8”;
    $mail->isSMTP(); // Set método de transporte a SMTP
    $mail->Host = ‘smtp.gmail.com’; // Especificar servidor SMTP principal y de backup
    $mail->SMTPAuth = true; // Activar autenticación SMTP
    $mail->Username = ‘gerry01.15.87@gmail.com’; // Usuario SMTP
    $mail->Password = ‘xxxxxxxxx’; // Clave SMTP
    $mail->SMTPSecure = ‘ssl’; // Activa encriptado TLS
    $mail->Port = 465; // Indicar puerto de conexión

    $mail->setFrom(‘pruebasmundotour@gmail.com’, ‘Mailer’);
    $mail->addAddress(‘gerry01.15.87@gmail.com’, ‘Cazares Luis’); // Agregar destinatario
    //$mail->addAddress(‘pruebasmundotour@gmail.com’); // Agregar dstinatario sin nombre
    //$mail->addReplyTo(‘pruebasmundotour@gmail.com’, ‘Contacto’);
    //$mail->addCC(‘cc@servidor.com’);
    //$mail->addBCC(‘bcc@servidor.com’);

    $mail->isHTML(true); // Indicar que el mensaje de correo es en formato HTML

    $mail->Subject = ‘Prueba phpmailer’;
    $mail->Body = ‘Correo electrónico con phpmailer!‘;
    $mail->AltBody = ‘Texto para clientes de correo electrónico sin soporte HTML’;

    if($mail->send())
    {
    echo “Email Successfully sent”;
    }
    else
    {
    echo “Error in Sending Mail”.$mail->ErrorInfo;
    }
    ?>

    • admin Post authorReply

      Buenos días,
      prueba a cambiar las líneas donde pone:
      $mail->SMTPSecure = ‘ssl’; // Activa encriptado TLS
      $mail->Port = 465; // Indicar puerto de conexión

      por esto:
      $mail->SMTPSecure = ‘tls’; // Activa encriptado TLS
      $mail->Port = 587; // Indicar puerto de conexión

      Espero que con esto se solucione, un saludo, Raúl.

  3. Chris Reply

    Hola,

    Tengo un gran problema, necesito mucho de tu ayuda, ya que llevo días y no logro que funcione, yo realicé un archivo con el mailer y tengo otro archivo para configurar todo, los llamados son a base de datos y es para recuperar contraseñas al momento de que las olvidan hace revisión en base de datos, pero el caso es que no funciona.

    me manda este error
    Invalid address: Mailer Error: You must provide at least one recipient email address.ok

    esto es mi código para configurar que se encuentra en un php

    //Correo cliente
    $mailRegistroDireccion = ‘mail.midominio.com’; // Specify main and backup SMTP servers
    $mailRegistroUsuario = ‘recuperador@midominio.com’; // SMTP username
    $mailRegistroPass = clave de midominio.com’; // SMTP password

    //Correos internos propios
    $mailRegistroDireccionCliente = ‘mail.midominio.com’;
    $mailRegistroUsuarioCliente = ‘recuperador@midominio.com’; // SMTP username
    $mailRegistroPassCliente = clave de midominio.com’;

    esto es mi código que esta en otro php

    _tpl = $tpl_name;
    }

    public function __set($name, $value) {
    $this->_vars[$name] = $value;
    }

    public function setVars($values) {
    $this->_vars = $values;
    }

    public function parse() {
    ob_start();
    extract($this->_vars);
    include $this->_tpl;
    return ob_get_clean();
    }
    }

    $mail = $m;

    $cadena = “Select * from PC_Clientes where CORREO = ‘”.$mail.”‘”;
    //echo $cadena;
    $result2 = mysql_query($cadena);
    while($row2 = mysql_fetch_array($result2))
    {
    $ID_CLIENTE = $row2[“ID_CLIENTE”];
    $NOMBRES = $row2[“NOMBRES”];

    }

    $newpass = randomPassword();

    $cadena = “Update PC_Clientes set USR_PASS = ‘”.md5($newpass).”‘ where CORREO = ‘”.$m.”‘”;
    mysql_query($cadena);

    $asunto = $systemName.” – Recuperación de contraseña”;
    $Mail = $mail;

    $tpl = new SimpleTemplate(“recovermailtemplate.php”);
    $tpl->sytem = $systemName;
    $tpl->login = $siteUrl;
    $tpl->site = $siteUrl;
    $tpl->color = $MailColor;
    $tpl->uid = $mail;
    $tpl->elpass = $newpass;

    $mensaje = $tpl->parse();

    //mail_utf8($Mail, $asunto, $mensaje, $headers);

    $mail = new PHPMailer;
    $mail->CharSet = ‘UTF-8’;
    $mail->isSMTP(); // Set mailer to use SMTP
    $mail->Host = $mailRegistroDireccionCliente; // Specify main and backup SMTP servers
    $mail->SMTPAuth = true; // Enable SMTP authentication
    $mail->Username = $mailRegistroUsuarioCliente; // SMTP username
    $mail->Password = $mailRegistroPassCliente; // SMTP password
    $mail->SMTPSecure = ‘tls’; // Enable encryption, ‘ssl’ also accepted

    $mail->From = $mailRegistroUsuarioCliente;
    $mail->FromName = $systemName;
    $mail->addAddress($Mail, $NOMBRES); // Add a recipient
    //$mail->addAddress(‘ellen@example.com’); // Name is optional
    $mail->addReplyTo($mailRegistroUsuarioCliente, $systemName);
    //$mail->addCC(‘cc@example.com’);
    //$mail->addBCC(‘bcc@example.com’);

    //$mail->WordWrap = 50; // Set word wrap to 50 characters
    //$mail->addAttachment(‘/var/tmp/file.tar.gz’); // Add attachments
    //$mail->addAttachment(‘/tmp/image.jpg’, ‘new.jpg’); // Optional name
    $mail->isHTML(true); // Set email format to HTML

    $mail->Subject = $systemName.’ – Recuperación de contraseña’;
    $mail->Body = $mensaje; //’This is the HTML message body in bold!‘;
    $mail->AltBody = ‘Ingresa a ‘.$systemName.’‘;

    if(!$mail->send()) {
    //echo ‘Message could not be sent.’;
    echo ‘Mailer Error: ‘ . $mail->ErrorInfo;

    } else {
    echo ‘Message has been sent’;
    }

    echo ‘ok’;
    //header(“Location: index.php”);
    exit;

    ?>

    Muchas gracias.

    • admin Post authorReply

      Buenas Chris,

      se me ocurre, por si acaso indicarle el puerto para la conexión TLS y probar. Esto se haría mediante esta línea:
      $mail->Port = 587; // Indicar puerto de conexión

  4. Boris Vargas Reply

    Raúl, ayúdame en esto por favor…llevo días y nada.
    El formulario llega vacío y sólo sale: “remitente
    00:13 (Hace 4 minutos.)

    para mí
    Cuerpo del mensaje”

    este es el php enviar.php:

    IsSMTP(); // set mailer to

    $mail->Host = “mail.rodolfoseguel.cl”; // specify main and backup server
    $mail->SMTPAuth = true; // turn on SMTP authentication
    $mail->Username = ‘contacto@rodolfoseguel.cl’; // SMTP username
    $mail->Password = “dipu2018?”; // SMTP password

    $mail->From = “contacto@rodolfoseguel.cl”;
    $mail->FromName = “remitente”; // remitente
    $mail->AddAddress(“borisvargasr@gmail.com”, “destinatario”); // destinatario

    $mail->WordWrap = 50; // set word wrap to 50 characters
    $mail->IsHTML(true); // set email

    $mail->Subject = “Asunto …..”;
    $mail->Body = “Cuerpo del mensaje”;

    if(!$mail->Send())
    {
    echo “Error al enviar. “;
    echo “Mailer Error: ” . $mail->ErrorInfo;
    exit;
    }

    echo “Mensaje enviado!”;
    ?>

    • admin Post authorReply

      Buenas,
      en principio tienes una línea $mail->IsHTML(true); que indica que el cuerpo del mensaje puede ser HTML, prueba a mandar el cuerpo del mensaje con esta línea:

      $mail->MsgHTML(“cuerpo del mensaje”);
      También añadiría el puerto y protocolo:
      $mail->IsSMTP();
      $mail->SMTPSecure = ‘tls’;
      $mail->Port = 587;
      Y quitaría lo de $mail->WordWrap = 50;

      Prueba así y me comentas.

      Un saludo, Raúl.

  5. Alejandro Reply

    Hola raul, tengo un problema, no se si tu podrás solucionarmelo, estoy intentando enviar un mail con esta funcion, pero me sale este error:

    SMTP -> ERROR: Failed to connect to server: Connection refused (111)
    La(s) siguiente(s) direcciones de remitente fallaron: david@bcseguros.net : Called Mail() without being connected

    Es error de mi programación o del servidor? Los del servidor me dicen que los datos suyos están todos correctos y que debería funcionar. Te dejo el codigo completo:

    Gracias.

    require ‘PHPMailer/class.phpmailer.php’;
    require ‘PHPMailer/class.smtp.php’;
    $mail = new PHPMailer;
    /** Configurar SMTP **/
    $mail->isSMTP();// Indicamos que use SMTP
    $mail->Host = ‘smtp.mx.eevid.com’; // Indicamos los servidores SMTP
    $mail->SMTPDebug = 2;
    $mail->SMTPAuth = true;// Habilitamos la autenticación SMTP
    $mail->Username = ‘david@bcseguros.net’;// SMTP username
    $mail->Password = ‘*********’;// SMTP password
    $mail->Timeout= 120;
    $mail->SMTPSecure = ‘tls’;// Habilitar encriptación TLS o SSL
    $mail->Port = 25;// TCP port

    /** Configurar cabeceras del mensaje **/
    $mail->From = $remitente;// Correo del remitente
    $mail->FromName = “Asisa Valdemoro”;// Nombre del remitente
    $mail->Subject = $filename;// Asunto
    /** Incluir destinatarios. El nombre es opcional **/
    $mail->addAddress($mailcompleto); // Destinatario, cliente
    /** Con RE, CC, BCC **/
    $mail->addReplyTo($remitente, “Asisa Valdemoro”); //mail cliente y nombre
    /** Incluir archivos adjuntos.
    $mail->addAttachment(“polizas/”.$filename);
    if($numeroarchivos==”1″){
    $mail->addAttachment($filename2);
    }elseif($numeroarchivos==”2″){
    $mail->addAttachment($filename2);
    $mail->addAttachment($filename3);
    }
    if($aseguradotomador==”si”){
    if($numeroarchivos2==”1″){
    $mail->addAttachment($filename4);
    }elseif($numeroarchivos2==”2″){
    $mail->addAttachment($filename4);
    $mail->addAttachment($filename5);
    }
    }
    $condiciones=”documentos/CCGGAsisaVidaTranquilidad.pdf”;
    $notainfo=”documentos/NOTA_INFORMATIVA_ASISA_VIDA_TRANQUILIDAD.pdf”;
    $mail->addAttachment($condiciones);
    $mail->addAttachment($notainfo);

    /** Enviarlo en formato HTML **/
    $mail->isHTML(true);
    /** Configurar cuerpo del mensaje **/
    $mail->Body = “mensaje al cliente”;
    $mail->AltBody = “mensaje al cliente”;
    /** Para que use el lenguaje español **/
    $mail->setLanguage(‘es’);
    /** Enviar mensaje… **/
    $mail->send() ? “Enviado”: “Problema al enviar”;

  6. Alejandro Reply

    ya he probado los puestos y el tls y el ssl, segun los de soporte del servidor esa configuración es la que tiene que tener… estoy ya desesperado…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *