WordPress refuză să trimită email-uri, „...hostul tău poate fi dezactivat funcția mail()”
Am implementat recent o zonă de comentarii pe site-ul meu și am încercat să activez notificările prin email. Se pare că nu trimite notificări atunci când sunt adăugate comentarii noi.
Pentru a verifica dacă PHP poate trimite email-uri, am încercat să resetez parola (deoarece primești o nouă parolă prin email) și am primit mesajul:
Email-ul nu a putut fi trimis. Posibilă cauză: hostul tău poate fi dezactivat funcția mail()
Am verificat căsuțele de selectare în Setări -> Discuții, iar adresa de email este validă, deci nu este o problemă de setări. Am încercat să creez un fișier PHP și să trimit folosind mail()
, și a funcționat cu succes. Deci trebuie să fie ceva ciudat cu WordPress.
Aveți idei?
Pas cu pas: Mai întâi găsește fișierul în care apare mesajul de eroare. Eu folosesc Notepad++ și comanda CTRL + F pentru a căuta în fișiere. Este o idee bună să cauți doar primele câteva cuvinte din mesajul de eroare, deoarece unele mesaje de eroare sunt combinații din diferite mesaje.
Mesajul tău de eroare apare în wp-login.php
și, din fericire, doar acolo. Deci, hai să vedem de ce poate apărea această eroare.
if ( $message && !wp_mail($user_email, $title, $message) )
Sunt două condiții. $message
trebuie să fie adevărat (nu un șir gol, nu false, nu null, etc.). Și wp_mail()
nu ar trebui să returneze false.
Cu o linie mai sus, există un filtru $message = apply_filters('retrieve_password_message', $message, $key);
, deci este posibil ca un plugin (sau o temă) să folosească acest filtru și să returneze o valoare care nu este adevărată (șir gol, false, null, etc.).
Dar este mult mai ușor să verifici dacă wp_mail()
funcționează sau nu. Scrie un mic plugin pentru a-ți trimite un e-mail de test:
<?php
/**
* Plugin Name: Stackexchange Testplugin
* Plugin URI: http://yoda.neun12.de
* Description: Trimite-mi un e-mail de test
* 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 = 'adresa-ta-de-email@domeniu.tld';
$subject = 'E-mail de test';
$message = 'FooBarBaz E-mailul de test funcționează';
wp_mail( $to, $subject, $message );
}
(Acesta este cod PHP5.3. Dacă folosești PHP5.2, elimină elementele legate de namespace.)
Plugin-ul ar trebui să trimită un e-mail de test imediat după activare. Dacă nu, accesând unele pagini din backend (de exemplu, panoul de control) ar trebui să funcționeze.
Dacă e-mailul de test nu ajunge, atunci probabil ai o problemă cu wp_mail()
. Activează depanarea:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );
Pune acest cod în wp-config.php
și încearcă din nou să-ți trimiți un e-mail de test. Acum ar trebui să primești niște mesaje de eroare și acestea ar trebui să fie înregistrate în wp-content/debug.log
(Jurnalul de depanare poate deveni foarte mare dacă există mai multe erori cauzate de pluginuri și/sau teme).
În acest moment, ai informații clare dacă wp_mail()
eșuează și, dacă da, de ce. Dacă wp_mail()
funcționează corect și e-mailul de test a ajuns, revino la început și află de ce $message
nu este adevărat.
Dacă ai probleme cu wp_mail()
, reține că wp_mail()
nu utilizează funcția mail()
din PHP. WordPress folosește o clasă PHP (PHPMailer). Poate ai nevoie doar de un plugin pentru a folosi SMTP în loc de sendmail. Sau problema este în altă parte. Nu știm. Tu trebuie să investighezi.

Da, am încercat să mă uit în nucleu și m-a condus tot la PHPMailer, și de fapt folosește funcția mail()
din php. Cel puțin în unele cazuri (vezi linia 732 din wp-includes/class-phpmailer.php
. Nu am acces la FTP momentan, dar voi încerca sugestiile tale imediat ce pot. Cu siguranță asta mă va duce undeva. Mulțumesc mult!

Am testat wp_mail()
și pare să funcționeze bine, am primit mail-ul cum mă așteptam. WP tot nu trimitea mail-urile pentru comentarii/resetare parolă însă, și nu am primit nimic în fișierul de log (nici măcar nu a fost creat), așa că am încercat să instalez un plugin SMTP și să configurez un nou cont de email pentru Wordpress. Acum funcționează, dar încă nu înțeleg de ce nu trimitea înainte. Mulțumesc!

Acesta este un mesaj de eroare foarte enervant, deoarece ar putea fi multe lucruri, și nu dezvăluie eroarea reală (care adesea este suprimată în alte părți ale codului).
Această eroare apare atunci când funcția wp_mail()
returnează false, ceea ce la rândul său se poate întâmpla dacă phpmailer->Send()
returnează false sau ridică o excepție.
Cum să afișezi avertismentele din funcția PHP mail()
Acestea sunt în mod normal suprimate implicit, dar din păcate WordPress nu le captează niciodată. Pentru a le afișa, pur și simplu elimină semnele @
din @mail(...
în fișierul wp-includes/class-phpmailer.php
în funcția mailPassthru()
:
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);
}
Cum să identifici alte cauze posibile:
Adaugă o singură linie la sfârșitul funcției
wp_mail()
din/wp-includes/pluggable.php
:// Trimite! try { return $phpmailer->Send(); } catch ( phpmailerException $e ) { //------------- Această linie următoare este cea de adăugat ------------------- if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>'; return false; }
Acesta va afișa toate detaliile despre locul în care a fost ridicată excepția. Din păcate, uneori include acest mesaj de excepție nefolositor: "Could not instantiate mail function". Da, mulțumesc WordPress, asta chiar ajută.
Prin analizarea excepției, poți găsi numărul liniei cu eroarea și poți urmări codul pentru a identifica cauza reală.
Mult noroc. Să sperăm că WordPress va îmbunătăți gestionarea erorilor de e-mail în viitor.

Am avut aceeași problemă cu un server Ubuntu pe Amazon EC2. Am întâmpinat erori atât când foloseam link-ul de resetare a parolei, cât și cu alte notificări prin email care nu funcționau.
Iată soluția care a funcționat pentru mine. WordPress folosește funcția wp_mail()
pentru a trimite emailuri, care necesită clasa PHPMailer
, aceasta folosind un mailer PHP stocat în /usr/sbin/sendmail
.
Mai întâi, folosește această simplă funcție PHP pentru a verifica dacă mail-ul funcționează:
<?php
$to = "example@gmail.com";
$subject = "Testare Funcție Email";
$txt = "Salut lume!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";
mail($to,$subject,$txt,$headers);
?>
Dacă acest cod nu funcționează, atunci trebuie să instalezi php mailer. Folosește această comandă pentru a instala php mail pe serverul Ubuntu:
sudo apt-get install sendmail
Apoi verifică funcțiile de email din WordPress.

Dacă celelalte răspunsuri excelente de aici nu vă ajută, încercați această soluție:
Am întâmpinat aceeași problemă și nimic din sugestiile găsite pentru WordPress nu a funcționat pentru mine.
Apoi am început să investighez dacă problema era chiar instalarea PHP care avea funcția de e-mail dezactivată, dar nici asta nu a rezolvat problema. Totul părea configurat corect.
Toate aceste probleme au început pentru mine după ce am actualizat serverul la CentOS 7, care utilizează SELinux (Security Enhanced Linux), și ceea ce am învățat în ultimele săptămâni despre SELinux este că, dacă ceva nu funcționează, dar totul pare să fie în regulă... înseamnă că SELinux vă blochează în mod silențios și secret în fundal.
Și voilà.
Dacă utilizați un sistem de operare care folosește SELinux, executați următoarea comandă ca root:
setsebool -P httpd_can_sendmail=1
Există o setare de securitate care împiedică implicit serverul web să trimită e-mailuri. Când schimbați această setare și îi spuneți SELinux că este în regulă ca serverul web să trimită e-mailuri, totul începe să funcționeze brusc.

Am întâlnit această problemă astăzi; în cazul meu, situația s-a produs pentru că fișierul hosts al serverului avea același nume de domeniu ca adresa de email, care făcea referire la localhost. Înregistrarea mx indică către un alt server, dar fișierul hosts suprascrie DNS-ul, iar WordPress încerca să livreze email-ul local. Eliminarea domeniului din fișierul hosts și repornirea serviciului sendmail a rezolvat problema.

Nu știu dacă acest lucru este încă relevant pentru tine sau nu, dar deoarece nu a fost selectat niciun răspuns, am zis să încerc odată.
De fapt, am avut exact aceeași problemă când gazda mea OpenShift a încetat brusc să trimită emailuri astăzi. Cercetând codul și codex-ul, am aflat despre funcția wp_mail() și în cele din urmă Google m-a condus aici, unde am văzut cum poate fi suprascrisă.
Bazându-mă pe răspunsul lui @Ralf912, am modificat puțin scriptul astfel încât codul să folosească API-ul web al sendgrid.com pentru a trimite emailuri în locul celui implicit din WordPress (presupun):
<?php
function sendgridmail($to, $subject, $message, $headers)
{
$url = 'https://api.sendgrid.com/';
//$user = 'numeleTauDeUtilizator';
//$pass = 'parolaTa';
$params = array(
'api_user' => $user,
'api_key' => $pass,
'to' => $to,
'subject' => $subject,
'html' => '',
'text' => $message,
'from' => 'abc@hotmail.com',
);
$request = $url.'api/mail.send.json';
// Generează cererea curl
$session = curl_init($request);
// Spune curl să folosească HTTP POST
curl_setopt ($session, CURLOPT_POST, true);
// Spune curl că acesta este corpul POST-ului
curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
// Spune curl să nu returneze antete, dar să returneze răspunsul
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// obține răspunsul
$response = curl_exec($session);
curl_close($session);
// afișează totul
//print_r($response);
}
//doar pentru testare:
/*$to = 'abc@yahoo.com';
$subject = 'Email de test';
$message = 'Funcționează!!';
echo 'Destinatarul este: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Tocmai am trimis!');*/
if (!function_exists('wp_mail')) {
function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
{
// folosește biblioteca PHP GnuPG aici pentru a trimite emailuri.
sendgridmail($to, $subject, $message, $headers);
}
}
function plugin_init()
{
/* $to = 'xyz@yahoo.com';
$subject = 'Email de test';
$message = 'Funcționează în Live!';
//echo 'Destinatarul este: ' + $to;
wp_mail( $to, $subject, $message, array() );
//print_r('Tocmai am trimis!');*/
}
Și a funcționat!

