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); ?>
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.
Hola Felix,
¿ es el servidor gratuito de Hostinger? Hostinger suele dar problemas en este tema en el servicio gratuito.
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;
}
?>
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.
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.
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
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!”;
?>
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.
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”;
Hola buenas,
prueba a cambiar el puerto a 587
Un saludo, Raúl.
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…
Prueba a mandar los email desde un servidor de gmail. https://donnierock.com/2013/09/09/enviar-un-email-con-phpmailer-usando-una-cuenta-de-gmail/
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;
Buenas,
se me ocurre de primeras que pruebes a mandarlo desde un servidor de Gmail, así, si con este llegan bien los correos a la bandeja de entrada, ya sabremos que el problema no es la configuración y sí lo es tu servidor de correo. https://donnierock.com/2013/09/09/enviar-un-email-con-phpmailer-usando-una-cuenta-de-gmail/
Un saludo.
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…