Configurar servidor SMTP en WordPress para enviar correos verificados (sin plugin)

Update: 3-2-2017

Parece ser que en mejoras iniciales de la versión de PHP 5.6 esta verifica los certificados en conexiones SSL. Si la configuración SSL de tu servidor no es correcta o tiene un certificado sin verificar puedes obtener un error del tipo:

Para corregir esto hay que reemplazar el certificado inválido, mal configuraro o auto-firmado por uno bueno.
Si todo eso falla, puedes configurarle a PHPMailer (desde la 5.2.10) aceptar conexiones inseguras añadiendo a la función de mas abajo esta opción:

Evidentemente esto bajo tu seguridad y riesgo, lo mejor es tener un certificado en condiciones 🙂

Post original:


En muchas ocasiones me he encontrado que trabajando con hostings, en su mayoría compartidos, estos tienen bloqueado el envío de emails de cuentas no verificadas. WordPress acostumbra a enviar muchos de sus mensajes mediante una cuenta que no existe del tipo wordpress@tudominio.com, y algunos de estos servidores no permiten tal formula. Ya sea por mala configuración o por seguridad los mensajes parecen salir sin indicar que ha fallado el envío, y el destinatario no recibe nada. Configurar servidor SMTP en WordPress es muy fácil, os explico como hacerlo con y sin plugin.

Con plugin

Una forma simple para saltarse este problema sería la de instalar el plugin bastante conocido WP Mail SMTP, el cual te permite configurar una cuenta con su usuario, contraseña y las opciones de como se conecta y envia el mensaje. Mediante una nueva página en Ajustes del admin te permite entrar todos esos datos con un formulario de manera sencilla, y estos quedan almacenados en la base de datos.

Configurar servidor SMTP en WordPress sin plugin

Muchos serán los que piensen que la anterior es la opción sencilla, pero la forma más limpia para hacerlo y la que evita tener que añadir otro plugin más a tu WordPress es el siguiente código. Ya iréis notando que soy poco partidario de atiborrar a WordPress a plugins por cualquier cosa tan simple como añadir una función al código ya existente.

Solo tendrás que añadirlo al functions.php de tu theme y configurar las diferentes variables para que envíe correctamente con tu servidor.

Función para envío mediante SMTP

Y ya está, no tienes más que configurar el código a tus necesidades. Si tenéis algún problema no dudéis en dejar un comentario! 🙂
Post image is artwork from by Freepik

