WordPress refuză să trimită email-uri, „...hostul tău poate fi dezactivat funcția mail()”

8 apr. 2013, 17:23:48
Vizualizări: 98.5K
Voturi: 12

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?

1
Comentarii

Te rog să furnizezi informații de depanare

s_ha_dum s_ha_dum
8 apr. 2013 18:12:31
Toate răspunsurile la întrebare 10
5

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.

8 apr. 2013 18:44:44
Comentarii

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!

qwerty qwerty
8 apr. 2013 20:52:27

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!

qwerty qwerty
9 apr. 2013 10:05:52

Nu primesc nicio eroare și nici măcar mail

baldraider baldraider
19 aug. 2017 10:29:36

Unde să salvezi plugin-ul tău?

Black Black
4 nov. 2021 11:19:11

După cum poți vedea, răspunsul are aproximativ 8 ani. Nu am mai lucrat cu WordPress de mai mult de 5 ani. După cum îmi amintesc, în directorul wp-plugins, ca de obicei. Dar poate lucrurile s-au schimbat în ultimii 5 ani.

Ralf912 Ralf912
4 nov. 2021 15:30:13
0

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:

  1. 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;
    }
    
  2. 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ă.

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

11 dec. 2014 02:08:19
1

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.

3 mai 2017 09:34:57
Comentarii

acest răspuns este cel pe care oricine ar trebui să-l încerce înaintea oricăror alte răspunsuri, aceasta este calea corectă

hatenine hatenine
25 ian. 2019 14:53:34
0

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.

4 feb. 2017 21:24:09
0

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.

16 ian. 2014 21:15:23
0

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!

30 mai 2014 20:04:20
0

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

23 aug. 2016 15:16:43
0

Se numește -Gestionare Email-uri Înregistrate pentru Trimitere Mailuri prin Scripturi, adică (Wordpress)

  1. Autentifică-te în Cpanel.
  2. Accesează secțiunea Email > apoi dă click pe Email-uri Înregistrate.
  3. 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.
31 mai 2019 20:03:57
0

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.

14 dec. 2019 17:16:51
0

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.

26 feb. 2021 14:14:59