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:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

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:

$phpmailer->SMTPOptions = array(
 'ssl' => array(
 'verify_peer' => false,
 'verify_peer_name' => false,
 'allow_self_signed' => true
));
Lenguaje del código: PHP (php)

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

add_action('phpmailer_init','send_smtp_email');
function send_smtp_email( $phpmailer )
{
    // 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 = "your server smtp address";
 
    // Uso autenticación por SMTP (true|false)
    $phpmailer->SMTPAuth = true;
 
    // Puerto SMTP - Suele ser el 25, 465 o 587
    $phpmailer->Port = "587";
 
    // Usuario de la cuenta de correo
    $phpmailer->Username = "user name";
 
    // Contraseña para la autenticación SMTP
    $phpmailer->Password = "password";
 
    // El tipo de encriptación que usamos al conectar - ssl (deprecated) o tls
    $phpmailer->SMTPSecure = "tls";
 
    $phpmailer->From = "tucuenta@decorreo.com";
    $phpmailer->FromName = "Tu nombre";
}
Lenguaje del código: PHP (php)

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


Comentarios

61 respuestas a «Configurar servidor SMTP en WordPress para enviar correos verificados (sin plugin)»

  1. Hola,

    Gracias por el aporte. Donde se colocaría este trozo de código? en cualquier parte, al principio?

    1. Hola Diego,
      En principio en cualquier parte del archivo functions.php ya que la función solo se ejecuta al llamar el action de phpmailer_init.
      Un saludo!

      1. Si no consigo el archivo functions.php en XAMMP ya que si tengo la carpeta phpmailer y sedmail

    2. A mi me causa error después de configurar. En realidad, no me deja enviar algo.

  2. Muchas gracias por el trocito de código… muy útil.

  3. 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!

  4. lo probe con ninja form y no funciona

  5. 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!

  6. Estoy tratando de implementar el código mediante el pluging. ¿Alguno sabe como configurarlo? Sería para utilizarlo con un correo de dominio propio.

    1. Quizá el pantallazo del propio plugin te ayude, aun que es un pelin viejo la versión de Wordpress en el, los campos siguen siendo lo mismo

      https://s.w.org/plugins/wp-mail-smtp/screenshot-1.png?r=1049645

      1. Disculpa me da este error me podrias ayudar a identificar q es exactamente
        016-03-14 16:26:36 Connection: opening to ssl://host.dpanel.net:465, timeout=300, options=array (
        )
        2016-03-14 16:26:36 SMTP ERROR: Failed to connect to server: (0)
        2016-03-14 16:26:36 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

  7. 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

  8. A mi me ha funcionado perfecto , justo lo que estaba buscando ! Muchas gracias!

  9. 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!

  10. 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:

  11. Buen día, la dirección del servidor smtp la sacas de tu cpanel?

    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. 🙂

    2. Hola Kevin, tu sitio wwordpress esta con godaddy???

  12. como se debe ingresar este codigo, ya que me genera error en la linea 112 si lo pongo al final. gracias

    1. Al final de que archivo Carlos?

  13. Gracias me ha salvado el dia =D

  14. 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? 😀

  15. 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!

  16. a mi no me funciono, jeje. uso el plugins userpro, pero no me envia correo al registrarme..

  17. 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.

  18. 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.. 🙁

    1. Hola! si pudiste resolver tu problema si es asi, como lo solucionaste???

  19. estimado, muchas gracias por tu aporte añadí el codigo y 0 problema.

  20. hola tengo el mismo problema del amigo javi actualize la nuea version y nada la regrese hice los cambios en el codigo ya metí mil plugins de smtp y nada

    no me da ningun error … que podra ser???

  21. 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!

  22. 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,

  23. 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.

  24. 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!

    1. puedes indicar con que valores reemplazaste…los q dicen q le funcionan solo lo dicen pero no indican los valores que pusieron. te lo agradezco.

  25. Apreciado amigo,
    Solución perfecta para el envío de correos, gracias por el aporte !!!

  26. 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.

  27. cuestiones con loss piratas ? Mi último blog ( wordpress
    ) fue hackeado y terminé perdiendo varias semanas de duro trabajo debido a
    ninguna copia de seguridad copia de seguridad de datos .

    ¿Tiene alguna protección contra los piratas informáticos ?

  28. 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

    1. Hola William, tal como indica el error, si tu hosting tiene desactivada la función de PHP mail(), no habrá forma que puedas enviar correo.

  29. He usado el SMTP del SES de AWS y funciona perfecto. Gracias.

  30. Estupendo. A mi si que me funciona. Muchas gracias.

  31. Genial, funcionó sin problema alguno. Muchas gracias por el aporte!!! Saludos =)

  32. Avatar de Mónica Parejo Bellido
    Mónica Parejo Bellido

    Muchísimas gracias! Muy útil 🙂

    1. De nada, alegra que os ayude!

  33. Hola Abel,

    He intentado implementar el código, pero al enviar el mensaje con contact form 7 se queda constantemente cargando. Me pasa igual que cuando uso WP Mail SMTP. La página del contacto es la siguiente, por si te sirve de algo http://www.analogisdifferent.com/contacta-con-nosotros/

    Saludos!

  34. 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?

  35. Hola, no pusiste el ejemplo de como armar el formulario para vincularlo tengo esa duda

  36. Excelente! me sirvió montones, gracias!

  37. Gracias Abel,

    El snippet me ha ido perfecto y me ahorras un plugin en la instalación. Saludos

    Joan

  38. Cojonudo el aporte a la primera y funcionando. Muy buen tutorial

  39. 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!!

  40. Muchas gracias Abel! el snippet va muy bien. Buen trabajo!
    (please, enviame tu email por si acaso sale un freelance y quisieras hacerlo).
    Saludos,

  41. 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

  42. Estimado Abel, mcuhas graicas por haberto tomado el tiempo para esta explicación, pero lamentablemente para el servidor de Godaddy, no funciona proble todas las posibles configuraciones y no lo acepta, lo que si es extraño es cuando configuro como mail de recepción cualquier otro mail que no sea del dominio del sitio web funciona perfectamente, pero sin hacer modificaciones al functions.php, esta puede ser una alternativa de solución. Muchas graicas

  43. Buenos dias!! Tras tratar de configurar mi servidor de email con WP-MAIL-MP que no me dio resultado y despues con WP Mail SMTP Plugin by Mail Bank (tampoco), he probado con tu codigo poniendolo drectamente en functions.php de mi tema de Wordpress. Tampoco funciona. Supongo que algo estaré haciendo mal. Cuando doy la orden demandar el mensaje de un formulario del plugin PLANSO se queda «pensando» y nada. e las tres maneras hace lo mismo. Que crees que puede estar pasando?

    He utilizado esta configuración:

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

    // La dirección del HOST del servidor de correo SMTP p.e. smtp.midominio.com (LO TENGO EN 1&1)
    $phpmailer->Host = «smtp.1and1.es»;

    // Uso autenticación por SMTP (true|false)
    $phpmailer->SMTPAuth = true;

    // Puerto SMTP – Suele ser el 25, 465 o 587 (1&1 me dice que es 587)
    $phpmailer->Port = «587»;

    // Usuario de la cuenta de correo
    $phpmailer->Username = «info@bio2fit.com»;

    // Contraseña para la autenticación SMTP
    $phpmailer->Password = «*******»;

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

    $phpmailer->From = «info@bio2fit.com»;
    $phpmailer->FromName = «Bio2fit»;

    Alguna idea?
    Muchisimas gracias

    1. Revisa $phpmailer->Host este termina con el dominio de la web si es un host pago.

      y $phpmailer->SMTPSecure cambialo a ssl

  44. muchas gracias por el post. me sirivio muchisimo

  45. No soy programador de PHP, y de Wordpress estoy en pañales. Lo que sí estoy informado es sobre PTR, DKIM, SPF y DMARC. Configuraciones que se hacen en tu zona DNS de tu dominio, en el hosting. Ya sea compartido o no, para evitar el phising y la suplantación de identidad. Hay mas parámetros, DNSSEC, DANE, pero por su baja implementación no creo que sean motivo por los que preocuparse.

    Con ello quiero plantear la duda de los motivos de los fallos de entrega, pues el software anti-spam, como https://spamassassin.apache.org/, valida todos esos parámetros del remitente, y sí no los pasa, los rechaza.

    https://dmarcian.com/domain-checker/
    https://www.mail-tester.com/
    https://luxsci.com/smtp-tls-checker#results
    https://www.checktls.com/

    ¿Existen algunas diferencias en la codificación, entre PHP 5.6 y 7.xx?

    Quería pedirle a Abel, que revisase y actualizase su post inicial, enriqueciendo estos comentarios, para así estar todo en el primer post y no disperso por 23 post posteriores.

Deja un comentario