Am avut aceeași eroare, ambele funcții (mail și wp_mail) au funcționat, dar tot am primit această enervantă eroare. Soluția a fost foarte simplă, dar mi-a luat câteva ore să descopăr motivul. Așadar, voi împărtăși aici soluția mea la problemă, care poate fi (sau nu) aceeași cu a ta.
Am încercat funcția mail() și a funcționat, dar când o testezi nu specifici ultimul parametru numit 'parameters' în funcția mail(). Și WP îl folosește.
@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");
Deci, practic, acest parametru ("-fexample@exmaple.com") cu flag-ul "-f" face ca funcția mail() să verifice dacă adresa de email "example@exmaple.com" este listată în lista de "email-uri de încredere".
Așadar, dacă nu este, returnează false, ceea ce face ca wp_mail() să returneze false și duce la mesajul de eroare.
Soluția este să ceri furnizorului de hosting să facă asta pentru tine, sau dacă folosești cPanel, pur și simplu adaugă un cont de email pentru această adresă și va fi automat adăugată în "lista de încredere".

Se numește -Gestionare Email-uri Înregistrate pentru Trimitere Mailuri prin Scripturi, adică (Wordpress)
- Autentifică-te în Cpanel.
- Accesează secțiunea Email > apoi dă click pe Email-uri Înregistrate.
- adaugă (wordpress@domeniultau.com) sau unde este găzduit wordpress-ul tău. adică (wordpress@blog.domeniultau.com). apoi trimite, va dura câteva minute pentru activare - așteaptă între 15 minute și 1 oră în funcție de furnizorul de hosting, apoi va funcționa.

