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

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";
}

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


Publicado

en

,

por

Comentarios

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

  1. Avatar de Diego
    Diego

    Hola,

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

    1. Avatar de Abel Cabans

      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. Avatar de Yuhaide
        Yuhaide

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

    2. Avatar de Miguel
      Miguel

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

  2. Avatar de vicent

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

  3. Avatar de Lluis
    Lluis

    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. Avatar de Abel Cabans

      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. Avatar de iqudoblev
    iqudoblev

    lo probe con ninja form y no funciona

  5. Avatar de Borja
    Borja

    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. Avatar de Abel Cabans

      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. Avatar de Luis

    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. Avatar de Abel Cabans

      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. Avatar de Yuhaide
        Yuhaide

        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. Avatar de omar

    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. Avatar de Williams
    Williams

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

  9. Avatar de Julio
    Julio

    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. Avatar de Claudia
    Claudia

    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. Avatar de Abel Cabans

      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. Avatar de kevin
    kevin

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

    1. Avatar de Abel Cabans

      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. Avatar de Omar

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

  12. Avatar de Carlos
    Carlos

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

    1. Avatar de Abel Cabans

      Al final de que archivo Carlos?

  13. Avatar de Angel
    Angel

    Gracias me ha salvado el dia =D

  14. Avatar de Nadia
    Nadia

    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. Avatar de Rodrigo S.

    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. Avatar de leonardo
    leonardo

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

  17. Avatar de oscar

    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. Avatar de Javi

    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. Avatar de juan11
      juan11

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

  19. Avatar de Bairon Garcia
    Bairon Garcia

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

  20. Avatar de ernesto

    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. Avatar de Omar

    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. Avatar de Alexander
    Alexander

    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. Avatar de eduardo programador

    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. Avatar de Silvio

    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. Avatar de Ivonne
      Ivonne

      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. Avatar de Luis
    Luis

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

  26. Avatar de Juan
    Juan

    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. Avatar de notiandroidsite.wordpress.com

    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. Avatar de William

    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. Avatar de Abel Cabans

      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. Avatar de Gustavo
    Gustavo

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

  30. Avatar de Sergiu
    Sergiu

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

  31. Avatar de Betsa
    Betsa

    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. Avatar de Abel Cabans

      De nada, alegra que os ayude!

  33. Avatar de Alba Zapata

    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. Avatar de jlagr

    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. Avatar de Diego
    Diego

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

  36. Avatar de Israel Vilches

    Excelente! me sirvió montones, gracias!

  37. Avatar de Joan

    Gracias Abel,

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

    Joan

  38. Avatar de Rafael

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

  39. Avatar de Leo

    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. Avatar de ivans

    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. Avatar de TarjetadePresentacion

    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. Avatar de Juan Pablo
    Juan Pablo

    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. Avatar de bio2fit
    bio2fit

    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. Avatar de Daniel
      Daniel

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

      y $phpmailer->SMTPSecure cambialo a ssl

  44. Avatar de Daniel
    Daniel

    muchas gracias por el post. me sirivio muchisimo

  45. Avatar de Manuel G.
    Manuel G.

    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