WordPress se niega a enviar correo, "... su anfitrión puede haber desactivado la función mail ()"
-
-
Proporcione [información de depuración] (http://codex.wordpress.org/Debugging_in_WordPress)Please provide [debugging information](http://codex.wordpress.org/Debugging_in_WordPress)
- 0
- 2013-04-08
- s_ha_dum
-
9 respuestas
- votos
-
- 2013-04-08
Paso apaso: Primerobusqueel archivo donde apareceelmensaje deerror. Utilizo Notepad ++ yel comando CTRL + F parabuscar archivos. Es unabuenaideabuscar solo lasprimeraspalabras delmensaje deerror,porque algunosmensajes deerror se combinan con diferentesmensajes.
Sumensaje deerror apareceen
wp-login.php
y santa suerte,solo allí. Entonces,echemos un vistazo apor quépodría ocurriresteerror.if ( $message && !wp_mail($user_email, $title, $message) )
Hay dos condiciones.
$message
tiene que ser verdadero (no una cadena vacía,nofalso,nonulo,etc.). Ywp_mail()
no debería devolverfalso.Una línea arriba,hay unfiltro
$message = apply_filters('retrieve_password_message', $message, $key);
,por lo queesposible que un complemento (otema) useestefiltro y devuelve un valor quenoes verdadero (cadena vacía,falso,nulo,etc.).Peroesmuchomásfácil comprobar si
wp_mail()
estáfuncionando ono. Escribe unpequeño complementoparaenviarte un correo deprueba ati mismo:<?php /** * Plugin Name: Stackexchange Testplugin * Plugin URI: http://yoda.neun12.de * Description: Send me a test email * Version: 0.1 * Author: Ralf Albert * Author URI: http://yoda.neun12.de * Text Domain: * Domain Path: * Network: * License: GPLv3 */ namespace WordPressStackexchange; add_action( 'init', __NAMESPACE__ . '\plugin_init' ); function plugin_init(){ $to = '[email protected]'; $subject = 'Testemail'; $message = 'FooBarBaz Testmail is working'; wp_mail( $to, $subject, $message ); }
(Esteesel código PHP5.3. Siestáejecutando PHP5.2,elimine las cosas delespacio denombres)
El complemento debeenviar un correo depruebainmediatamente después de la activación. De lo contrario,debería hacerlo al llamar a algunaspáginas deback-end (porejemplo,elpanel).
Siel correo depruebano llega,probablementetenga unproblema con
wp_mail()
. Así que activa la depuración:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors',1 );
Poneste códigoen tu
wp-config.php
y vuelve aintentarenviarte un correo deprueba. Ahora debería recibir algunosmensajes deerror ytambién deberían registrarseenwp-content/debug.log
(el registro de depuraciónpuede crecermucho si haymáserrores causados por complementos y/otemas).Enestepunto,tiene buenainformación si
wp_mail()
falla y,de ser así,por qué. Siwp_mail()
funciona correctamente y llegóel correo deprueba,regrese alprincipio y descubrapor qué$message
noes verdadero.Sitiene problemas con
wp_mail()
,tengaen cuenta quewp_mail()
no utiliza lafunciónmail()
de PHP. WordPress usa una clase PHP ( PHPMailer ). Tal vez solonecesite un complementopara usar SMTP en lugar de sendmail. Oelproblema seencuentraen otro lugar. No lo sabemos. Tienes queinvestigar.Step by step: First find the file where the error message appear. I use Notepad++ and the CTRL + F command to search in files. It is a good idea to search only the first few words of the error message, because some error messages are combined of different messages.
Your error message appear in
wp-login.php
and holy luck, only there. So let's have a look why this error could occur.if ( $message && !wp_mail($user_email, $title, $message) )
There are two conditions.
$message
have to be true (not an empty string, not false, not null, etc). Andwp_mail()
shouldn't return false.One line above, there is a filter
$message = apply_filters('retrieve_password_message', $message, $key);
, so it is possible that a plugin (or theme) use this filter and returns a value that is not true (empty string, false, null, etc.).But it is much easier to check if
wp_mail()
is working or not. Write a small plugin to send a test mail to yourself:<?php /** * Plugin Name: Stackexchange Testplugin * Plugin URI: http://yoda.neun12.de * Description: Send me a test email * Version: 0.1 * Author: Ralf Albert * Author URI: http://yoda.neun12.de * Text Domain: * Domain Path: * Network: * License: GPLv3 */ namespace WordPressStackexchange; add_action( 'init', __NAMESPACE__ . '\plugin_init' ); function plugin_init(){ $to = '[email protected]'; $subject = 'Testemail'; $message = 'FooBarBaz Testmail is working'; wp_mail( $to, $subject, $message ); }
(This is PHP5.3 code. If you are running PHP5.2, remove the namespace things)
The plugin should send a testmail immediately after activation. If not, calling some backend pages (e.g. dashboard) should do it.
If the testmail does not arrive, then you probably have an issue with
wp_mail()
. So turn on debugging:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors',1 );
Put this code into your
wp-config.php
and retry sending yourself a testmail. Now you should get some error messages and they also should be logged intowp-content/debug.log
(The debug log can grow very large if there are more errors caused by plugins and/or themes).At this point, you got good informations if
wp_mail()
fails and if so, why. Ifwp_mail()
work correctly and the testmail arrived, go back to top and find out why$message
is not true.If you have issues with
wp_mail()
, so keep in mind thatwp_mail()
does not use PHPsmail()
function. WordPress use a PHP class (PHPMailer). Maybe you just need a plugin to use SMTP instead of sendmail. Or the problem is located at another place. We don't know. You have to investigate.-
Sí,intentéindagaren elnúcleo ytambiénme llevó a PHPMailer,yen realidad * sí * usaphp's `mail ()`.Almenosen algunos casos (vea la línea 732en `wp-includes/class-phpmailer.php`. Notengo acceso alftp atmperointentaré sus sugerenciastanpronto comopueda. Seguramenteesto debe llevarme a algunaparte. ¡Muchasgracias!Yeah i tried digging into the core and it also lead me to PHPMailer, and it actually *does* use php's `mail()`. At least in some cases (see line 732 in `wp-includes/class-phpmailer.php`. I don't have access to the ftp atm but i will try your suggestions as soon as i can. Surely this must lead me somewhere. Thanks a lot!
- 0
- 2013-04-08
- qwerty
-
Probé `wp_mail ()` yparecefuncionarbien,recibíel correo comoesperaba.Sinembargo,WP aúnnoenviaba los correoselectrónicos de comentarios/restablecimiento de contraseña,yno obtuvenadaen el archivo de registro (no se creó),así queintentéinstalar un complemento de correo SMTP y configurar unanueva cuenta de correoelectrónicoparaWordpress.Funciona ahora,perotodavíanoentiendopor quéno sepodíaenviar antes.¡Gracias!I tested `wp_mail()` and it seems to work fine, i received the mail as expected. WP still wouldn't send the comment/password-reset emails though, and i didn't get anything in the log file (it wasn't created), so i tried installing an SMTP mail plugin and set up a new email account for Wordpress. It works now but i still don't understand why it couldn't send before. Thanks!
- 0
- 2013-04-09
- qwerty
-
No reciboningúnerror yni siquiera correoI'm not getting any error and even not mail
- 0
- 2017-08-19
- baldraider
-
- 2014-12-11
Estees unmensaje deerror súpermolesto,ya quepodría ser muchas cosas,yno revelaelerror real (que amenudo se silenciaen otraspartes del código).
Esteerror aparece cuando lafunción
wp_mail ()
devuelvefalso,lo que a su vezpodría suceder siphpmailer- > Send ()
devuelvefalso ogenera unaexcepción.
Cómomostrar advertencias de lafunción
mail ()
de PHPEstosnormalmenteestán silenciadospor defecto,pero desafortunadamente WordPressnunca los captura. Paramostrarlos,simplementeelimine los signos
@
de@mail (...
enwp-includes/class-phpmailer.php
en < código>mailPassthru () función:if (ini_get ('safe_mode')||! ($this- > UseSendmailOptions)) { $ rt=@mail ($para,$this- >encodeHeader ($this- > secureHeader ($ asunto)),$ cuerpo,$encabezado); }más { $ rt=@mail ($para,$this- >encodeHeader ($this- > secureHeader ($ asunto)),$ cuerpo,$encabezado,$params); }
Cómobuscar otrasposibles causas:
-
Agregue una sola línea alfinal de
wp_mail ()
en/wp-includes/pluggable.php
://¡Enviar! tratar { return $phpmailer- > Send (); } captura (phpmailerException $e) { //------------- Esta siguiente líneaes la que se debe agregar ------------------- si (WP_DEBUG)echo '& lt;pre >' .esc_html (print_r ($e,VERDADERO)). '& lt;/pre >'; falso retorno; }
-
Volcarátodos los detalles de dónde segeneró laexcepción. Desafortunadamente,a vecesincluyeestemensaje deexcepcióninútil: " No sepudoinstanciar lafunción de correo ". Sí,gracias WordPress,esoes realmente útil.
-
Almirar laexcepción,puedeencontrarelnúmero de línea delerror y,con suerte,puede rastrearlo através del códigoparaencontrar la causa real.
Buena suerte. Con suerte,WordPressmejoraelmanejo deerrores de correoelectrónicoen algúnmomentoen elfuturo.
This is a super annoying error message as it could be many things, and it doesn't reveal the actual error (which is often silenced in other parts of the code).
This error appears when the
wp_mail()
function returns false, which in turn could happen ifphpmailer->Send()
returns false or raises an exception.How to display warnings from PHP's
mail()
functionThese are normally silenced by default, but unfortunately WordPress never captures them. To show them, simply remove the
@
signs from@mail(...
inwp-includes/class-phpmailer.php
in themailPassthru()
function:if (ini_get('safe_mode') || !($this->UseSendmailOptions)) { $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header); } else { $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params); }
How to hunt down other possible causes:
Add a single line to the bottom of
wp_mail()
in/wp-includes/pluggable.php
:// Send! try { return $phpmailer->Send(); } catch ( phpmailerException $e ) { //------------- This next line is the one to add ------------------- if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>'; return false; }
It will dump the full details of where the exception was raised. Unfortunately it sometimes includes this unhelpful exception message: "Could not instantiate mail function". Yeah thanks WordPress, that's real helpful.
By looking at the exception you can find the line number of the error, and can hopefully trace it back through the code to find the real cause.
Good luck. Hopefully WordPress improves email error handling at some point in the future.
-
- 2017-05-03
Tengoelmismoproblema conel servidor Ubuntuen Amazon EC2. Tengo unproblema al usarelenlace de restablecimiento de contraseña ytambién otro correoelectrónico denotificaciónnofuncionaba.
Así que aquí hay soluciones quefuncionaronparamí: Word-press usó lafunción
wp_mail()
paraenviar correoelectrónico quenecesita la clasePHPMailer
que usóphpmailer almacenadoen/usr/sbin/sendmail
.Utiliceesta sencillafunciónphpprimeropara comprobarel correophp
<?php $to = "[email protected]"; $subject = "Test Email Function"; $txt = "Hello world!"; $headers = "From: [email protected]" . "\r\n" . "CC: [email protected]"; mail($to,$subject,$txt,$headers); ?>
Siestonofunciona,entoncesnecesitainstalarphpmailer. Utiliceeste comandoparainstalarphpmailen el servidor Ubuntu.
sudo apt-get install sendmail
Luego,revise lasfunciones de correoelectrónicoparapresionarpalabras.
I has same issue with Ubuntu server on Amazon EC2.I get issue while using reset password link and also other notification email were not working.
So here is solutions which worked for me.Word-press used
wp_mail()
function to send email which needPHPMailer
class which used php mailer stored in/usr/sbin/sendmail
.Use this simple php function first to check php mail
<?php $to = "[email protected]"; $subject = "Test Email Function"; $txt = "Hello world!"; $headers = "From: [email protected]" . "\r\n" . "CC: [email protected]"; mail($to,$subject,$txt,$headers); ?>
If this is not working then you need to install php mailer. Use this command to install php mail on Ubuntu server.
sudo apt-get install sendmail
Then check word-press email functions.
-
esta respuestaes la que cualquiera deberíaprobar antes que cualquier otra respuesta,esteesel camino a seguirthis answer is the one anyone should try before any other answers, this is the way to go
- 0
- 2019-01-25
- hatenine
-
- 2017-02-04
Si las otrasexcelentes respuestas aquíno ayudan,intente esto:
Encontréestemismoproblema ynada de lo quepudeencontraren ninguna de las sugerenciaspara WordPressme lo resolvió.
Luego comencé ainvestigar siera lapropiainstalación de PHP la que había desactivado lafunción de correo,peronada deesofuncionó. Todoparecíaestar configurado correctamente.
Todosestosproblemas comenzaronparamí una vez que actualicémi servidor a CentOS 7,que usa SELinux (Security Enhanced Linux) y lo que he aprendidoen las últimas semanas con SELinuxes que si algonofunciona,perotodoparece que deberíaestarfuncionando ...eso significa que SELinuxte estábloqueando silenciosa y secretamenteen segundoplano.
Y viola.
Siestáejecutando un sistema operativo que usa SELinux,simplementeejecuteel siguiente comando como root:
setsebool -P httpd_can_sendmail=1
Existe una configuración de seguridad queimpide deformainherente queel servidor webenvíe correoelectrónico. Cuando accionaeseinterruptor y le dice a SELinux queestábien queel servidor webenvíe correoelectrónico,todofunciona de repente.
If the other great answers here don't help, try this:
I encountered this same problem and nothing I could find in any of the suggestions for WordPress solved it for me.
Then I started investigating if it was the PHP installation itself that had disabled the mail function, but none of that worked either. Everything looked like it was configured properly.
All of these problems started for me once I upgraded my server to CentOS 7 which uses SELinux (Security Enhanced Linux) and what I've learned in the last couple of weeks with SELinux is that if something isn't working, but everything looks like it should be working... that means SELinux is silently and secretly blocking you in the background.
And viola.
If you are running and OS that uses SELinux, just execute the following command as root:
setsebool -P httpd_can_sendmail=1
There is a security setting that inherently prevents the webserver from sending email. When you flip that switch and tell SELinux it's ok for the webserver to send email, everything suddenly works.
-
- 2014-01-16
Meencontré conesto hoy;enmi caso,la situación ocurrióporqueel archivo de hosts del servidortiene elmismonombre de dominio que la dirección de correoelectrónico,apuntando a localhost.El registromx apunta a un servidor diferente,peroel archivo de hosts anulael DNS y WPestátratando deentregarel correoelectrónico localmente.Eliminarel dominio del archivo de hosts y reiniciar sendmail resolvióesteproblema.
I ran into this today; in my case the situation happened because the server's hosts file has the same domain name of the email address, pointing to localhost. The mx record points to a different server, but the hosts file is overriding DNS and WP is trying to deliver the email locally. Removing the domain from the hosts file and restarting sendmail resolved this issue.
-
- 2014-05-30
No sé siesto sigue siendo relevanteparati ono,pero comono hay una respuestaelegida,penséen dejarmeintentarlo una vez.
En realidad,me habíaenfrentadoexactamente almismoproblema desde quemi host openshift cedió repentinamente hoy y dejó deenviar correos. Buscandoen el código yel códice,llegué a conocer lafunción wp_mail () yfinalmente Googleme llevó aquí y vi cómo sepodía anular.
Basándomeen la respuesta de @ Ralf912,modifiqué unpocoel scriptpara queel código use la API web de sendgrid.comparaenviar correosen lugar delpredeterminado de wordpress (que supongo:
<?php function sendgridmail($to, $subject, $message, $headers) { $url = 'https://api.sendgrid.com/'; //$user = 'yourUsername'; //$pass = 'yourPassword'; $params = array( 'api_user' => $user, 'api_key' => $pass, 'to' => $to, 'subject' => $subject, 'html' => '', 'text' => $message, 'from' => '[email protected]', ); $request = $url.'api/mail.send.json'; // Generate curl request $session = curl_init($request); // Tell curl to use HTTP POST curl_setopt ($session, CURLOPT_POST, true); // Tell curl that this is the body of the POST curl_setopt ($session, CURLOPT_POSTFIELDS, $params); // Tell curl not to return headers, but do return the response curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // obtain response $response = curl_exec($session); curl_close($session); // print everything out //print_r($response); } //only for testing: /*$to = '[email protected]'; $subject = 'Testemail'; $message = 'It works!!'; echo 'To is: ' + $to; #wp_mail( $to, $subject, $message, array() ); sendgridmail($to, $subject, $message, $headers); print_r('Just sent!');*/ if (!function_exists('wp_mail')) { function wp_mail($to, $subject, $message, $headers = '', $attachments = array()) { // use the PHP GnuPG library here to send mail. sendgridmail($to, $subject, $message, $headers); } } function plugin_init() { /* $to = '[email protected]'; $subject = 'Testemail'; $message = 'It works Live!'; //echo 'To is: ' + $to; wp_mail( $to, $subject, $message, array() ); //print_r('Just sent!');*/ }
¡Yfuncionó!
I don't know whether this is still relevant to you or not, but since there is no answer chosen, I thought let me give it a try once.
Actually, I had faced the exact same problem since my openshift host all of a suddenly gave way today and stopped sending mails. Digging through the code and codex, I came to know about the wp_mail() function and finally google led me here and I saw how it could be overridden.
Building on @Ralf912's answer, I modified the script a bit so that the code uses sendgrid.com's web api to send mails instead of wordpress default one (that I presume :
<?php function sendgridmail($to, $subject, $message, $headers) { $url = 'https://api.sendgrid.com/'; //$user = 'yourUsername'; //$pass = 'yourPassword'; $params = array( 'api_user' => $user, 'api_key' => $pass, 'to' => $to, 'subject' => $subject, 'html' => '', 'text' => $message, 'from' => '[email protected]', ); $request = $url.'api/mail.send.json'; // Generate curl request $session = curl_init($request); // Tell curl to use HTTP POST curl_setopt ($session, CURLOPT_POST, true); // Tell curl that this is the body of the POST curl_setopt ($session, CURLOPT_POSTFIELDS, $params); // Tell curl not to return headers, but do return the response curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // obtain response $response = curl_exec($session); curl_close($session); // print everything out //print_r($response); } //only for testing: /*$to = '[email protected]'; $subject = 'Testemail'; $message = 'It works!!'; echo 'To is: ' + $to; #wp_mail( $to, $subject, $message, array() ); sendgridmail($to, $subject, $message, $headers); print_r('Just sent!');*/ if (!function_exists('wp_mail')) { function wp_mail($to, $subject, $message, $headers = '', $attachments = array()) { // use the PHP GnuPG library here to send mail. sendgridmail($to, $subject, $message, $headers); } } function plugin_init() { /* $to = '[email protected]'; $subject = 'Testemail'; $message = 'It works Live!'; //echo 'To is: ' + $to; wp_mail( $to, $subject, $message, array() ); //print_r('Just sent!');*/ }
And it worked!
-
- 2016-08-23
Tuveelmismoerror,ambasfunciones (correo y wp_mail)funcionaron,perotodavíateníaestemolestoerror. La soluciónfuemuyfácil,perome tomó algunas horasencontrar la razón. Así que compartiré aquími solución sobreelproblema quepodría ser (ono)elmismo coneltuyo.
Probé lafunciónmail () yfuncionó,pero cuando lapruebasnoespecificasteel últimoparámetro llamado 'parámetros'en lafunciónmail (). Y WP lo usa.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
Entonces,básicamente,esteparámetro ("[email protected]") conelindicador "-f" hace que lafunciónmail () verifique si la dirección de correoelectrónico "[email protected]" apareceen la lista de "correoselectrónicos de confianza" .
Entonces,sino lo hace,devuelvefalso,lo que hace que wp_mail () devuelvafalso y lleve almensaje deerror.
Entonces,la soluciónespedirle alproveedor de servicios de hosting que hagaestopor usted,o siestá usando cPanel,simplemente agregue una cuenta de correoelectrónicoparaesta dirección y automáticamente la agregará a la "lista de confianza".
I had the same error, both functions(mail and wp_mail) worked, but I still had this annoying error. The fix was very easy, but it took me few hours to find the reason. So I will share here my solution on the problem which might be (or might not) the same with yours.
I tried mail() function and it worked, but when you test it you don't specify the last parameter called 'parameters' in mail() function. And WP does use it.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
So, basically, this parameter ("[email protected]") with flag "-f" makes mail() function check if the email address "[email protected]" listed in the "trusted emails" list.
So if it doesn't, it returns false, which makes wp_mail() returns false and leads to the error message.
So, solution is to ask hoster to do this for you, or if you are using cPanel, just add email account for this address and it will automatically will add it into the "trusted list".
-
- 2019-05-31
Se llamó -Administrar ID de correoelectrónico registradosparaenviar correos através de scripts,es decir,(Wordpress)
- Inicie sesiónen su Cpanel.
- Vaya a la sección Correoelectrónico> luego haga clicen ID de correoelectrónico registrados.
- luego agregue ([email protected]) o donde se alojó su wordpress.es decir ([email protected]).luegoenvíe,toma unosminutospara activarespere 15minutos a 1 hora dependiendo de suproveedor de alojamiento,entoncesfuncionará.
it called -Manage Registered Email-Ids For Sending Mails via Scripts ie.(Wordpress)
- Login your Cpanel.
- Go to Email Section > then Click Registered Email IDs.
- then add ([email protected]) or where your wordpress hosted. ie ([email protected]) . then submit, it takes few minute to activate wait 15minute to 1 hour depending to your hosting provider, then it will work.
-
- 2019-12-14
Tuveesteerror durantemuchotiempo yprobémuchas soluciones quenofuncionaron.Tengo unainstalaciónpersonalizada de Wordpressen AWS EC2.Enprimer lugar,asegúrese de que su correo de AWS SESesté habilitado através del soporte,debenestaren lamisma región (o cercana)en SES y EC2. Usé la suite de Google (gsuite)parael correoelectrónicopara recibir/enviar correo.
Asegúrese de queel correoelectrónico deprueba seenvíeen AWS SES y Gsuite.
Instaleel complemento de Wordpress WP Mail SMTP,use la opción "Otro SMTP",obtenga sus credenciales SMTP de AWS SES,aquíes dondeme quedé atascado.
Debe habilitar la casilla de verificación "SSL"parael cifrado,esto cambiaelpuerto a 465paramí.Porfin miprueba de correoelectrónico seenvió correctamente desde Worpdress.
I had this error for ages and tried so many solutions that didn't work. I have a custom Wordpress install on AWS EC2. First off ensure your AWS SES mail is enabled through support, they must be in the same (or close) region in SES and EC2. I used Google suite(gsuite) for email for receiving/sending mail.
Make sure the test email sends in AWS SES and Gsuite.
Install the Wordpress plugin WP Mail SMTP, use the option "Other SMTP", grab your SMTP credentials from AWS SES, this is where I got stuck.
You must enable the tick box "SSL" for Encryption, this changes the port to 465 for me. At last my email test sent from Worpdress successfully.
Recientementeimplementé un área de comentariosen mi sitio webe intenté quefuncionara lanotificaciónpor correoelectrónico.Noparece quererenviarnotificacionespor correoelectrónico cuando se hacennuevos comentarios.
Solopara ver si PHPpuedeenviar correoselectrónicos,intenté restablecer la contraseña (porque recibirá unanueva contraseñapor correo) y recibíelmensaje:
Hemarcado las casillas de verificaciónen Configuración -> Discusión,yel correoelectrónicoes válido,por lo quenoes unproblema de configuración.Intenté crear un archivo PHP yenviarlo usando
mail()
,y seenvió correctamente.Así que debe haber algoextraño con WordPress.¿Algunaidea?