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);

?>

 

15 comentarios sobre “Envíos de email con PHPMailer

  1. felix Contestar

    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 Autor del artículoContestar

      Hola Felix,

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

  2. GERRY RIOS 14681493-K Contestar

    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 Autor del artículoContestar

      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 Contestar

    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 Autor del artículoContestar

      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 Contestar

    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 Autor del artículoContestar

      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 Contestar

    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 Contestar

    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…

  7. María del Pilar Contestar

    Hola, Raúl:

    ojalá puedas orientarme. Estoy usando phpmailer para enviar mails, cuando lo pruebo para enviar a una cuenta yahoo no llega nada, y si lo pruebo con gmail o hotmail llega a spam, ya verifiqué que mi servidor no está en ninguna lista negra. Este es mi código:

    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->IsSMTP();
    $mail->SMTPAuth = true;
    $mail->Host = ‘mail.midominio.com’; ; // SMTP a utilizar. Por ej. smtp.elserver.com
    $mail->Username = ‘smtp@midominio.com’; // Correo completo a utilizar
    $mail->Password = ‘**********’; // Contraseña
    $mail->SMTPSecure = ‘tls’;
    $mail->Port = 587; // Puerto a utilizar
    $mail->From = ‘smtp@midominio.com’; // Desde donde enviamos (Para mostrar)
    $mail->FromName = “midominio.COM”;
    $mail->AddAddress($this->email); // Esta es la dirección a donde enviamos
    $mail->IsHTML(true); // El correo se envía como HTML
    $mail->Subject = ‘Hola — Verifica tu e-mail.’; // Este es el titulo del email.
    $body = ‘Hola, Necesitamos asegurarnos que seas humano. Por favor verifica tu e-mail y comienza a disfrutar de tu cuenta. “;
    $mail->Body = $body;
    $mail->AltBody = “Necesitamos asegurarnos que seas humano. Por favor verifica tu e-mail y comienza a disfrutar de tu cuenta.”;

    $exito = $mail->Send();
    if ($exito)
    return true;
    else
    return false;

  8. luis Contestar

    hola, estoy tratando de enviar un correo desde hostinguer y me funciona perfectamente, pero cuando encajono el script en una fuction me sale un error en el comando use, es decir cuando hago esto..
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    funciona, pero cuando hago esto…
    function enviarEmail($email, $nombre, $asunto, $cuerpo, $filename,$emailc){
    * use PHPMailer\PHPMailer\PHPMailer;
    * use PHPMailer\PHPMailer\Exception;
    estas lineas me marcan error y deja de funcionar. por favor ayuda, muchas gracias…

Deja una respuesta

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