56 opiniones en “Configurar servidor SMTP en WordPress para enviar correos verificados (sin plugin)”

  1. Buenas tardes,
    tengo el problema que describes en el post, me han cancelado el envio desde mi pagina web de correos,necesitaria ayuda para implementar una de las dos formas ya que yo utilizaba para el envio de correos el contact form 7 pero ya no funciona y los administradores del hosting me dijeron que tenia que implementar el phpmailer para mi web,mi pregunta es, donde tengo que añadir las clases del phpmailer? y como llamo a esta funcion cuando pulso el boton enviar?

    Muchas gracias

    1. Hola Lluis, en principio la clase PHPMailer viene de serie en WordPress, lo único que deberías añadir es una función como la que explico en el post en el archivo functions.php y eso ya afectaría a cualquier envío de mails en todo tu web.

      Si lo ves complejo, te recomendaria optar por el plugin que indico en el post WP Mail SMTP

      Espero te sirva, un saludo!

  2. Hola, muchas gracias por el aporte, me parece muy bueno, tengo este mismo problema pero no entiendo mucho de php y me gustaria saber rellenarlo bien para que no me falle. Paso a detallarte:

    1. Que se pone en la primera linea de codigo:

    // Define que estamos enviando por SMTP
    $phpmailer->isSMTP();

    Si va algo entre los parentesis y el qué.

    2. Tambien si en los apartados:

    // Usuario de la cuenta de correo
    $phpmailer->Username = “user name”;
    y
    $phpmailer->From = “tucuenta@decorreo.com”;

    Se ponen los mismos datos.

    3. Como saber que tipo de encriptacion utiliza mi servidor:
    // El tipo de encriptación que usamos al conectar – ssl (deprecated) o tls servidor

    Por ultimo me gustaria saber si esto mismo funcionaria con gmail, ya que en principio las pruebas las estoy haciendo con el correo que te pongo en el campo “correo electronico” que solicitas como requerido.

    Muchas gracias de antemano. Un saludo!

    Se que son muchas dudas

    1. En principio con Gmail no habría problema de usarlo.

      En referencia a los puntos:
      1. Esa linea val tal cual está, simplemente indico que enviamos vía SMTP directo.

      2. El user name es el nombre de usuario que usas tu para conectarte a la cuenta de correo y sí, a veces según el hosting es la misma cuenta en si.

      3. La seguridad suele ser sobre TLS generalmente, pero puedes está condicionada a la configuración de tu hosting, habla con ellos y coméntalo.

      Un saludo!

  3. hola cuales seria los correos que pondriamos en

    / Usuario de la cuenta de correo
    $phpmailer->Username = “user name”;

    // Contraseña para la autenticación SMTP
    $phpmailer->Password = “password”;

    cualquier correo sirve por favor ayudame

  4. Muchisimas gracias por el codigo, te comento que fui en contra tuyo intente hacerlo con el pluging y no puede lograr que se envie el mail si el de test pero no por el formulario. En mi caso fue mucho mas facil el editar el function.php en 2 min tenia funcionando los mails!

  5. el pluggin funciona de maravilla .. pero para un solo correo .. pero en mi web tengo mas de 5 formularios donde destinan a diferentes correos .. asi que necesito una configuracion para varios correos .. que me recomiendas para esto

    1. Esta funcionalidad es para que los correos se envien mediante una cuenta válida del servidor, el correo de destino puede ser cualquiera. Si necesitas enviar especificamente desde diferentes correos o que te responden a cada uno de cada formulario puedes usar un header como ReplyTo para que respondan en cada formulario a la que quieras siempre. Mira la función wp_mail si usas formularios propios, si usas algún tipo de plugin como Contact Form 7, en la misma pantalla de configuración del email puedes añadir el ReplyTo:

    1. Por ejemplo, deberías poder sacarla de ahí, si no consulta con tu ISP cual es la dirección del servidor mail de salida, a veces puede ser mail.dominio.com o smtp.dominio.com, difiere de cada configuración de la empresa de hosting. 🙂

  6. Buenas tardes,
    Gracias por esta información, llevaba meses sin funcionar correctamente y parece que es por esto. Desde mi hosting me dicen que no hay encriptación, así que he comentado esa línea del código que indicas. He modificado el código desde el editor de WordPress y ya envía los correos, sin embargo cuando salgo o accedo desde otro navegador donde no estoy logueada en mi WP sigue pasándome lo mismo, el formulario queda enviándose infinitamente y no llega nunca. ¿Alguien sabe a qué c### es debido? 😀

  7. Hola, he puesto el código en functions.php. Ahora estoy utilizando un formulario de Contact Form 7 y me sigue marcando error al enviar el mensaje. Alguna pista? Si utilizo el formulario que viene con el tema de WordPress indica que el mensaje se envió pero nunca llega al destinatario.

    Gracias!

  8. Hola.
    Antes de nada he de decir que mis conocimientos de php son nulos. Pero como ya he probado el plugin y otros similares sin éxito he intentado modificar el archivo.
    He copiado y pegado tal cual el codigo al principio de todo , he sustituido los datos entre comillas. Tampoco he tenido éxito.
    Alguna sugeréncia ? (aparte de aprender php).
    Por cierto, el error del plugin al hacer el test es el siguiente:
    “SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

    Muchas gracias.

  9. Hola, con el plugin hago el test y me lo envía correctamente, pero desde el formulario de la web no.

    También he probado sin el plugin añadiendo el código a functions.php y nada.. me dice que se ha enviado correctamente pero no llega.. 🙁

  10. valioso tu aporte Abel, en mi caso mude mi sitio wordpress y desde entonces los correos solo me llegan a correos @hotmail.com mas no a los q estan seteados en el form q son el dominio de la empresa, supongo q en alguna parte debo poder modificar q mi smtp ya no es localhost y q el user y contraseña pueden haber cambiado
    t agradezco tu ayuda!

  11. Gracias por el aporte,

    pero desafortunadamente no me funciono porque segun el proveedor de hosting “El Servidor NO permite envíos SMTP, tiene que usar PHPMAILER para el envió de correos electrónicos”

    De pronto tu sabes como o tienes algun codigo como este que explicas pero para PHPMAILER y donde lo tendria que copiar?

    Agradezco la ayuda que me pueda dar

    Gracias,

  12. Estimado

    Hice lo que pusiste en la functions.php
    pero previamente además del código probé los parámetros mediante un cliente de correo como lo es thunderbird para trabajar con la cuenta de la empresa y este cliente me recibe y envía correctamente la información.

    Ahora bien… copie estos parámetros (110 pop y 25 smtp, sin seguridad) a las functions y probe conectarme a mi sitio en WP
    e indicarle al sistema que me enviará mis credenciales al correo pero me indica que revise pero no me llega al correo… en todo caso dejo los parámetros:
    // Define que estamos enviando por SMTP
    $phpmailer->isSMTP();

    // La dirección del HOST del servidor de correo SMTP p.e. smtp.midominio.com
    $phpmailer->Host = “mail.servidor.cl”; //”your server smtp address”;

    // Uso autenticación por SMTP (true|false)
    // trabajo sin autenticacion el smtp ya que es una cuenta
    // del trabajo
    $phpmailer->SMTPAuth = false; //true; el smtp

    // Puerto SMTP – Suele ser el 25, 465 o 587
    $phpmailer->Port = “25”;

    // Usuario de la cuenta de correo
    $phpmailer->Username = “yomismo@servidor.cl”; //”user name”;

    // Contraseña para la autenticación SMTP
    $phpmailer->Password = “XXXXXX”; //”password”;

    // El tipo de encriptación que usamos al conectar – ssl (deprecated) o tls
    $phpmailer->SMTPSecure = “”; //”tls”;

    $phpmailer->From = “yomismo@servidor.cl”; //”tucuenta@decorreo.com”;
    $phpmailer->FromName = “yomismo”; //”Tu nombre”;

    En todo caso seguire buscando la solución.

  13. Gracias Abel!!!

    No sabes lo que he luchado durante el día de hoy, con plugin y sin él… no había forma, me pasaban distintas cosas, semejantes a las que describen los demás corresponsales más arriba, los mismos errores, sentía la misma impotencia que destilan los correos del resto de autores, y nada!
    Copié y pegué el fragmento de código, reemplacé por los valores de mi proveedor de hosting, y ¡ya está! ¡funciona!

    Otra vez ¡muchas gracias!

  14. Hola buenas.
    A mí me ocurre que he configurado correctamente el pluging wp-mail-smtp pero gmail me ha enviado un email diciendo que ha bloqueado un programa externo que intentaba acceder a mi cuenta, o sea que me ha bloqueado a wp-mail-smtp y no funciona. Sabes qué puedo hacer? He probado a implementar el código que pones en functions.php pero el wordpress me dejó de funcionar y tuve que volver a dejar el functions.php como estaba.
    Muchas gracias.

  15. Me sigue apareciendo el mensaje:

    No se pudo enviar el correo electrónico.
    Posible razón: Tu alojamiento puede tener desactivada la función mail()

    cuando le doy recordar contraseña a mi wordpress, eso quiere decir que no cojió la función

  16. Hola… Una par de dudas de principiante.

    Estoy desarrollando un pluging que entre otras cosas debe enviar un correo a un mail introducido en un campo de formulario, no a usuario rigistrado ni nada, solo a un correo dado…
    a) Como hago referencia a functions.php donde puse la funcion que nos compartes? include? require?
    b) como llamo a la funcion desde el codigo de mi plugin indicandole el destinatario y el mensaje que le enviare?

  17. No funciona, los correos ni siquiera salen desde WordPress. Lo otro es que WP por default manda los correos a la carpeta Spam. Si saben de una manera de evitar esto usando functions.php, por favor!!

  18. hola buenos dias, primero que todo agradecerte por este aporte, segundo te queria preguntar si este metodo sirve para todos los sitios de mi blog, te explico: tengo un blog multisite y quiero saber si esta funcion sirve para toda la red y no solo para el sitio principal como lo hacen algunos plugins

Deja un comentario