Am avut această eroare de mult timp și am încercat multe soluții care nu au funcționat. Am o instalație personalizată de WordPress pe AWS EC2. În primul rând, asigură-te că e-mailul AWS SES este activat prin suport, acestea trebuie să fie în aceeași regiune (sau apropiată) în SES și EC2.
Am folosit Google Suite (G Suite) pentru e-mail pentru primirea/trimiterea mesajelor.
Asigură-te că e-mailul de test se trimite în AWS SES și G Suite.
Instalează pluginul WordPress WP Mail SMTP, folosește opțiunea "Other SMTP", ia credentialele SMTP de la AWS SES, aici am rămas blocat.
Trebuie să activezi caseta de selectare "SSL" pentru criptare, aceasta schimbă portul la 465 pentru mine. În cele din urmă, e-mailul meu de test a fost trimis cu succes din WordPress.

Am rezolvat această problemă schimbând adresa "From Email" în mediul meu de test local, modificând-o de la wordpress@localhost la wordpress@localhost.localdomain, folosind de exemplu un plugin WordPress precum "WP Mail SMTP" și selectând trimitorul PHP implicit în loc să folosesc SMTP.
Problema a apărut chiar și cu toate celelalte plugin-uri dezactivate și nu am avut această problemă în trecut. Problema nu este prezentă nici atunci când folosesc direct funcția PHP mail, așa că probabil s-a întâmplat din cauza unei modificări recente în WordPress.
Am trimis și am primit email-uri pe computerul meu local folosind Postfix.
